2012-03-23 121 views
2

我正在爲下面的一段代碼獲得一個覆蓋率靜態檢查器工具警告。Coverity中溢出的返回值警告

double value = 0; 
    std::string origValue("0.50"); 
    value = 0.10 * boost::lexical_cast<double>(origValue); 

該警告爲「溢出返回值(INTEGER_OVERFLOW)」。我無法理解上面的代碼有什麼問題。當我使用雙打時,整數溢出是如何發揮作用的?謝謝。

+0

究竟哪一行是Coverity警告?我在這段代碼中看到的唯一整數是你正在分配給'value'的整數文字'0'。如果將行更改爲double value = 0.0,會發生什麼情況? – teukkam 2012-03-23 14:03:28

+0

警告是這樣的:「乘法運算在操作數上溢出」0.10「和」boost :: lexical_cast 「。因此,將值改爲double將無濟於事。 – polapts 2012-03-23 14:29:46

+0

可能是Boost的lexical_cast實現內的某些東西。如果將值更改爲一個長雙? – teukkam 2012-03-23 14:39:39

回答

6

這個特殊的Coverity靜態分析檢查器正在尋找兩件事:可能溢出特定值的操作(它將嘗試在解釋中給出示例)和不安全地使用可能截斷的值。

UI向您顯示「事件」,它解釋了爲什麼被標記。手冊描述了每個事件的含義。在你的情況下,你要查找的兩個事件是第一個事件的「截斷」或「溢出」,第二個事件的「溢出」。

代碼片斷顯示轉換爲double的字符串乘以常量,然後分配給另一個double。也許在那裏沒有問題,但是,「溢出返回值」缺陷標題告訴我們,您有第二個事件從此函數返回此值。如果你從這個函數中返回「value」並且返回類型不是double(可能是32位類型),那麼你的代碼中有一個潛在的錯誤(顯然不是你顯示的具體值,但是如果string可以是一個更大的價值)。如果函數返回double,那麼在分析中它是一個誤報,您可以在UI中將其標記爲這樣,以便缺陷不會再顯示給您。

沒有看到更多的代碼,很難說是否存在真正的問題,但請記住,靜態分析無法知道運行時值是什麼(字符串是否真的是恆定的或者是動態讀取的? ),但這就是爲什麼它給了你詳細的事件,而不僅僅是一個行的總結 - 所以你可以評估這個代碼中出現真正問題的可能性。

說了這麼多,檢查器不應該跟蹤浮動,所以這裏Coverity肯定存在一個錯誤。因爲我碰巧爲他們工作,所以我已經提出這個問題,但也可以隨時向Coverity支持部門報告。

+0

謝謝。函數返回double,所以我認爲它是false positive – polapts 2012-03-26 08:58:29

+0

是的,我確認這不應該被標記 - 希望它將在未來版本的分析中被修復。 – 2012-03-28 01:28:23