几天前我问了一个关于缓冲区溢出检测的问题(sprintf buffer global data overflow - how to detect it, Windows),这个问题只能通过标准功能的 cppcheck 解决(不是安全的 _s 版本)。
我更深入地修改了代码
#include <stdio.h>
char buffer[2];
void main()
{
sprintf(buffer,"12345");
}
到
#include <stdio.h>
void f( char *b )
{
sprintf(b,"12345");
}
char buffer[2];
void main()
{
f( buffer );
}
Visual Studio 2012/RTC 可以处理堆栈分配的缓冲区溢出 - 在运行时,但全局数据未被检测到。
我猜无法使用 cppcheck 进行深入分析,并且 cppcheck-1.64 未检测到此问题。此外,我还尝试将 clang 与 AddressSanitizer ( Windows ) 一起使用,但效果不佳。
是否有可能在 Windows 下防止此类问题(最好是免费工具),如果不能,也许某些 linux 工具可以提供帮助?
最佳答案
我知道答案有点晚了,但在类似情况下它仍然可以提供帮助。
Cppcheck 不断改进,现在能够检测到这个问题。
最新版本的 Cppcheck(目前是 1.86 版本)在分析第二个代码示例时输出此错误消息:
$ ./cppcheck global_buffer_overflow.c
Checking global_buffer_overflow.c ...
[global_buffer_overflow.c:10] -> [global_buffer_overflow.c:4]: (error) Buffer is accessed out of bounds: buffer
我不确定它是否已经在 1.85 版本中工作,但它肯定不适用于 1.84 或更早的版本。 我想如果你隐藏全局缓冲区更好,Cppcheck 最终将不再能够检测到问题。值(value)流分析有些复杂,需要一些资源(内存、时间、CPU)。
关于c - 全局缓冲区溢出,Windows 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759451/