2014-08-29 40 views
1

我在C程序为如下:用gdb检查的sprintf()函数步步

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

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

在此先感谢!

回答

1

您可以使用sprintf(但要注意,它是不安全的如此过时了,你应该使用snprintf,例如你的情况snprintf(str, sizeof(str), "%d", a);)。

,就是这样,因为你的libc没有编译带有调试信息,你不能步内sprintf执行(除个别步进机说明上)。

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

BTW 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结果(这实际上是需要计算的字符串的字节数有时是相当有用的,这可能大于对结果执行的给定大小限制)。