【问题标题】:What is Isolate erroneous paths optimization什么是隔离错误路径优化
【发布时间】: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


    【解决方案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/non-null 的函数。

    -fisolate-erroneous-paths-attribute 检测由于以某种方式使用 NULL 值而触发错误或未定义行为的路径 这被returns_nonnull 或nonnull 属性所禁止。隔离 那些来自主控制流的路径,并用 错误或未定义的行为陷入陷阱。这不是目前 已启用,但将来可能由 -O2 启用。

    文档可以在http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options找到

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 2011-10-14
      • 2022-08-14
      • 1970-01-01
      • 2014-01-17
      • 2019-07-05
      • 2013-07-05
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多