2009-07-22 10 views
7

ja niedawno zmodernizowane do GCC 4.4 (MinGW TDM build), a teraz kod obserwacji produkuje te ostrzeżenie:C++ ostrzeżenie GCC4.4: indeks tablicy jest powyżej granice tablicy

W konsoli :: void print funkcja składowa” (const std :: string &) ':

ostrzeżenie: indeks tablicy jest powyżej granice tablicy

Oto kod:

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); 
     } 
    } 

Jakieś pomysły?


Jest optymalizacje, które to robią ...

również wydaje się być to linia, która jest przyczyną go:

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

Ach tak, znalazłem go , jest argumentem dla boost :: is_any_of(), przez zawinięcie go w konstruktorze string() ostrzeżenie odchodzi, dziękuję wszystkim za pomoc :)

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

Prawdopodobnie kompilator podał również numer linii dla błędu? Proszę podać go w swoim kodzie za pomocą komentarza. –

+2

Z ciekawości, czy nadal to robi, jeśli zadeklarujesz 'stringSize' jako' const'? –

+0

To nie daje linii #, ostrzeżenie, które tam wysłałem, to dokładny tekst z kompilatora. – Adam

Odpowiedz

3

Wystąpił ten sam błąd. Jako obejście Wymieniłem

is_any_of(" ") 

z

is_from_range(' ', ' ') 

który może również być nieco bardziej wydajne.

1

Zauważam, że tutaj twoja pętla zmienia długość łańcucha, ale nie aktualizuje warunku zakończenia pętli. Czy to może być źródłem Twojego problemu?

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

może mieć coś wspólnego z jednego lub większej liczby tych błędów GCC:

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

nie wszystkie z nich są ważne, ale istnieją pewne środki te Jeśli wyszukujesz wokół też:

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

Więc jestem całkiem pewny, że coś się tam dzieje. Na podstawie komentarzy spróbowałbym skompilować bez optymalizacji i sprawdzić, czy zniknie.

mam fałszywe ostrzeżenie Granice obszaru przy użyciu jednego ze standardowych algorytmów (std :: usunąć, chyba) i przekazywania parametrów iterator:

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

których jestem całkiem pewny, że są w granicach. Było to tylko w zabawkowym kodzie, więc po prostu się nim zajmuję. Jeśli GCC naprawdę rzuca podejrzane ostrzeżenia, musisz po prostu dokładnie sprawdzić swój kod, dopóki nie zostanie naprawiony.

Powiązane problemy