【发布时间】:2018-03-12 16:41:24
【问题描述】:
以下代码导致我的程序崩溃,因为
void fractalizeSegment() {
// Assume next != NULL
double deltaX = next->x - x;
double deltaY = next->y - y;
// Add 3 new points labeled a1, a2, a3 from this to next
Point a3(x + 2.0*deltaX/3.0, y + 2.0*deltaY/3.0, next);
double sqr3 = std::sqrt(3.0);
Point a2(x + deltaX/2.0 - sqr3*deltaY/2.0,
y + deltaY/2.0 + sqr3*deltaX/2.0,
&a3);
Point a1(x + deltaX/3.0, y + deltaY/3.0, &a2);
next = &a1;
}
以某种方式优化
void fractalizeSegment() {
next = &a1;
}
在p0 = {x = 0, y = 0, next = 0x7ffffffffe100}上调用方法, 指向 p1 = {x = 1, y = 0, next = 0x0}。
通过在调试器中分析程序我发现当我在方法fractalizeSegment中时:
a1 = {x = 6.9533558075099091e-310, y = 6.9533558075098597e-310, next = 0x7fffffffe190}
地址a1.next有
a2 = {x = 6.9533558074508189e-310, y = 4.9406564584124654e-324, next = 0x34}.
试图遵循 (*a2.next).next 会导致分段错误。
为什么 g++ 会这样优化我的代码?如何预防?
我发现的当前解决方法是打印出 a1、a2 和 a3 的值, 这阻止了优化。
【问题讨论】:
-
也许它确实不假设
next != NULL? GCC 在优化这样的代码时非常积极地利用未定义的行为。 -
next = &a1;将立即悬空。 -
在代码周围添加 if(next != NULL) 不会改变行为
标签: c++ g++ compiler-optimization