문제

최근에 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++;
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top