【发布时间】:2014-03-25 06:54:28
【问题描述】:
什么是 GCC 中的隔离错误路径优化?这个怎么运作 ?
隔离去年添加到 gcc 的错误路径优化:http://gcc.1065356.n5.nabble.com/RFA-PATCH-Isolate-erroneous-paths-optimization-td980376.html
【问题讨论】:
标签: gcc optimization compiler-construction compiler-optimization
什么是 GCC 中的隔离错误路径优化?这个怎么运作 ?
隔离去年添加到 gcc 的错误路径优化:http://gcc.1065356.n5.nabble.com/RFA-PATCH-Isolate-erroneous-paths-optimization-td980376.html
【问题讨论】:
标签: gcc optimization compiler-construction compiler-optimization
添加的两个标志的文档应该有助于您理解:
-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/non-null 的函数。
-fisolate-erroneous-paths-attribute 检测由于以某种方式使用 NULL 值而触发错误或未定义行为的路径 这被returns_nonnull 或nonnull 属性所禁止。隔离 那些来自主控制流的路径,并用 错误或未定义的行为陷入陷阱。这不是目前 已启用,但将来可能由 -O2 启用。
文档可以在http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options找到
【讨论】: