强制页面边界分段
Force a Page Boundary Segfault?
我想写一个测试(gcc 4.7),在这个测试中,我分配了一页内存,它在某种程度上紧挨着我的进程不拥有的内存页,这样,通过页面末尾的未对齐读取应该是segfault。
这可能吗?我该怎么做?
您可以使用protection=PROT_NONE
的mprotect使页面不可访问,例如
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int main(void)
{
char * a = valloc(4096 * 2); // page-aligned memory allocation (two pages)
int status = mprotect(&a[4096], 4096, PROT_NONE);
if (status != 0) { perror("mprotect"); exit(1); }
// protect second page
for (int i = 0; i <= 4096; i += 256) // test - should fail when i == 4096
{
printf("a[%d] = %un", i, a[i]);
}
return 0;
}
编译和测试:
$ gcc -Wall mprotect.c && ./a.out
a[0] = 0
a[256] = 0
a[512] = 0
a[768] = 0
a[1024] = 0
a[1280] = 0
a[1536] = 0
a[1792] = 0
a[2048] = 0
a[2304] = 0
a[2560] = 0
a[2816] = 0
a[3072] = 0
a[3328] = 0
a[3584] = 0
a[3840] = 0
Bus error: 10
$
请注意,当我们尝试读取a[4096]
时,会产生总线错误。
如果你在gdb下运行这个,你会得到更多的信息:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x0000000100803000
0x0000000100000eff in main () at mprotect.c:14
14 printf("a[%d] = %un", i, a[i]);
我相信没有简单的方法可以保证调用将segfault。
从少数语言来看,所有分配(拥有)内存之外的访问都是undefined behaviour
。访问会产生哪种结果甚至是未定义的,但经常发生?一个segfault,但并不总是如此。因此,Paul提供的解决方案有时可以完成任务,但不能作为保证。
如果你在valgrind
的控制下运行你的作业,你总是会在访问你不拥有的内存时出错。但这不是默认行为。此外,您还可以使用更多的库,如efence
或其他库来捕获这些错误。来自较新编译器版本的memory-sanitize
也是一个起点。
作为对你问题的回答:不,没有办法用简单的c语句来保证segfault。
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段错误当我试图运行程序时出错
- std::当在256字节边界上写入整数时,流的奇怪行为
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 分段错误发生在索引离开C++数组边界之后
- 强制页面边界分段