【发布时间】:2020-01-27 22:27:55
【问题描述】:
我有下面的代码。运行cppcheck工具后报错Buffer is access out of bounds?用snprintf在线报错。
#include <stdio.h>
int main(int argc, char * argv[])
{
if (argc > 1) {
char testref[8] = "";
snprintf(testref, sizeof(testref), "Ref:%s", argv[1]);
printf("===>testref=%s\n", testref);
}
}
命令行交互下方:
amin@ubuntu:$ gcc test.c -o test
amin@ubuntu:$
amin@ubuntu:$ ./test hello_world
===>testref=Ref:hel
amin@ubuntu:$ cppcheck test.c
Checking test.c...
[test.c:7]: (error) Buffer is accessed out of bounds.
amin@ubuntu:$
cppcheck 报告这个错误是否正确?
【问题讨论】:
-
argv[1]中的值如果长度超过 3 个字节,将被截断,但代码没有我能看到的其他问题。错误报告可能是合适的——或者,至少,在cppcheck中询问为什么它不是错误。 -
您使用的是哪个版本的 cppcheck?使用 Cppcheck 1.82 我没有收到任何错误代码。
-
如果
snprintf()返回 -1,那么printf("===>testref=%s\n", testref);不是是件好事。为了完整性。按照@wildplasser 的建议报告snprintf()的返回值 -
@wildplasser,手册页确实非常有用,但您认为这对解决这个特定问题有何帮助? (如果您认为自己有解决方案,请考虑发布答案。)
-
@wildplasser,我已经搜索了有关此的文档,但找不到。当前的手册页指的是 AFAIK 不会发生缓冲区溢出的“正确”行为。在最初的 ANSI 标准中,snprintf() 函数不存在。我将不胜感激您提到的功能的参考。这确实可以解释观察到的问题。