Предупреждение 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(), оборачивая его в конструктор string(), предупреждение исчезает, спасибо всем за помощь:)
boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
3 ответа
Получил ту же ошибку. В качестве обходного пути я заменил
is_any_of(" ")
с
is_from_range(' ', ' ')
что также может быть немного более эффективным.
Может иметь отношение к одной или нескольким из этих ошибок GCC:
Результаты поиска в GCC bugzilla для "Предупреждение: индекс массива находится за пределами массива"
Не все из них действительны, но есть некоторые фиксированные, если вы тоже ищете:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861
Так что я уверен, что там что-то происходит. Основываясь на комментариях, я бы попробовал компилировать без оптимизации и посмотреть, пройдет ли это.
Я получил ложное предупреждение о границах, используя один из стандартных алгоритмов (я думаю, std::remove) и передавая параметры итератора:
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++;
}