代码之家  ›  专栏  ›  技术社区  ›  Karl von Moor

有没有可能把GCC带入一个无限循环?

gcc
  •  12
  • Karl von Moor  · 技术社区  · 14 年前

    有没有可能通过输入奇怪的源代码将GCC带入一个无限循环?如果是,怎么做?也许可以用模板元编程做点什么?

    7 回复  |  直到 14 年前
        1
  •  8
  •   Potatoswatter R. Martinho Fernandes    13 年前

    bug特别短暂,例如@Pestilence的答案在GCC4.4.0中找到,在4.4.1中修复。一份 现在的 their Bugzilla .

    编辑: should also be fixed soon .

    template< int n >
    struct a { 
        a< n+1 > operator->() { return a< n+1 >(); }
    };
    
    int main() {
        a<0>()->x;
    }
    
        2
  •  11
  •   pestilence669    14 年前

    对。

    几乎每个计算机程序都有循环终止问题。然而,我认为GCC在无限循环变得明显之前会耗尽RAM。它的设计中没有多少“免费”操作。

    解析器&预处理器不会产生问题。我敢打赌,您可以以优化器为目标,这可能会有更多的实现错误。这与语言无关,更多的是利用您可以从源代码中发现的缺陷。i、 e.漏洞是不明显的。

    更新

    this particular case ,我的理论似乎是正确的。编译器一直在分配RAM,而优化器似乎确实很脆弱。答案是肯定的。是的,你可以。

        3
  •  4
  •   Shiroko    14 年前

    例如:

    template<typename T>
    struct Loop {
       typedef typename Loop<Loop<T> >::Temp Temp;
    };
    
    int main(int, char**) {
       Loop<int> n;
       return 0;
    }
    

        4
  •  1
  •   Frank    14 年前

    Bentley在《编程珍珠》一书中写道,在优化编译过程中,以下代码导致了无限循环:

    void traverse(node* p) {
      traverse(p->left);
      traverse(p->right);
    }
    

    他说“优化器试图将尾部递归转换成一个循环,当它能找到终止循环的测试时就死了。”(p.139)他没有报告发生这种情况的确切编译器版本。我想新的编译器会检测到这种情况。

        5
  •  1
  •   nobody    14 年前

        6
  •  0
  •   Joshua    14 年前

    我不知道gcc,但是旧的pcc曾经进入一个无限循环编译一些类型的无限循环(那些编译到x:jmp x)。

        7
  •  0
  •   zellio    14 年前

    我想你可以用“包括”来做

    建议导致编译器大量循环然后失败,而不是无限循环