2009-07-22 9 views
7

Recientemente he actualizado a GCC 4.4 (TDM MinGW acumulación) y ahora el código de seguimiento produce estas advertencias:C++ advertencia GCC4.4: subíndice está por encima de límites de matriz

En nula Console :: Función de impresión de este miembro (const std :: string &) ':

advertencia: subíndice está por encima de límites de matriz

Aquí está el 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); 
     } 
    } 

¿Alguna idea?


Es las optimizaciones que lo están haciendo ...

También parece ser esta línea, que está causando:

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

Ah sí, me pareció , es el argumento a favor de impulso :: is_any_of(), envolviéndolo en una cadena() constructor de la advertencia desaparece, gracias a todos por su ayuda :)

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

Presumiblemente, el compilador también dio un número de línea para el error? Por favor indícalo en tu código a través de un comentario. –

+2

Por curiosidad, ¿todavía lo hace si declaras 'stringSize' como' const'? –

+0

No da la línea #, la advertencia que publiqué allí es el texto exacto del compilador. – Adam

Respuesta

3

consiguió el mismo error. Como solución Substituí

is_any_of(" ") 

con

is_from_range(' ', ' ') 

que también podría ser un poco más eficiente.

1

noto su bucle aquí está alterando la longitud de la cadena, pero no actualizar la condición de terminación del bucle. ¿Podría ser esta la fuente de tu 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

podría tener algo que ver con uno o más de estos insectos CCG:

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

No todos ellos son válidos, pero hay algunas fijos si usted busca alrededor, también:

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

así que estoy bastante seguro de que hay algo que hacer allí. En base a los comentarios, trataría de compilar sin optimización y ver si se va.

que tiene una advertencia falsa límites usando uno de los algoritmos estándar (std :: remove, creo) y que pasan parámetros iterador:

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

cual estoy bastante seguro de que están en los límites. Sin embargo, solo estaba en el código de los juguetes, así que simplemente me volví loco. Si GCC realmente lanza advertencias dudosas, solo tendrá que inspeccionar su código de forma extremadamente cuidadosa hasta que se solucione.

Cuestiones relacionadas