Question

J'ai récemment mis à jour à GCC 4.4 (MinGW TDM build) et maintenant le code de suivi produit ces avertissements:

  

En fonction membre 'vide Console :: print (const std :: string &)':

     

avertissement: indice de tableau est au-dessus de limites de 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 );
        }
    }

Toutes les idées?


Ce sont les optimisations qui le font ...

En outre, il semble être cette ligne qui est à l'origine:

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

Ah oui, je l'ai trouvé, il est l'argument de boost :: is_any_of (), en l'enveloppant dans un constructeur string () l'avertissement va, je vous remercie tous pour votre aide:)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
Était-ce utile?

La solution

Vous avez la même erreur. Pour contourner ce problème, j'ai remplacé

is_any_of(" ")

avec

is_from_range(' ', ' ')

qui pourrait aussi être un peu plus efficace.

Autres conseils

pourrait avoir quelque chose à voir avec un ou plusieurs de ces bugs GCC:

GCC Bugzilla résultats de la recherche pour "Attention: est au-dessus souscript de tableau limites du tableau"

Tous ne sont valables, mais il y en fixe si vous effectuez une recherche autour aussi:

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

Je suis sûr qu'il ya quelque chose là-bas. Sur la base des commentaires, je vais essayer de compiler sans optimisation et voir si elle disparaît.

Je suis un faux limites d'avertissement en utilisant l'un des algorithmes standards (std :: supprimer, je pense) et passer des paramètres iterator:

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

que je suis assez sûr sont dans les limites. Il était seulement dans le code de jouet, bien que, si je viens bodged autour d'elle. Si GCC est vraiment lancer des avertissements louches que vous aurez juste à inspecter votre code extra-soigneusement jusqu'à ce qu'il soit fixé.

Je remarque votre boucle est en train de modifier ici la longueur de la chaîne, mais pas la mise à jour de la condition de terminaison de boucle. Serait-ce la source de votre problème?

   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++;
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top