2009-07-22 8 views
7

I récemment mis à jour à GCC 4.4 (MinGW TDM build) et maintenant le code de suivi produit des mises en garde:C++ avertissement GCC4.4: souscript de tableau est au-dessus des limites du tableau

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

avertissement: est au-dessus souscript de tableau 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?


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é , c'est l'argument pour boost :: is_any_of(), en l'enveloppant dans un constructeur string() l'avertissement s'en va, merci à tous pour votre aide :)

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

Vraisemblablement, le compilateur a également donné un numéro de ligne pour l'erreur? Veuillez l'indiquer dans votre code via un commentaire. –

+2

Par curiosité, le fait-il toujours si vous déclarez 'stringSize' comme' const'? –

+0

Il ne donne pas la ligne #, l'avertissement que j'ai posté il y a le texte exact du compilateur. – Adam

Répondre

3

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.

1

Je remarque que votre boucle ici modifie la longueur de la chaîne, mais ne met pas à jour la condition de fin de la boucle. Cela pourrait-il être 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++; 
    } 
3

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

GCC bugzilla search results for "Warning: array subscript is above array bounds"

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, j'essaierais de compiler sans optimisation et de voir si ça s'en va.

J'ai reçu un avertissement de bornes parasites en utilisant l'un des algorithmes standards (std :: supprimer, je pense) et les paramètres de iterator passant:

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

que je suis assez sûr sont dans les limites. C'était seulement dans le code du jouet, donc je me suis contenté de le contourner. Si GCC lance vraiment des avertissements douteux, vous devrez juste inspecter votre code avec précaution jusqu'à ce qu'il soit corrigé.

Questions connexes