C ++ GCC4.4警告:配列添え字は配列の境界を超えています
質問
私は最近、GCC 4.4(MINGW TDMビルド)にアップグレードしましたが、今度は次の警告が生成されます。
メンバー関数 'void Console :: 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()の議論である、それを文字列()コンストラクターに包むことにより、警告が消える、あなたの助けに感謝します:)
boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
解決
同じエラーがありました。回避策として、私は交換しました
is_any_of(" ")
と
is_from_range(' ', ' ')
また、これはわずかに効率的かもしれません。
他のヒント
これらのGCCバグの1つ以上と関係がある可能性があります。
gcc bugzilla「警告:配列の添え字は配列の境界を上回っています」の検索結果
それらのすべてが有効であるわけではありませんが、あなたが回収すると、いくつかの固定されたものがあります:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861
だから私はそこに何かが起こっていると確信しています。コメントに基づいて、最適化なしでコンパイルして、それがなくなるかどうかを確認します。
標準アルゴリズムの1つ(STD ::削除、私は思う)を使用して偽の境界警告を受け取りました。
myarray,
myarray + sizeof(myarray)/sizeof(*myarray)
これは確かに境界にあると確信しています。しかし、それは玩具コードだけだったので、私はただその周りに囲まれました。 GCCが本当に危険な警告を投げている場合、コードが修正されるまで非常に慎重に検査するだけです。
ここでのループは、文字列の長さを変更しているが、ループ終了条件を更新していないことに気付きます。これがあなたの問題の原因でしょうか?
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++;
}