2009-07-22 32 views
7

我最近升級到GCC 4.4(MinGW的TDM版本)和現在後續的代碼產生這些警告:C++ GCC4.4警告:數組下標是以上數組界限

在成員函數「無效控制檯::打印(常量的std :: string &)':

警告:數組下標是以上數組界限

下面的代碼:

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

任何想法?


這是正在做的優化...

而且它似乎是這條線,這是造成它:

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

是啊,我發現它,它是boost :: is_any_of()的參數,通過將它包裝在一個字符串()構造函數中,警告消失,謝謝大家的幫助:)

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

推測編譯器也給出了錯誤的行號?請通過評論在您的代碼中註明。 – 2009-07-22 22:03:59

回答

3

得到了同樣的錯誤。作爲一種變通方法我更換

is_any_of(" ") 

is_from_range(' ', ' ') 

這也可能會略微高效。

1

我注意到你的循環在這裏改變了字符串的長度,但沒有更新循環終止條件。這可能是你問題的根源嗎?

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

可能有些事情要與一個或多個這些GCC的bug:

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

不是所有的人都是有效的,但也有,如果你搜索周圍,也有些固定的:

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

所以我敢肯定有東西對那裏發生的。基於評論,我會嘗試編譯沒有優化,看看它是否消失。

我使用的標準算法(的std ::去掉,我認爲),通過迭代器參數,一個虛假的界限警告:

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

,我敢肯定是界限。不過,只是在玩具代碼中,所以我只是繞過它。如果海灣合作委員會真的在投擲狡猾的警告,那麼你只需要仔細檢查你的代碼,直到它被修復。