C ++ GCC4.4 ПРЕДУПРЕЖДЕНИЕ: Подписк массива выше границ массива

StackOverflow https://stackoverflow.com/questions/1168525

  •  19-09-2019
  •  | 
  •  

Вопрос

Недавно я перешел на GCC 4.4 (Mingw TDM Build), и теперь следующий код создает эти предупреждения:

В функции члена '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" ) ) );
Это было полезно?

Решение

Получил ту же ошибку. В качестве обходного пути я заменил

is_any_of(" ")

с

is_from_range(' ', ' ')

что также может быть немного более эффективным.

Другие советы

Может иметь какое -то отношение к одной или нескольким из этих ошибок GCC:

Результаты поиска GCC Bugzilla для «Предупреждение: абонент массивы выше границ массива»

Не все из них действительны, но есть некоторые фиксированные, если вы тоже ищете:

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

Так что я уверен, что там что -то происходит. Основываясь на комментариях, я бы попробовал собирать без оптимизации и посмотреть, уйдет ли это.

Я получил ложное предупреждение о границах, используя один из стандартных алгоритмов (я думаю, std :: lement) и передача параметров итератора:

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++;
   }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top