什么是GCC中的隔离错误路径优化?这个怎么运作 ?
隔离去年添加到gcc的错误路径优化:http://gcc.1065356.n5.nabble.com/RFA-PATCH-Isolate-erroneous-paths-optimization-td980376.html
答案 0 :(得分:1)
添加的两个标志的文档应该有助于您理解:
-fisolate-erroneous-paths-dereference检测由于解除引用NULL指针而触发错误或未定义行为的路径。 从主控制流中隔离这些路径并转动语句 将错误或未定义的行为带入陷阱。
考虑这个人为的代码块:
char
foo (int a)
{
char *x = "hello world";
if (a) /* (1). */
x = NULL;
else
x = x;
return *x; /* (2). */
}
在a != 0
我们采用标记为(1)的路径的情况下。这会在(2)处导致未定义的行为,其中x
将等于NULL
指针。
此优化允许我们将上述内容重写为:
char
foo (int a)
{
char *x = "hello world";
if (a)
abort ();
else
x = x;
return *x;
}
好处在于更好的恒定传播,我们不再需要考虑会触发未定义行为的值。
考虑到常量传播现在允许我们将示例重写为:
char
foo (int a)
{
if (a)
abort ();
return 'h';
}
作为参考,此优化的另一半适用于由属性限制的函数,以返回null /非null。
-fisolate-erroneous-paths-attribute检测由于以某种方式使用NULL值而触发错误或未定义行为的路径 这是return_nonnull或nonnull属性禁止的。隔离 来自主控制流的那些路径并转换语句 进入陷阱的错误或未定义的行为。目前还没有 已启用,但将来可能会被-O2启用。
可以在http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
找到该文档