7

非常に奇妙な症状が発生しました。根本的な原因は誰に教えてくれますか?単純なコードをコンパイルするとVC++ 2010コンパイラがクラッシュするのはなぜですか?

マイVC++コンパイラのバージョン最新である: "のMicrosoft Visual C++ 2010:01019-532-2002102-70860" 再現する

ステップ:

  1. 空のWin32コンソールプロジェクト
  2. を作成します。
  3. main.cppという名前の新しいcppファイルを追加します。
  4. main.cppに次のコードを貼り付けます。
  5. コンパイル
  6. コンパイラがクラッシュし、レポートに次のメッセージ:バグの\ main.cppに(54893757)\

:致命的なエラー C1001:内部エラーがコンパイラで が発生しました。この問題を回避するには(コンパイラファイル 「msc1.cpp」、行1420)

は、上に挙げた場所の近くにプログラム を簡素化したり変更 を試してみてください。 Visual C++のヘルプメニュー コマンドを に選択するか、テクニカルサポートヘルプ ファイルを開いてください。

このエラーは注入テキストで発生:

D:\バグの\ main.cppに(63): 関数テンプレートのインスタンス 'XDummyテスト(T)' への参照がでコンパイルされる参照[ T = INT ]

ビルドFAILED。以下は

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

コードを内部コンパイラエラーの原因となる最小限のコードに減らすことができる場合は、[Microsoft Connect](http://connect.microsoft.com/)にバグレポートを提出することを検討してください。 –

+0

そのようなautoキーワードを使用すると、悪い/怠惰に思えます。関数が返す型を調べるために、複数の関数呼び出しレイヤを掘り起こす必要はありません。そして、内部関数の戻り値の型が変更された場合、私はむしろ、変更された関数が呼び出された時点でコンパイラエラーを取得し、何が起こったのか疑問に思って、ノックオン変更の原因を検索しなければなりません)... autoを使うと、ローカルイテレータ変数を定義するときに便利ですが、関数シグネチャでそれを使用することは悪い考えです。 –

+0

@Leo Davidson:私はauto + decltypeも好きではありません。しかし、多くの場合、auto + decltypeは不可欠です。必要でない場合は、関数を定義するためにそれらを使用しません。 – xmllmx

答えて

5

は、あなた自身のトラブルシューティングを行うのいずれかのタイプを試してみましたか?

上記のソースコードを使用してクラッシュを再現することができます。もちろん、私は警告のカップルを取得:

  • 「のIntelliSense:オーバーロードされた関数のインスタンス 『:
fは
  • 「関数呼び出しの引数が少なすぎるのIntelliSense」』引数リストと一致しました」

    両方のこの行を参照:トラブルシューティングの

    auto v = f(m_Suite); 
    

    さらに数秒は全体XTestクラスをコメントアウトすることにより、コードがコンパイルされ、元ことを発見します(そして最も重要なのは、コンパイラーをクラッシュさせることなく)問題なく実行できます。それは問題が明らかにXTestクラス内のどこかにあることを私に伝えます(そしてあなたに伝えてください)。
    コンパイルエラーが発生しているかどうかは不思議ではありません。

    さて、コンパイラエラーを引き起こしているその1行をコメントアウトすればどうでしょう。あなたは何を知っていますか!コードはコンパイルして実行します。

    これで、約1分で、1つのコード行に犯人が絞り込まれました。私はあなたの努力を集中させる場所を正確に知っているので、今ここから取り上げることができると思うので、実際にあなたのコードが何をしているかを正確に理解する時間はかかりません。これらのIntelliSenseエラーを修正し、コンパイラをクラッシュせずにコードをコンパイルするかどうかを確認します。

  • +1

    「IntelliSense ...」エラーは実際にはコンパイラではなくIntelliSenseによって生成されるため、コンパイラエラーではありません。 Visual C++コンパイラとIntelliSenseは完全に異なるフロントエンドを使用しているため、しばしばエラーを報告する可能性があります。 –

    +3

    無効なコードがコンパイラをクラッシュさせるというIMOの面白いことは、コードが無効ではなく、コンパイラがクラッシュするということです。 –

    +1

    @James McNellis:あなたは厳密にはコンパイラエラーではないと警告していますそのコード行で何かが間違っている可能性があり、私のテストからはそうです。状況を考えれば、少なくとも注目に値するはずです。 –

    0

    コンパイラの作成者は、有効な入力から有効な出力を生成するコンパイラの能力に影響を与えないコンパイラのバグを修正することに非常に高い優先度を置いていません。これらのバグの中で、最も低い優先順位は、黙って無効な出力を生成しないバグです。

    あなたの質問に対する答えは、このバグが以前に報告されていないか、非常に低い優先度が割り当てられているためです。

    関連する問題