这与使用-O3时确定段错误的原因有关?在这个问题中,当-O3使用特定版本的GCC 编译时,我正在捕获特定函数中的段错误.在-O3,使用矢量化指令(at -O2,不使用它们).
我想在较低的优化级别中包装单个函数.根据GCC 4.2.2中特定功能的关闭优化,我可以做到.但是,按照问题和答案中的各种链接,我找不到"如何,确切地说,这样做"的答案.
如何将单个函数标记为使用不同的优化级别?
相关,我不想将此函数移动到单独的文件,然后为它提供不同的makefile配方.这样做可以打开另一种蠕虫病毒,比如仅在某些平台上将其应用于GCC 4.9.
我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误:
#include <inttypes.h>
#include <stdlib.h>
#include <sys/mman.h>
int main()
{
uint32_t sum = 0;
uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
uint16_t *p = (buffer + 1);
int i;
for (i=0;i<14;++i) {
//printf("%d\n", i);
sum += p[i];
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
如果使用分配内存,则仅此段错误mmap.如果我使用malloc,堆栈上的缓冲区,或全局变量,它不会段错误.
如果我将循环的迭代次数减少到少于14的次数,则不再是段错误.如果我从循环内打印数组索引,它也不再是段错误.
为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?