对缓冲区大小施加限制

时间:2011-01-17 13:55:19

标签: c buffer-overflow

是否有any方式我可以对字符缓冲区强加一个大小约束,这样缓冲区上的任何操作都不会导致越界访问?

4 个答案:

答案 0 :(得分:3)

简而言之:否

C不执行任何运行时检查,除非您手动执行。

您可以使用自己的函数,宏和每缓冲区簿记来防止无效访问。但是,您必须使用此接口无处不在,这意味着您将无法直接访问该缓冲区。

由于额外的条件检查,您还会看到对性能的影响。您可以通过在证明不会导致越界访问的代码分支上使用直接访问来避免其中的一些。

编辑:

还有一个相当重要的问题:“一旦检测到无效访问,代码应该做什么”。您的程序是否应输出错误并退出,就像它遇到其他语言的异常一样?它应该忽略错误吗?它应该试图解决它吗?

处理此问题的C方法是先行一步,确保每个代码分支/部分事先都是安全的,而不是检查每次访问。

答案 1 :(得分:1)

这可能有助于:http://duma.sourceforge.net/在你的任务中。

答案 2 :(得分:1)

答案简短:不。

答案很长:
为了确保即使像buffer[ULLONG_MAX]那样愚蠢的东西不会越界,你需要声明你的缓冲区的边界大于系统上可表示的最大整数。除了这种缓冲区需要的内存量之外,这显然是不可能的。

实际的解决方案是手动跟踪缓冲区的大小,并根据缓冲区大小验证缓冲区中任何不受信任的索引。

答案 3 :(得分:1)

请参阅我们用作调试工具的Memory Safety Checker,检测C代码以确定是否对数组或缓冲区产生任何错误。这发现了valgrind无法解决的问题。