8

I recently upgraded to GCC 4.4 (MinGW TDM build) and now the follow code produces these warning:

In member function 'void Console::print(const std::string&)':

warning: array subscript is above array bounds

Here's the code:

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 );
        }
    }

Any ideas?


It is the optimizations that are doing it...

Also it appears to be this line which is causing it:

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

Ah yes, I found it, it is the argument for boost::is_any_of(), by wrapping it in a string() constructor the warning goes away, thank you all for your help :)

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

3 回答 3

3

可能与以下一个或多个 GCC 错误有关:

GCC bugzilla 搜索结果“警告:数组下标超出数组边界”

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

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

所以我很确定那里发生了什么事。根据评论,我会尝试在没有优化的情况下进行编译,看看它是否会消失。

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

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

我很确定这是在界限内。不过,它只是在玩具代码中,所以我只是绕开了它。如果 GCC 真的抛出了狡猾的警告,你只需要特别仔细地检查你的代码,直到它被修复。

于 2009-07-22T22:32:47.433 回答
3

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

is_any_of(" ")

is_from_range(' ', ' ')

这也可能稍微更有效率。

于 2009-12-01T17:55:13.793 回答
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 回答