对缓冲区大小施加限制

Posted

技术标签:

【中文标题】对缓冲区大小施加限制【英文标题】:impose restrictions on buffer size 【发布时间】:2011-01-17 13:55:19 【问题描述】:

是否有any 的方法可以对字符缓冲区施加大小限制,以使对缓冲区的任何操作都不会导致越界访问?

【问题讨论】:

【参考方案1】:

简而言之:没有

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

您可以使用自己的函数、宏和按缓冲区记账来防止无效访问。但是,您将不得不在任何地方使用此接口,这意味着您将无法直接访问该缓冲区。

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

编辑:

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

处理此问题的 C 方法是先查看后跳并确保每个代码分支/部分都是安全的,而不是检查每个访问。

【讨论】:

【参考方案2】:

这可能对您的任务有所帮助:http://duma.sourceforge.net/。

【讨论】:

【参考方案3】:

简短的回答:不。

长答案: 为了确保即使像buffer[ULLONG_MAX] 这样愚蠢的事情也不会超出界限,您需要使用大于系统上可表示的最大整数的界限来声明缓冲区。除了这种缓冲区需要的内存量之外,这显然是不可能的。

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

【讨论】:

【参考方案4】:

请参阅我们的Memory Safety Checker,它用作调试帮助,检测您的 C 代码以确定您是否在数组或缓冲区方面出现任何错误。这会发现 valgrind 无法解决的问题。

【讨论】:

以上是关于对缓冲区大小施加限制的主要内容,如果未能解决你的问题,请参考以下文章

TCP缓冲区大小及限制

超出 HttpClient 缓冲区大小限制

ORA-06502: 字符串缓冲区太小。即使字符串大小低于声明的大小限制

如何限制管道(windows)的缓冲区大小?

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

达到输出大小限制后,缓冲数据被截断