8

最近GCC4.4(MinGW TDMビルド)にアップグレードしましたが、次のコードで次の警告が表示されます。

メンバー関数で'voidConsole :: print(const std :: string&)':

警告:配列の添え字が配列の境界を超えています

コードは次のとおりです。

void Console::print( const std::string& str ) {
        std::string newLine( str );
        if( newLine.size() > MAX_LINE_LENGTH ) {
            sf::Uint32 stringSize = newLine.size();
            for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
                    insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) {
                newLine.insert( insertPos, "\n" );
            }
        }

        StringList tokens;
        boost::split( tokens, newLine, boost::is_any_of("\n") );

        for( StringList::iterator it = tokens.begin();
                it != tokens.end(); ++it ) {
            addLine( *it );
        }
    }

何か案は?


それを行っているのは最適化です...

また、それを引き起こしているのはこの行のようです:

boost::split( tokens, newLine, boost::is_any_of("\n") );

はい、わかりました。boost:: is_any_of()の引数です。string()コンストラクターでラップすると、警告が消えます。ご協力いただきありがとうございます:)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
4

3 に答える 3

3

同じエラーが発生しました。回避策として、私は交換しました

is_any_of(" ")

is_from_range(' ', ' ')

これも少し効率的かもしれません。

于 2009-12-01T17:55:13.793 に答える
3

これらのGCCバグの1つ以上と関係がある可能性があります。

「警告:配列の添え字が配列の境界を超えています」のGCCBugzilla検索結果

それらのすべてが有効であるわけではありませんが、検索するといくつかの固定されたものもあります。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861

だから私はそこで何かが起こっていると確信しています。コメントに基づいて、最適化せずにコンパイルしてみて、それがなくなるかどうかを確認します。

標準アルゴリズムの1つ(std :: remove、私は思う)を使用し、イテレーターパラメーターを渡すと、誤った境界の警告が表示されました。

myarray, 
myarray + sizeof(myarray)/sizeof(*myarray)

私はそれが限界にあるとかなり確信しています。でも、それはおもちゃのコードだけだったので、私はそれをいじくり回しました。GCCが本当に危険な警告をスローしている場合は、修正されるまでコードを特に注意深く検査する必要があります。

于 2009-07-22T22:32:47.433 に答える
1

ここでのループは文字列の長さを変更していますが、ループの終了条件を更新していないことに気付きました。これがあなたの問題の原因でしょうか?

   sf::Uint32 stringSize = newLine.size();
   for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
      insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) 
   {
      newLine.insert( insertPos, "\n" );
      // You were probably wanting to put this here..
      insertPos++;
      stringSize++;
   }
于 2009-07-22T22:18:53.047 に答える