最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++小知識(shí):用合適的工具來(lái)分析你的代碼

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

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

錯(cuò)誤代碼

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

解釋:

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

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

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

多年以后的今天,我使用?PVS-Studio 開發(fā)工具后,我突然意識(shí)到當(dāng)年問(wèn)題的原因。你瞧,其實(shí) DllMain 函數(shù)能正確執(zhí)行的操作非常有限,因?yàn)椋ê芏嗖僮饕蕾嚨模〥LL 庫(kù)并沒(méi)有被加載,所以你不能直接在 DllMain 里就直接執(zhí)行任意的操作。

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

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

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

正確的代碼:

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

建議:

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

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

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

總結(jié)

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

相關(guān)文章

  • Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt中需要用到自定義委托的情形很多,比如提供下拉框選擇,進(jìn)度條展示下載進(jìn)度啥的,默認(rèn)的單元格是沒(méi)有這些效果的,需要自己?jiǎn)为?dú)用委托的形式來(lái)展示。本文將為大家介紹Qt中如何進(jìn)行超級(jí)自定義委托,需要的可以參考一下
    2022-03-03
  • 深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)

    深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)

    本篇文章是對(duì)linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C++編程中的條件判斷語(yǔ)句if-else與switch的用法

    詳解C++編程中的條件判斷語(yǔ)句if-else與switch的用法

    這篇文章主要介紹了C++編程中的條件判斷語(yǔ)句if-else與switch的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • Qt實(shí)現(xiàn)簡(jiǎn)單折線圖表

    Qt實(shí)現(xiàn)簡(jiǎn)單折線圖表

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)簡(jiǎn)單折線圖表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言中.與->的區(qū)別詳細(xì)解析

    C語(yǔ)言中.與->的區(qū)別詳細(xì)解析

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中.與->區(qū)別的相關(guān)資料,這雖然是個(gè)小問(wèn)題,但有時(shí)候很容易讓人迷惑,因?yàn)橛械臅r(shí)候用混淆了,程序編譯不通過(guò),需要的朋友可以參考下
    2023-06-06
  • C++命名空間實(shí)例解析

    C++命名空間實(shí)例解析

    這篇文章主要介紹了C++命名空間實(shí)例解析,對(duì)C++程序員來(lái)說(shuō)是非常重要的知識(shí)點(diǎn),需要的朋友可以參考下
    2014-08-08
  • C++面試八股文之智能指針詳解

    C++面試八股文之智能指針詳解

    智能指針是C++11引入的類模板,用于管理資源,行為類似于指針,但不需要手動(dòng)申請(qǐng)、釋放資源,本文主要為大家介紹了它的相關(guān)知識(shí),需要的可以參考一下
    2023-06-06
  • C語(yǔ)言實(shí)現(xiàn)的猜數(shù)字小游戲

    C語(yǔ)言實(shí)現(xiàn)的猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)的猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C語(yǔ)言版猜數(shù)字小游戲

    C語(yǔ)言版猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配

    C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配

    C++ 不允許變量重名,但是允許多個(gè)函數(shù)取相同的名字,只要參數(shù)表不同即可,這叫作函數(shù)的重載,下面這篇文章主要給大家介紹了關(guān)于C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配的相關(guān)資料,需要的朋友可以參考下
    2019-01-01

最新評(píng)論

石屏县| 潮州市| 乌兰察布市| 沅陵县| 萨嘎县| 栾川县| 临沂市| 怀来县| 青铜峡市| 镇平县| 浦城县| 西宁市| 庄河市| 台湾省| 察雅县| 岫岩| 印江| 余江县| 定南县| 东平县| 百色市| 田东县| 虞城县| 惠安县| 榆树市| 西城区| 佛学| 贡觉县| 永胜县| 宜川县| 新干县| 澳门| 宜州市| 正安县| 安丘市| 潞城市| 通海县| 和顺县| 普兰县| 象山县| 桂平市|