c - 全局缓冲区溢出,Windows 环境

标签 c windows debugging static-analysis cppcheck

几天前我问了一个关于缓冲区溢出检测的问题(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/

相关文章:

c - 通过套接字发送结构

c++ - 使用 qt creator 进行 jit 调试 (Windows)

php - 引用 - 这个错误在 PHP 中意味着什么?

windows - 在批处理脚本中创建文件夹并忽略它是否存在

c++ - Totalview获取QString的值

c - 为什么 C 中函数的大小总是 1 个字节?

c - C语言中的线程定时器

c - 反转字符串 - 输出跳过最后一个字符

windows - 如何从 SQLCMD 输出中删除空白

c++ - Windows.h 线程关联