Domanda

Recentemente ho aggiornato a GCC 4.4 (MinGW TDM build) e ora il codice follow produce questi avvertimento:

  

In funzione membro 'vuoto Console :: print (std :: const string &)':

     

Attenzione: array indice è al di sopra limiti di matrice

Ecco il codice:

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

Tutte le idee?


Sono le ottimizzazioni che stanno facendo ...

Inoltre sembra essere questa linea, che sta causando:

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

Ah, sì, l'ho trovato, è l'argomento per boost :: is_any_of (), avvolgendolo in un costruttore stringa () l'avvertimento va via, grazie a tutti voi per il vostro aiuto:)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
È stato utile?

Soluzione

Ha ottenuto lo stesso errore. Per aggirare il problema ho sostituito

is_any_of(" ")

con

is_from_range(' ', ' ')

, che potrebbe anche essere un po 'più efficiente.

Altri suggerimenti

Potrebbe avere qualcosa a che fare con uno o più di questi bug GCC:

risultati della ricerca GCC Bugzilla per "Attenzione: array indice è al di sopra limiti di matrice"

Non tutti sono validi, ma ci sono alcuni tra quelli fissi se si cerca in giro, troppo:

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

Quindi sono abbastanza sicuro che ci sia qualcosa da fare lì. Sulla base delle osservazioni, mi piacerebbe provare la compilazione senza ottimizzazione e vedere se va via.

Ho un spurie limiti di allarme utilizzando uno degli algoritmi standard (std :: rimuovere, credo) e il passaggio di parametri iteratore:

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

, che sono abbastanza sicuro che sono in limiti. E 'stato solo nel codice giocattolo, però, quindi ho solo bodged intorno ad esso. Se GCC davvero sta gettando un po 'incerti avvertimenti dovrete semplicemente per ispezionare il codice extra-cura finché non è risolto.

Ho notato il ciclo qui sta modificando la lunghezza della stringa, ma non aggiornare la condizione di terminazione del ciclo. Potrebbe essere questa la fonte del 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++;
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top