gpt4 book ai didi

c - 使用gdb逐步检查sprintf()函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:51 25 4
gpt4 key购买 nike

我有一个 C 程序如下:

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

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

提前致谢!

最佳答案

您可以使用 sprintf(但请注意,它已过时且不安全,您应该使用 snprintf ,例如 snprintf(str, sizeof(str ), "%d", a); 在你的情况下)。

只是因为您的 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 的结果非常有用(这是计算字符串实际需要的字节数,它可能大于对结果强制执行的给定大小限制).

关于c - 使用gdb逐步检查sprintf()函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com