使用gdb一步一步检查sprintf()函数

时间:2014-08-29 06:59:48

标签: c printf overlap

我在C中有一个程序如下:

char str[50] = {0};
int a = 15;
sprintf(str, "%d", a);
printf("%s\n", str);

它可以得到正确的结果 - 15.但是如果我使用gdb逐步检查sprintf()函数,“sprintf.c:没有这样的文件或目录。”显示然后它被杀死。为什么会这样?实际上,我在另一个项目中使用了sprintf()函数,现在它发生了重叠。我怀疑使用sprintf()函数是否有任何危险?我怎么能避免它?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以使用sprintf(但要注意,它不安全,过时,应该使用snprintf,例如snprintf(str, sizeof(str), "%d", a);。< / p>

就是这样,因为你的libc没有使用调试信息编译,你不能单步执行 sprintf的执行(除了踩单个机器说明)。

sprintf的危险是众所周知的,它可以成为buffer overflow。这就是为什么你不应该使用它并使用snprintf代替(或者,如果你的平台有它,你想要一个动态分配的字符串,asprintf(3),它在大多数Linux系统上都可用)。

顺便说一句,Linux手册页sprintf(3)明确地说:

   Because sprintf() and vsprintf() assume an arbitrarily long string,
   callers must be careful not to overflow the actual space; this is
   often impossible to assure.  Note that the length of the strings
   produced is locale-dependent and difficult to predict.  Use
   snprintf() and vsnprintf() instead (or asprintf(3) and vasprintf(3)).

有时考虑snprintf的结果非常有用(这是计算字符串实际需要的字节数,可能大于对结果强制执行的给定大小限制)。 / p>