欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2019年01月17日 08:30:02   作者:修語講編程  
今天小編就為大家分享一篇關(guān)于C++小知識:用合適的工具來分析你的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

靜態(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)鏈接

相關(guān)文章

  • C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系解析

    C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系解析

    這篇文章主要介紹了C語言之?dāng)?shù)組名與數(shù)組起始地址的關(guān)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言中進制知識匯總

    C語言中進制知識匯總

    在C語言里,整數(shù)有三種表示形式:十進制,八進制,十六進制。 其中以數(shù)字0開頭,由0~7組成的數(shù)是八進制。以0X或0x開頭,由0~9,A~F或a~f 組成是十六進制。除表示正負的符號外,以1~9開頭,由0~9組成是十進制。
    2016-05-05
  • C++利用代理模式實現(xiàn)遠程代理,虛擬代理和保護代理

    C++利用代理模式實現(xiàn)遠程代理,虛擬代理和保護代理

    今天給大家簡單介紹代理模式,一個很簡單的設(shè)計模式,旨在不改變原對象的情況下通過代理對象來控制對原對象的訪問。代理模式根據(jù)具體情況還可以分為遠程代理、虛擬代理、保護代理等,下面來介紹一下
    2023-04-04
  • Windows消息傳遞機制詳解

    Windows消息傳遞機制詳解

    這篇文章主要介紹了Windows消息傳遞機制,有助于讀者更好的理解windows編程的消息機制,需要的朋友可以參考下
    2014-07-07
  • C/C++?Qt?選擇夾TabWidget組件實現(xiàn)導(dǎo)航欄切換

    C/C++?Qt?選擇夾TabWidget組件實現(xiàn)導(dǎo)航欄切換

    Tab切換在很多地方都可以使用的到,本文就使用TabWidget組件來實現(xiàn)一下,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言實現(xiàn)隨機抽取紙牌

    C語言實現(xiàn)隨機抽取紙牌

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)隨機抽取紙牌,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++實現(xiàn)KFC點餐系統(tǒng)

    C++實現(xiàn)KFC點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)KFC點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 詳解C++ 編寫String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)

    詳解C++ 編寫String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)

    這篇文章主要介紹了詳解C++ 編寫String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)的相關(guān)資料,這里提供實例幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • C++報錯 XX does not name a type;field `XX’ has incomplete type的解決方案

    C++報錯 XX does not name a type;

    這篇文章主要給大家介紹了C++報錯 XX does not name a type;field `XX’ has incomplete type解決方案,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2023-08-08
  • C語言實現(xiàn)求解最小公倍數(shù)的算法示例

    C語言實現(xiàn)求解最小公倍數(shù)的算法示例

    這篇文章主要為大家介紹了C語言如何實現(xiàn)求解任意兩個正整數(shù)的最小公倍數(shù),文中采用了窮舉法和定理法。感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論