人気のあるgccコンパイラー、特にオプティマイザーで、別のエラーが検出され、プログラム実行中にランタイムエラーが発生しました。 O2コンパイラオプションが有効になっている場合、オプティマイザーは特定のプログラムテンプレートを正しく処理せず、致命的な結果につながります。
バグは私たちの同胞Ivanov Maxim(
http://e-maxx.ru )によって投稿されました。ちなみに、1か月後にACMプログラミング世界選手権に残りました。 :)
最小化されたテストコードは次のとおりです。
for (int i=0; i<=1; i++)
for (int j=0; j<=1; j++) {
std::vector a[2];
a[i].push_back (0);
}
ベクトルのローカル配列を二重のネストされたループに入れた場合、エラーが表示されます。初めてベクトルに書き込もうとすると、ランタイムが取得されます。 同時に、次の条件の少なくとも1つが満たされている場合、最適化は正常です。
a)ベクトルの配列のサイズがサイクルウォークより大きい
b)[i]ではなく、[0]、[1]、またはその他の定数値でベクトルにアクセスします
c)ベクトルに書き込む前に、a = std :: vector();を実行します。
このコードは、どのバージョンのVisual Studioでも正しくコンパイルされることに注意してください。
このエラーはRichard Guentherによって修正され、修正は今日
gccリポジトリにアップロードされてい
ます 。
gccを使用して原子力プラントと核弾頭のプログラムを作成するときは注意してください:)
バグレポート 。