C ++ advertencia GCC4.4: array subíndice está por encima de límites de matriz
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" ) ) );
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:
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++;
}