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 comme const?
  • 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?

InformationsquelleAutor Adam | 2009-07-22