これに対する答えを2日間探しましたが、成功しませんでした。私はこれまでこの問題に遭遇したことがないので、最善を尽くします。我慢してください。
1 年以上前に作成した C++ プロジェクトに戻りましたが、当時は問題なく実行されていました。先日、同じプログラムを実行しようとしていたときに、この興味深く、信じられないほど厄介な問題に遭遇しました。コードは次のようなものでした:
file.h
...
short id;
...
file.cc
id = 0;
while (id < some_large_number)
{
id = foo();
if (id == 2)
{
//do something
}
else if (id == 2900)
{
//do something
}
else if (id == 30000)
{
//do something
}
else if (id == 40000)
{
//do something
}
else if (id == 45000)
{
//do something
}
else
{
//do something else
}
}
定数は、この例のために拡張した 16 進表記のマクロです。これは本当にバグであることが判明しましたが、デバッガーでは発見が容易ではありませんでした。何が起こったのか:
if (id == 30000)
GDB を使用して (最適化なしで) コードをステップ実行しようとしていたとき、GDB が , に到達した後、毎回else ステートメントに直接ジャンプすることに気付きました。40000
数値は 16 進数表記の c マクロだったので、最初は a の制限を超えていることに気づきませんでしたsigned short
。これは非常に誤解を招くものであり、その解明に何時間も費やしました。とりわけ、外部ライブラリを再コンパイルし、g++ を再インストールしました。
明らかに、問題をid
修正unsigned short
しました。もう 1 つの問題は、コンパイラの問題のようです。しかし、私はまだ理解していません.コードのこれらのセクションが実行中に完全にスキップされ、最適化されていないのはなぜですか? なぜそれが各ステートメントを通過しないのでif
、本当の問題を特定できるのでしょうか? 何か案は?
本当にありがとう。これで最初の質問は大丈夫だと思います。