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