Frage

Ich habe kürzlich auf GCC 4.4 (Mingw TDM Build) aktualisiert, und jetzt erzeugt der folgende Code diese Warnung:

In der Mitgliedsfunktion 'void console :: print (const std :: string &)':

WARNUNG: Array -Index ist über Array -Grenzen

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 ...

Es scheint auch diese Zeile zu sein, die sie verursacht:

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

Ah ja, ich habe es gefunden, es ist das Argument für Boost :: is_any_of (), indem ich es in einen String () -Konstruktor einwickelte. Die Warnung geht weg. Vielen Dank für Ihre Hilfe :)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
War es hilfreich?

Lösung

Habe den gleichen Fehler. Als Problemumgehung habe ich ersetzt

is_any_of(" ")

mit

is_from_range(' ', ' ')

das könnte auch etwas effizienter sein.

Andere Tipps

Könnte etwas mit einem oder mehreren dieser GCC -Fehler zu tun haben:

GCC -Bugzilla -Suchergebnisse für "Warnung: Array -Index ist über Array -Grenzen".

Nicht alle von ihnen sind gültig, aber es gibt einige feste, wenn Sie auch herum suchen:

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

Ich bin mir also ziemlich sicher, dass dort etwas los ist. Basierend auf den Kommentaren würde ich versuchen, ohne Optimierung zu kompilieren und zu sehen, ob es verschwindet.

Ich habe eine falsche Grenzen mit einem der Standardalgorithmen (std :: entfernen, glaube ich) und übergebene Iteratorparameter:

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

Ich bin mir ziemlich sicher, dass sie in Grenzen sind. Es war jedoch nur im Spielzeugcode, also habe ich es einfach umgegangen. Wenn GCC wirklich zwielichtige Warnungen wirft, müssen Sie Ihren Code nur außer Kraft setzen, bis er behoben ist.

Ich stelle fest, dass Ihre Schleife hier die Länge der Zeichenfolge verändert, aber die Schleifenbeendungsbedingung nicht aktualisiert. Könnte dies die Quelle 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++;
   }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top