最近我注意到这种错误:
#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/