Pregunta

Recientemente he actualizado a GCC 4.4 (TDM MinGW acumulación) y ahora el código de seguimiento produce estos advertencia:

  

En función miembro 'vacío Console :: impresión (const std :: string &)':

     

advertencia: array 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í, lo encontré, es el argumento a favor de impulso :: is_any_of (), envolviéndolo en un constructor de cadena () el aviso desaparece, gracias a todos por su ayuda:)

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

Solución

dieron 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.

Otros consejos

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

resultados de la búsqueda GCC bugzilla para "Advertencia: subíndice de matriz está por encima de límites de la matriz"

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í. Sobre la base de los comentarios, que iba a tratar de compilar sin optimización y ver si desaparece.

Tengo un espurios límites de advertencia usando uno de los algoritmos estándar (std :: remove, creo) y el paso de parámetros de iterador:

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

, que estoy bastante seguro de que están en los límites. Fue sólo en el código de juguete, sin embargo, por lo que sólo bodged alrededor de ella. Si GCC realmente está lanzando advertencias dudosas que vas a tener que inspeccionar su código extra-cuidado hasta que esté fija.

Me he dado cuenta que aquí el bucle 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 su 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top