2010-08-08 3 views
10

gcov mingw gcc 4.4.0을 사용하여 실험하고 있습니다. 흥미롭지 만 이상한 결과를 얻었습니다. 일반적인 패턴은 gcov에서 더 정확한 결과를 얻으려면 어떻게해야합니까?

 5162: 66: std::string::iterator i = l_Temp.begin(); 
    5162: 67: std::string::iterator j = l_Temp.end() - 1; 
     -: 68: char ch; 
     -: 69: 
    20564: 70: while (i < j) 
     -: 71: { 
    10240: 72: ch = *i; *i = *j; *j = ch; i++; j--; 
     -: 73: } 
     -: 74: 
    #####: 75: return l_Temp; 
     -: 76:} 

어떻게 그 return 직전 명확 루프가 모두 실행하고 종료 할 것을 주어, 전혀 exected 수 없습니다 ... 이런 일입니까? 나는이 임시 변수가 std::string 유형이라는 것을 감안할 때 반환 값 최적화의 희생자라고 생각합니다.

문제는 이미 컴파일러 옵션에 -O0을 지정하고 있습니다. 이들은

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage 

내 추측은 모든 최적화는 결국 -O0으로 사용하는 것입니다 ... 내가 사용하고 정확한 컴파일러 플래그입니다. 내가 문제를 발견 할 때 특정 최적화 플래그를 하나씩 찾아 내려고 시작할 수는 있지만 이것은해야 할 이상한 일입니다.

그래서 어떤 플래그가 이되어야합니까? gcov의 정상적인 적용 결과를 얻으려면 어떻게 지정해야합니까?

지금까지, 나는 다음과 같은 추가 플래그를 필요가 있다고 생각 EDIT ...

  • -fno-기본 인라인
  • -fno-인라인

나는 그들이 각각 다른 유형의 인라인을 사용하지 못하게한다고 생각하지만 이것들이 모두 필요하다는 것을 확신하지 못한다.

반환 값 최적화를 비활성화하는 방법을 찾지 못했습니다. 이것은 큰 문제는 아니지만 약간의 성가심입니다. 100 % 적용 범위를 목표로 할 때 실제로 100 %를 달성하는 일부 파일은이 문제 때문에 더 적게보고됩니다. grep이 ##### 마커를 찾고 return 진술에 해당하는지 표시 할 수 있지만 문제가 순전히 RVO인지 확인하기 위해 육안 검사를해야합니다.

+2

-fno-elide-constructors를 추가하면 어떤 도움이됩니까? – Mat

+0

@Mat - 확인 하겠지만 오늘은 바쁩니다 – Steve314

+0

아마도 함수가 인라인되어있을 수 있습니다. -O0으로 컴파일 해보십시오. – whoplisp

답변

3

Mat의 의견에서 제안한대로 -fno-elide-constructors 옵션을 사용하면이 문제를 해결할 수 있습니다.

이 답변은 이미 고대 질문이 종료되도록 게시되었습니다. 매트가 답변을 게시하면이를 삭제하고 수락을 전환합니다.