2010-08-08 75 views
10

我正在用gingw gcc 4.4.0試驗gcov。我得到了一些有趣但奇怪的結果。一個常見的模式是這樣的......如何從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得到理智的覆蓋結果?

編輯

到目前爲止,我想我需要設置以下附加標誌...

  • -fno默認的內聯
  • -fno內聯

我不確定這些都是需要的,但我認爲他們都禁用了不同的特定類型的內聯。

雖然我還沒有找到任何方法來禁用返回值優化。這不是一個大問題,但是這有點麻煩。當瞄準100%的覆蓋率時,一些真正達到100%的文件會因爲這個問題而少報。 grep可以找到#####標記並顯示它們是否適用於return聲明,但仍需要進行一些目視檢查以檢查問題是純粹的RVO。

+2

添加-fno-elide-constructors是否有幫助? – Mat 2011-03-05 18:17:29

+0

@Mat - 我會檢查,但我今天很忙 – Steve314 2011-03-07 09:50:59

+0

也許你的功能是內聯的。嘗試使用-O0進行編譯。 – whoplisp 2011-07-03 18:11:30

回答

3

正如Mat評論中所建議的那樣,選項-fno-elide-constructors解決了此問題。

這個答案發布是爲了讓這個古老的問題關閉。如果Mat發佈了答案,我會刪除它並將接受切換爲該答案。