C ++ GCC4.4 경고 : 배열 첨자는 배열 경계 위에 있습니다.
문제
최근에 GCC 4.4 (Mingw TDM 빌드)로 업그레이드했으며 이제 다음 코드가 다음과 같은 경고를 만듭니다.
멤버 함수 'void console :: print (const 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 ()에 대한 인수이다. String () 생성자로 래핑하여 경고가 사라지는데, 당신의 도움을 주신 모든 분들에게 감사합니다 :)
boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
해결책
같은 오류가 발생했습니다. 해결 방법으로 나는 교체했다
is_any_of(" ")
~와 함께
is_from_range(' ', ' ')
약간 더 효율적 일 수도 있습니다.
다른 팁
이러한 GCC 버그 중 하나 이상과 관련이있을 수 있습니다.
"경고 : 배열 첨자가 배열 경계 위에 있습니다"에 대한 GCC Bugzilla 검색 결과
그들 모두가 유효한 것은 아니지만 검색하면 고정 된 것도 있습니다.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861
그래서 나는 거기에 무슨 일이 일어나고 있다고 확신합니다. 의견을 바탕으로 최적화없이 컴파일을 시도하고 그것이 사라지는 지 확인합니다.
표준 알고리즘 중 하나 (std :: 제거, 생각)를 사용하여 반복자 매개 변수를 전달하는 가짜 바운드 경고를 받았습니다.
myarray,
myarray + sizeof(myarray)/sizeof(*myarray)
내가 확신하는 것은 한계에 있다고 확신합니다. 그러나 그것은 장난감 코드에만 있었다. 그래서 나는 단지 주위에 몸을 담았다. GCC가 실제로 Dodgy 경고를 던지는 경우 코드가 고정 될 때까지 코드를 특별하게 검사해야합니다.
여기서 루프가 문자열의 길이를 변경하지만 루프 종료 조건을 업데이트하지는 않습니다. 이것이 당신의 문제의 원천 일 수 있습니까?
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++;
}