Pergunta

Recentemente, atualizei para o GCC 4.4 (Mingw TDM Build) e agora o código a seguir produz estes avisos:

Na função de membro 'Void Console :: print (const std :: string &)':

Aviso: o subscrito da matriz está acima dos limites da matriz

Aqui está o código:

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

Alguma ideia?


São as otimizações que estão fazendo isso ...

Também parece ser esta linha que está causando:

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

Ah, sim, eu encontrei, é o argumento para o boost :: is_any_of (), envolvendo -o em um construtor de string (), o aviso desaparece, obrigado a todos pela sua ajuda :)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
Foi útil?

Solução

Recebi o mesmo erro. Como uma solução alternativa, substituí

is_any_of(" ")

com

is_from_range(' ', ' ')

o que também pode ser um pouco mais eficiente.

Outras dicas

Pode ter algo a ver com um ou mais desses bugs do GCC:

Resultados da pesquisa do GCC Bugzilla para "Aviso: o subscrito da matriz está acima dos limites da matriz"

Nem todos eles são válidos, mas há alguns fixos se você pesquisar também:

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

Então, tenho certeza de que há algo acontecendo lá. Com base nos comentários, eu tentaria compilar sem otimização e veria se ela desaparece.

Eu recebi um aviso de limites espúrios usando um dos algoritmos padrão (std :: remover, eu acho) e passando parâmetros do iterador:

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

O que tenho certeza de que estão em limites. Foi apenas no código de brinquedos, porém, então eu apenas eu corava em torno dele. Se o GCC realmente estiver lançando avisos desonestos, você só precisará inspecionar seu código com muito cuidado até que seja corrigido.

Percebo que seu loop aqui está alterando o comprimento da string, mas não atualizando a condição de terminação do loop. Essa poderia ser a fonte do seu problema?

   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++;
   }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top