溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++小知識:用合適的工具來分析你的代碼

發(fā)布時間:2020-09-19 17:34:17 來源:腳本之家 閱讀:217 作者:修語講編程 欄目:編程語言

靜態(tài)代碼分析工具可簡化編碼過程,檢測出錯誤并幫助修復(fù)。有個國外團隊檢測了 200 多個 C/C++ 開源項目,包括了 Php、Qt 和 Linux 內(nèi)核等知名項目。于是他們每天分享一個錯誤案例,并給出相應(yīng)建議。今天的案例來自 LibreOffice 項目。

錯誤代碼

BOOL WINAPI DllMain( HINSTANCE hinstDLL,
  DWORD fdwReason, LPVOID lpvReserved )
{
 ....
 CreateThread( NULL, 0, ParentMonitorThreadProc,
 (LPVOID)dwParentProcessId, 0, &dwThreadId );
 ....
}

解釋:

很久以前,我曾經(jīng)在業(yè)余時間接過一些項目。有一次我就接了一個項目,但是最后沒有搞定。這個項目本身就有問題,但是當(dāng)時我并不知道。更麻煩的是,這個項目乍一看還蠻簡單的。

其實就是在 DllMain 方法中,當(dāng)某些條件觸發(fā)時,用 Windows API 函數(shù)實現(xiàn)一些功能。我記不太清楚要實現(xiàn)哪些功能了,但是肯定不難。

我花了大量時間做這個項目,但是代碼就是不工作。更糟糕的是,如果我創(chuàng)建一個標(biāo)準(zhǔn)的新應(yīng)用,這段代碼就沒問題,一旦我把代碼放到 DllMain 里去運行就不行。簡直是個謎,不是嗎?我最后還是沒有找出問題的根源。

多年以后的今天,我使用?PVS-Studio 開發(fā)工具后,我突然意識到當(dāng)年問題的原因。你瞧,其實 DllMain 函數(shù)能正確執(zhí)行的操作非常有限,因為(很多操作依賴的)DLL 庫并沒有被加載,所以你不能直接在 DllMain 里就直接執(zhí)行任意的操作。

我們現(xiàn)在有了診斷工具,可以提醒程序員在 DllMain 里直接用哪些操作是危險的?,F(xiàn)在我終于明白那時程序不能運行的原因了。

關(guān)于不能在 DllMain 里執(zhí)行哪些操作的更多細節(jié),可以查看(PVS-Studio)關(guān)于 V718 診斷信息的描述。

所以,上面那段 LibreOffice 的代碼片段很可能就無法工作。它能不能正常執(zhí)行完全要靠運氣。

正確的代碼:

要修復(fù)這類錯誤其實很難。你需要重構(gòu)整個代碼邏輯,讓 DllMain 函數(shù)里的操作越簡潔越好。

建議:

對于這類問題并沒有什么特別的建議。你不可能什么都知道,每個人總有一天都會遇到類似的謎題。我認為一個比較普遍的建議是這樣的:請仔細地閱讀和工作相關(guān)的各種文檔。但你還是要明白,人們無法預(yù)測每一個可能出現(xiàn)的問題。如果你把所有的時間都拿去閱讀文檔了,那又怎么有時間去編程呢?即使你已經(jīng)讀了很多頁的文檔,你也不確認有沒有漏看了某個文檔,而它是可以讓你免于犯錯的。

我希望能給出更加實用的建議(來避免這些難以捕捉的錯誤),但是很遺憾我只能想到一條:使用靜態(tài)分析工具。當(dāng)然這還是不能保證你就不會犯錯了。但是至少這么做會讓你犯錯的幾率降低。如果當(dāng)年我有了這些工具,那我就絕對不會在 DllMain 里去調(diào)用我寫的那些代碼,那么我很可能就能節(jié)省大量時間,少死好多腦細胞。要知道,我對當(dāng)時沒能搞定那個任務(wù)一直耿耿于懷!

這個錯誤由 PVS-Studio 靜態(tài)分析工具捕獲。錯誤文本:V718:“CreateThread”方法不應(yīng)該在“DllMain”方法中調(diào)用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對億速云的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI