2009-07-22 5 views
7

ich auf GCC 4.4 kürzlich aktualisiert (MinGW TDM build) und nun die Folge Code erzeugt diese Warnung:C++ GCC4.4 Warnung: Array-Index ist über Feldgrenzen

In Memberfunktion ‚Leere Console :: print (const std :: string &) ':

Warnung: Array-Index ist über Feldgrenzen

Hier ist der 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); 
     } 
    } 

Irgendwelche Ideen?


Es sind die Optimierungen, die es tun ...

Auch diese Linie zu sein, scheint es, die es verursacht wird:

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

Ah ja, ich fand es , es ist das Argument für boost :: is_any_of(), indem es in einen string() - Konstruktor eingepackt wird, verschwindet die Warnung, danke Ihnen allen für Ihre Hilfe :)

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

Vermutlich gab der Compiler auch eine Zeilennummer für den Fehler? Bitte geben Sie dies in Ihrem Code durch einen Kommentar an. –

+2

Aus Neugier, macht es immer noch, wenn Sie 'stringSize' als' const' deklarieren? –

+0

Es gibt nicht die Zeile #, die Warnung, die ich dort postete, ist der genaue Text vom Compiler. – Adam

Antwort

3

Bekam den gleichen Fehler. Ich ersetzte Als Abhilfe können

is_any_of(" ") 

mit

is_from_range(' ', ' ') 

die auch etwas effizienter sein könnte.

1

Ich bemerke, dass Ihre Schleife hier die Länge der Zeichenkette ändert, aber nicht die Schleifenbeendigungsbedingung aktualisiert. Könnte dies die Ursache Ihres Problems sein?

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

Könnte etwas mit einem oder mehreren dieser GCC Bugs zu tun:

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

nicht alle von ihnen gültig sind, aber es gibt einige feste, wenn Du um suchen, auch:

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

So bin ich mir ziemlich sicher, dass es etwas los. Basierend auf den Kommentaren würde ich versuchen, ohne Optimierung zu kompilieren und zu sehen, ob es weggeht.

habe ich eine falsche Grenzen Warnung eine der Standard-Algorithmen (std :: entfernen, glaube ich) und vorbei Iterator Parameter:

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

, die ich ziemlich sicher bin, sind in Grenzen. Es war nur im Spielzeugcode, also habe ich mich einfach darum gekümmert. Wenn GCC wirklich zwielichtige Warnungen ausgibt, müssen Sie Ihren Code nur extra sorgfältig prüfen, bis er behoben ist.

Verwandte Themen