【发布时间】:2016-02-23 22:19:32
【问题描述】:
我将我的问题总结为以下短程序。
它仅在 -O3 模式下导致 SEGFAULT(-O2 工作正常)。
根据gdb,它发生在*f = 0 行。
#include <iostream>
void func1(int s, int t)
{
char* buffer = new char[s + t*sizeof(float)];
if (!buffer)
{
std::cout << "new failed\n";
return;
}
float* f = (float*)(buffer + s);
for (int i = 0; i < t; ++i)
{
*f = 0;
//std::cout << i << std::endl; // if uncomment this line everything will work fine
++f;
}
delete [] buffer;
std::cout << "done\n";
}
int main()
{
int s = 31, t = 12423138;
std::cout << s << " " << t << std::endl;
func1(s, t);
return 0;
}
请告诉我,我做错了什么?
【问题讨论】:
-
这严重违反了the strict aliasing rule。至于崩溃,可能是因为您访问了未对齐的数据。由于别名问题,它可能无济于事,但尝试编译更多警告(例如
-Wall -Wextra -pedantic),看看它是否告诉你什么。 -
@JoachimPileborg 我在 MSVC 上用 -W4 -Wx 编译了这段代码,它编译得很好。
-
AFAIK MSVC++ 从不假设严格的别名规则,并且不会根据这些规则进行任何优化。
-
@AlgirdasPreidžius I compiled it with clang 它确实抱怨 "cast from 'char *' to 'float *' 将所需的对齐方式从 1 增加到 4"。跨度>
-
这就是当你从事黑客行为时会发生的事情。
标签: c++ gcc optimization segmentation-fault