C++ GCC4.4 avertissement: indice de tableau est ci-dessus les limites du tableau
J'ai récemment mis à niveau vers GCC 4.4 (MinGW TDM construire) et maintenant le suivre code produit ces avertissement:
En fonction de membre de 'void Console::print(const std::string&)':
avertissement: indice de tableau est ci-dessus les limites du tableau
Voici le code:
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 );
}
}
Des idées?
C'est le optimisations qui font cela...
Aussi il semble être cette ligne qui est à l'origine d':
boost::split( tokens, newLine, boost::is_any_of("\n") );
Ah oui, je l'ai trouvé, c'est l'argument de boost::is_any_of(), en l'enveloppant dans une chaîne de caractères() constructeur de l'avertissement disparaît, merci à vous tous pour votre aide 🙂
boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
- Sans doute que le compilateur a également donné un numéro de ligne de l'erreur? Veuillez l'indiquer dans votre code via un commentaire.
- Par curiosité, est-il encore le faire si vous déclarez
stringSize
commeconst
? - Il ne donne pas le n ° de la ligne, l'avertissement que j'ai posté il y a le texte exact du compilateur.
- Vous aurez à expliquer cela à moi, je ne vois pas comment le constness de stringSize pourrait être impliqué dans quoi que ce soit ici.
- Il est clair que le compilateur essaie de faire un peu de code d'analyse pour déterminer si la boucle for dans ce cas peut avoir jamais variable d'index out of bounds. Je me demandais si peut-être il voit que la limite supérieure de l'index de la variable est comparée est non-const, et suppose que certains autres code d'ailleurs peut changer (et n'est pas assez intelligent pour voir qu'il n'y a pas de chemin de code qui pourrait conduire à ce sujet ici).
- En vue de la modifier à dire quelle ligne est-il, je suis plus confiant dans mon "compilateur bug" de la théorie. Je pense que le plus probable, c'est la
boost::is_any_of
, et c'est une itération sur la chaîne littérale et de déclencher une fausse lié avertissement pour une fin-de-pointeur sur le tableau. - Bonne théorie, il semble très plausible. En fait, j'ai rencontré quelque chose comme ça dans gcc, l'année dernière, c'était un peu plus facile à repérer cependant, ne pas être enterré dans le code du modèle.
- BTW, rien à voir avec votre question, mais je suis sûr que ma réponse au sujet de votre '\n' insert boucle étant dans l'erreur est droit, la boucle comme l'écrit ne pas diviser les lignes uniformément (qui, je suppose que vous avez voulu), et se termine trop tôt.
- J Buchanan: Oui j'ai vu ça aussi, au lieu de "stringSize" maintenant j'ai juste utiliser "retour à la ligne.taille()" à droite dans la boucle. Aussi, je init "insertPos = MAX_LINE_LENGTH - 1" à l'heure actuelle.
- Merci - j'ai ce problème aussi, et votre solution m'a aidé. Upvoted.
- Quelqu'un sait la raison de cet avertissement?
Vous devez vous connecter pour publier un commentaire.
Eu la même erreur. Comme une solution de contournement que j'ai remplacé
avec
ce qui pourrait également être légèrement plus efficace.
Pourrait avoir quelque chose à voir avec l'un ou plusieurs de ces GCC bugs:
GCC bugzilla résultats de la recherche pour "Avertissement: indice de tableau est au-dessus de limites de tableau"
Ne sont pas toutes valables, mais il y a quelques éléments fixes, si vous effectuez une recherche autour de, trop:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861
Donc je suis assez sûr qu'il y a quelque chose qui se passe là. Sur la base des commentaires, je vais essayer de compiler sans optimisation et de voir si elle s'en va.
J'ai eu une fausse limites d'alerte à l'aide de l'un des algorithmes standard (std::remove, je crois), et en passant itérateur paramètres:
qui j'en suis sûr, sont dans les limites acceptables. C'est seulement dans le marché de code, donc j'ai juste bodged autour d'elle. Si GCC est vraiment jeter de douteux avertissements, vous aurez juste à inspecter votre code extra-soigneusement jusqu'à ce qu'il soit corrigé.
Je remarque que votre boucle est en train de modifier la longueur de la chaîne, mais pas la mise à jour de la boucle de résiliation condition. Cela pourrait-il être la source de votre problème?