我正在用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。
添加-fno-elide-constructors是否有幫助? – Mat 2011-03-05 18:17:29
@Mat - 我會檢查,但我今天很忙 – Steve314 2011-03-07 09:50:59
也許你的功能是內聯的。嘗試使用-O0進行編譯。 – whoplisp 2011-07-03 18:11:30