2009-07-22 6 views
7

配列の範囲を超えていると、今次のコードでは、これらの警告生成:C++ GCC4.4警告:配列の添字は、私は最近、GCC 4.4(MinGWののTDMビルド)にアップグレード

メンバー関数「のボイドコンソール::印刷での(CONSTのstd ::文字列&) ':

警告:配列の添字は、配列の境界上にある

ここでは、コードは次のとおり

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()コンストラクタにラップすることで警告が消えてくれます。あなたの助けに感謝します。

+2

おそらく、コンパイラはエラーの行番号も指定しましたか?あなたのコードにコメントを記入してください。 –

+2

「stringSize」を 'const'と宣言しても、好奇心をそそりません。 –

+0

それは行#を与えていない、警告私はそこにコンパイラからの正確なテキストが掲載されています。 – Adam

答えて

3

同じエラーが発生しました。回避策として、私はまた少しより効率的かもしれません

is_from_range(' ', ' ') 

is_any_of(" ") 

を置き換えます。

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++; 
    } 
3

は、これらのGCCのバグの1以上とは何かを持ってもらえ:

GCC bugzilla search results for "Warning: array subscript is above array bounds"

あまりにも、ないそれらのすべては有効ですが、あなたの周りに検索する場合、いくつかの固定のものがあります。

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

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

私は偽の境界標準アルゴリズム(のstd ::私が思うに、削除)のいずれかを使用して警告し、イテレータのパラメータを渡すを得た:私はかなり確信している

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

は境界内にあります。しかし、それはおもちゃのコードだけだったので、私はちょうどその周りに身を包んだ。 GCCが本当に危険な警告を投げているならば、コードが修正されるまで慎重にあなたのコードを調べなければならないでしょう。

関連する問題