我在C中有一个程序如下:
char str[50] = {0};
int a = 15;
sprintf(str, "%d", a);
printf("%s\n", str);
它可以得到正确的结果 - 15.但是如果我使用gdb逐步检查sprintf()函数,“sprintf.c:没有这样的文件或目录。”显示然后它被杀死。为什么会这样?实际上,我在另一个项目中使用了sprintf()函数,现在它发生了重叠。我怀疑使用sprintf()函数是否有任何危险?我怎么能避免它?
提前致谢!
答案 0 :(得分:1)
您可以使用sprintf
(但要注意,它不安全,过时,应该使用snprintf,例如snprintf(str, sizeof(str), "%d", a);
。< / p>
就是这样,因为你的libc没有使用调试信息编译,你不能单步执行1> 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>