我最近升级到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" ) ) );
答案 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++;
}