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

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

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

靜態(tài)代碼分析工具可簡化編碼過程,檢測出錯誤并幫助修復(fù)。有個國外團(tuán)隊檢測了 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)時我并不知道。更麻煩的是,這個項目乍一看還蠻簡單的。

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

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

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

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

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

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

正確的代碼:

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

建議:

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

我希望能給出更加實(shí)用的建議(來避免這些難以捕捉的錯誤),但是很遺憾我只能想到一條:使用靜態(tài)分析工具。當(dāng)然這還是不能保證你就不會犯錯了。但是至少這么做會讓你犯錯的幾率降低。如果當(dāng)年我有了這些工具,那我就絕對不會在 DllMain 里去調(diào)用我寫的那些代碼,那么我很可能就能節(jié)省大量時間,少死好多腦細(xì)胞。要知道,我對當(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)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

安龙县| 辰溪县| 福海县| 铁力市| 新和县| 嘉鱼县| 沙洋县| 贺兰县| 桑植县| 临汾市| 星子县| 碌曲县| 东乡| 裕民县| 固镇县| 青铜峡市| 平遥县| 搜索| 临城县| 斗六市| 阿克苏市| 敦煌市| 玛曲县| 荔浦县| 连江县| 扶沟县| 滨州市| 高密市| 阜平县| 阳西县| 和顺县| 于都县| 崇明县| 渝中区| 新蔡县| 赫章县| 宝山区| 钟祥市| 梅州市| 盐源县| 朝阳区|