最近我注意到了这种错误:
#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 - 失败了。
答案 0 :(得分:3)
如果没有像Valgrind这样的外部工具,您无法检测到这一点,但您可以避免检测它。
缩放到数组元素的大小:
memset(array, 0, ELEMENTS * sizeof array[0]);
或者,如果您确定array
不是指针(根据您的代码段),请执行以下操作:
memset(array, 0, sizeof array);
避免这种情况的最简单方法是在定义中初始化所有变量:
BOOL array[ELEMENTS] = {0};