-1

-O2 を指定して gcc (4.1.2) でビルドされた C++ コードがあります。

このコードを最適化せずにコンパイルして実行すると、プログラムは問題なく実行されます。

O1/O2/O3 でコンパイルすると、無効な解放を示す valgrind でコードがクラッシュします。これは、関数内の文字列変数に絞り込まれています。

コードはファイルを読み取り、内容を反復します。すべての処理コードを削除しました。次のコード スニペットにより、コアが発生します...

int MyParser::iParseConfig(Config &inConfig)
{
    bool keepGoing = true;

    while(keepGoing)
    {
        string valueKey = "";
        keepGoing = false;
    }
    return 0;
}

これが最適化されていない状態で実行されると、正常に動作します。これを最適化してビルドして実行すると、機能しません。

GCC が文字列クラスを最適化する方法に問題があるようです。

これを回避する方法はありますか?

4

3 に答える 3

2

最適化を使用してコンパイルすると、このコードがクラッシュする理由を正確に説明することはできません。おそらくi2桁以上になり、バッファオーバーフローが発生します。おそらくそれは別のものですが、とにかくコードを変更します:

    sprintf(charIndex, "%d", i++);
    string valueKey = "";
    valueKey.append("Value").append(charIndex);
    string value = inConfig.sFindField(valueKey);

このような:

    stringstream ss;
    ss << "Value" << i++;
    string value(ss.str());

これはより C++ に似ており、動作するはずです。それを試してみてください。

これが本当にバッファ オーバーフローの状況なのか知りたい場合は、次の行を挿入します。

    assert(i < 99);

への呼び出しの前にprintf。または使用snprintf

    snprintf(charIndex, sizeof(charIndex), "%d", i++);

または、バッファを大きくしてください。

于 2013-02-12T17:24:36.490 に答える