是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即,char[1234]
而不是malloc(1234)
)?
我昨天大部分时间都在追踪崩溃和奇怪的行为,最终结果证明是由以下行引起的:
// ensure string is nul terminated due to stupid snprintf
error_msg[error_msg_len] = '\0';
该索引显然导致超出数组范围的写入。这会导致指针变量的破坏,从而导致该指针稍后出现意外行为。
可以帮助缓解此类问题的三件事是:
代码审查
这还没有完成,但我正在努力。
valgrind
我在开发过程中经常使用 valgrind 来检测内存问题,但它不处理静态数组。在上面的例子中,它只向我展示了诸如
free()
被破坏的指针无效之类的症状。-fstack-protector-all
在过去,我曾经
-fstack-protector-all
检测过像上面这样的溢出,但出于某种奇怪的原因,它在这种情况下没有标记任何东西。
那么任何人都可以就我如何识别这种超支提供任何想法吗?通过改进上述列表或全新的东西。
编辑:到目前为止,一些答案提到了相当昂贵的商业产品。在这个阶段,我认为我无法说服购买这种工具的权力,所以我想将工具限制为便宜/免费。是的,你得到你所支付的,但有一些改进总比没有好。