Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存覆盖检测工具的设计_C++_C_Linux - Fatal编程技术网

C++ 内存覆盖检测工具的设计

C++ 内存覆盖检测工具的设计,c++,c,linux,C++,C,Linux,我的任务是在Linux中设计和编写一个新的内存覆盖测试工具,它可以捕获由于动态分配内存中的覆盖而导致的错误 一个好方法是,如果用户请求x字节,则分配x+r字节。使用mprotect禁止访问r字节,这样,如果用户程序运行到该部分,它将停止生成SIGSEGV 但上述情况下的问题是,mprotect需要一个映射内存(mmap),并且每次有malloc请求映射x+r字节实际上都是一个开销 你能建议其他方法吗?或者任何代码片段,如果您使用过这样的工具 旁白:任何人都可以共享他们知道或使用过的任何此类开源工

我的任务是在Linux中设计和编写一个新的内存覆盖测试工具,它可以捕获由于动态分配内存中的覆盖而导致的错误

一个好方法是,如果用户请求x字节,则分配x+r字节。使用
mprotect
禁止访问r字节,这样,如果用户程序运行到该部分,它将停止生成SIGSEGV

但上述情况下的问题是,
mprotect
需要一个映射内存(
mmap
),并且每次有
malloc
请求映射x+r字节实际上都是一个开销

你能建议其他方法吗?或者任何代码片段,如果您使用过这样的工具


旁白:任何人都可以共享他们知道或使用过的任何此类开源工具的设计文档吗?

一种方法是分配更多内存,并在前端和后端填充特定的字节模式,用户数据将位于这些红色区域之间。解除分配时,检查红色区域图案是否完好。更详细地解释它。

不是一个开源产品,但这里有一个非常详细的例子,描述了我们如何实现C语言。检查点将检测Valgrind不会检测到的错误


作为C++的一种练习,读者可以做同样的操作:-{

。如果你想使用McRead,你需要按页工作。 假设用户需要x字节,则假设x4K会使其复杂化一点)。
分配8K,使用mmap(它提供对齐的页面),使用mprotect写保护第二页。
返回用户时,不要给他指向第一页的指针,而是p+3096-x。

现在,他可以访问x字节,并且在尝试写入之后会崩溃。

听起来你好像在重写efence,也许你想看看他们是如何做到的。@Plasmah:我上面提到的过程是efence使用的。它有巨大的内存开销。因此,重新写入它没有意义。valgrind?假设我们用“As”填充怎么办如果最后一次覆盖是同一个字母?什么是唯一的填充符?例如,用0xdeadbeef填充它。用相同值覆盖一个字节的概率是1/256,对于4个字节,它是1/256^4。同时,您提到的过程肯定会阻止写入,那么内存读取呢?它不会检测是否尝试读取内存那个地方,对吗?对。大概所有分配的内存都是应用程序以某种方式使用的内存。在低级别上,无法区分有效读取和无效读取。请投票支持写保护过程,但很抱歉,我不能接受答案,因为这不是一个完整的验证方法,也可以保护读取。谢谢,请投票支持这个有用的方法link。让我检查一下,如果有混淆,我会给你回复。如果他试图“在”之前写,会发生什么?C程序也充满了指针减量。@IraBaxter,你可以很好地检测到在数据之后写(通过将数据放在页面末尾)或在数据之前写(通过将数据放在开头)。您可以使其可配置,并运行两个测试。或者您可以随机决定每个分配。