为什么VC ++ 2010编译器在编译简单代码时会崩溃?

时间:2010-11-27 05:54:44

标签: c++ compiler-construction crash compiler-errors visual-c++-2010

我遇到了一个非常奇怪的症状。谁能告诉我根本原因是什么?

我的VC ++编译器版本是最新的:“Microsoft Visual C ++ 2010:01019-532-2002102-70860”

重现的步骤:

  1. 创建一个空的win32控制台项目
  2. 添加名为main.cpp
  3. 的新cpp文件
  4. 将以下代码粘贴到main.cpp
  5. 编译
  6. 编译器崩溃并报告以下消息:
  7.   

    \ bug \ main.cpp(54893757):致命错误   C1001:发生内部错误   在编译器中。 (编译文件   'msc1.cpp',第1420行)

         

    要解决此问题,请尝试   简化或改变程序   靠近上面列出的位置。   请选择技术支持   Visual C ++帮助菜单上的命令,   或打开技术支持帮助   文件以获取更多信息。

         

    注入文本中出现此错误:

         

    d:\ bug \ main.cpp(63):参见参考资料   功能模板实例化   'XDummy Test(T)'用[编译]   T = int]

         

    构建失败。

    以下是main.cpp的源代码:

    #include <vector> 
    
    template<class It_> 
    struct trait_dummy 
    { 
        static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;     
    }; 
    
    template<class It_> 
    class X 
    { 
    public: 
        template<class T_> 
        X(T_& rColl) 
        {} 
    }; 
    
    template<class T_> 
    X<typename T_::iterator> f(T_ rColl, std::false_type) 
    { 
        return X<typename T_::iterator>(rColl); 
    } 
    
    template<class T_> 
    auto f(T_& rColl) -> decltype(f(rColl, std::false_type())) 
    { 
        return f(rColl, std::false_type()); 
    } 
    
    template<class It_> 
    X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0) 
    { 
        return X<It_>(first, first + nSize); 
    } 
    
    class XTest 
    { 
    public: 
        void foo() 
        { 
            auto v = f(m_Suite); 
        }    
    
        std::vector<int> m_Suite; 
    }; 
    
    const int g_dummy = 0; 
    class XDummy 
    { 
    public: 
        XDummy(int, int, int, int dummy = g_dummy) 
        {} 
    }; 
    
    template<class T> 
    XDummy Test(T) 
    {    
        return XDummy(0, 0, 0); 
    } 
    
    int main() 
    { 
        Test(0); 
        //XTest().foo(); 
    
        return 0; 
    }
    

2 个答案:

答案 0 :(得分:5)

您是否自己尝试过任何类型的问题排查?

我可以使用您描述的上述源代码重现崩溃。当然,我收到了一些警告:

  • “IntelliSense:没有重载函数的实例”f“匹配参数列表”
  • “智能感知:函数调用中的参数太少”

都指这一行:

auto v = f(m_Suite); 

几秒钟的故障排除发现,通过注释掉整个XTest类,代码编译并执行没有问题(最重要的是,不会崩溃编译器)。这告诉我(并且应该告诉你)问题显然位于XTest类中的某个位置。
你不禁想知道这是否与正在生成的编译器错误有关。

那么,如果我们只是注释掉产生编译器错误的单行怎么样?你知道什么!代码编译并执行得很好!

所以在大约一分钟之内,我们已经将罪魁祸首缩小到一行代码。我不会花时间去理解你的所有代码到底是什么但是,因为我认为你可以从这里开始,因为你知道在哪里集中你的努力。首先修复这些IntelliSense错误,看看你的代码是否编译而不会使编译器崩溃。

答案 1 :(得分:-1)

编译器作者没有高度重视修复编译器中的错误,这些错误不会影响编译器从有效输入生成有效输出的能力。在这些错误中,最低优先级是那些不会无声地产生无效输出的错误。

因此,您的问题的答案很可能是因为此错误以前没有报告过,或者被分配了非常非常低的优先级。