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

时间:2014-09-29 14:49:10

标签: 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 - 失败了。

1 个答案:

答案 0 :(得分:3)

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

缩放到数组元素的大小:

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

或者,如果您确定array不是指针(根据您的代码段),请执行以下操作:

memset(array, 0, sizeof array);

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

BOOL array[ELEMENTS] = {0};