2009-07-22 11 views
7

Recentemente ho aggiornato a GCC 4.4 (MinGW TDM build) e ora il codice follow produce questi avvertimento:C++ avvertimento GCC4.4: array indice è al di sopra limiti di matrice

Nel vuoto Console :: stampa funzione membro' (std :: string const &) ':

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

Qualche idea?


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 di string() l'avviso scompare, grazie a tutti per il vostro aiuto :)

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

Presumibilmente il compilatore ha anche indicato un numero di riga per l'errore? Si prega di indicarlo nel codice tramite un commento. –

+2

Per curiosità, lo fa ancora se dichiari 'stringSize' come' const'? –

+0

Non fornisce la riga #, l'avviso che ho postato è il testo esatto del compilatore. – Adam

risposta

3

Ottenuto lo stesso errore. Come una soluzione sostituii

is_any_of(" ") 

con

is_from_range(' ', ' ') 

che potrebbe anche essere leggermente più efficiente.

1

Ho notato che il loop qui sta modificando la lunghezza della stringa, ma non sta aggiornando la condizione di terminazione del loop. Questa potrebbe essere la fonte del tuo 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++; 
    } 
3

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

GCC bugzilla search results for "Warning: array subscript is above array bounds"

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 c'è qualcosa da fare lì. Sulla base dei commenti, proverei a compilarlo senza ottimizzare e vedere se sparisce.

ho avuto un avvertimento spuria limiti utilizzando uno degli algoritmi standard (std :: rimuovere, credo) e passaggio di parametri di iteratori:

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

che sono abbastanza sicuro che sono in limiti. Era solo nel codice del giocattolo, però, così mi sono limitato intorno. Se GCC lancia davvero avvertimenti dubbi, dovrai solo ispezionare il tuo codice con estrema attenzione finché non verrà risolto.

Problemi correlati