c - memset 导致数组下溢,如何检测

标签 c static-analysis

最近我注意到这种错误:

#define ELEMENTS 20
BOOL array[ELEMENTS];

void foo()
{
memset(array,0, ELEMENTS); /* BOOL isn't 1 byte but 4 bytes long */
}

如何检测 memset 下溢?大多数静态、动态分析器只能发现溢出。 PVSStudio 就是其中之一。 http://www.viva64.com/en/d/0101/print/ .

有任何免费/开源的替代方案(最好是 Windows,但 Linux 也可以)? Visual Studio 2012 分析 - 失败。 Clang 分析器 - 失败。 Cppcheck - 失败。

最佳答案

如果没有像 Valgrind 这样的外部工具,您就无法检测到这一点,但您可以避免检测它。

缩放到数组元素的大小:

memset(array, 0, ELEMENTS * sizeof array[0]);

或者,如果您可以确保 array 不是指针(根据您的代码片段),只需执行以下操作:

memset(array, 0, sizeof array);

避免这种情况的最简单方法是在定义时初始化所有变量:

BOOL array[ELEMENTS] = {0};

关于c - memset 导致数组下溢,如何检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26102671/

相关文章:

c++ - 如何计算C++项目中函数的数量?

c++ - 在原生c++中查找直接或间接使用特定方法的所有方法

java - 按排名排列的 FindBugs 2.0 错误列表?

c - fork() 和 execvp()

有人可以为上面的c程序编写汇编代码并将其转换为小于100字节的机器代码吗?

c - 笑脸的 DOS 字符?

c - Coccinelle 中的指针问题

c - 为什么即使 s 更小,以下代码也打印 "S is Bigger"?

c++ - 通过 C 中的指针从 R 中的 big.matrix 访问一 block 内存

ruby-on-rails - 如何检查整个 Rails 项目的编译错误