C ++ GCC4.4警告:数组下标在数组边界之上

时间:2009-07-22 21:56:49

标签: c++ gcc boost tdm-mingw

我最近升级到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()的参数,通过将它包装在string()构造函数中,警告消失了,谢谢大家的帮助:))

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

3 个答案:

答案 0 :(得分:3)

可能与这些GCC中的一个或多个错误有关:

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

并非所有这些都是有效的,但如果您搜索一下也有一些固定的:

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

所以我很确定那里会发生一些事情。根据评论,我会尝试编译而不进行优化,看看它是否会消失。

我使用其中一种标准算法(std :: remove,我认为)并传递迭代器参数得到了一个虚假的边界警告:

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

我非常肯定是在界限内。但它只是在玩具代码中,所以我只是躲过它。如果GCC真的在发出狡猾的警告,你只需要仔细检查你的代码,直到它被修复为止。

答案 1 :(得分:3)

得到了同样的错误。作为一种解决方法,我更换了

is_any_of(" ")

is_from_range(' ', ' ')

也可能稍微提高效率。

答案 2 :(得分: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++;
   }