91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用靜態(tài)分析查找并發(fā)錯誤

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Paul Anderson ? 2022-06-19 10:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

盡管幾十年來小型化的進步已經為單處理器帶來了巨大的性能提升,但這個時代似乎即將結束。使用單芯片實現(xiàn)顯著額外性能的最佳選擇是通過多個內核,但前提是軟件可以編程以利用它們。

不幸的是,并發(fā)編程很困難。即使是只熟悉單線程編程的專家級程序員也常常無法理解并發(fā)程序容易受到諸如競爭條件、死鎖和饑餓等全新類別的缺陷的影響。人類很難推理并發(fā)程序,并且編程語言本身的某些方面不適合并發(fā)。因此,專家們經常偶然發(fā)現(xiàn)這些危害。以下討論描述了常見的并發(fā)缺陷,并解釋了靜態(tài)分析工具如何在不執(zhí)行程序的情況下發(fā)現(xiàn)此類缺陷。

競爭條件的后果

當多個執(zhí)行線程訪問一個共享的數據并且其中至少一個線程在沒有顯式同步操作來分離訪問的情況下更改該數據的值時,就會出現(xiàn)競爭條件。根據兩個線程的交錯,系統(tǒng)可能會處于不一致的狀態(tài)。

種族條件特別陰險,因為它們可以無限期地潛伏而未被發(fā)現(xiàn),并且只在極少數情況下出現(xiàn),表現(xiàn)出難以診斷和重現(xiàn)的神秘癥狀。特別是,它們很可能通過對已部署軟件的測試而存活下來。充其量,這意味著增加開發(fā)時間;在最壞的情況下,后果可能是毀滅性的。

2003 年東北大停電如此普遍的一個原因是計算機化能源管理系統(tǒng)中的競爭條件導致向運營商傳達誤導性信息。正如 Kevin Poulsen 在 2004 年的一篇文章 ( www.securityfocus.com/news/8412 ) 中指出的那樣,“該漏洞有一個以毫秒為單位的機會窗口?!?在測試過程中出現(xiàn)此類問題的可能性微乎其微。在另一種情況下,iOS 4.0 到 4.1(現(xiàn)已修復)中的競爭條件意味著任何可以物理訪問 iPhone 3G 或更高版本的人都可以在某些條件下繞過其密碼鎖定。

圖 1 顯示了一個簡單競爭條件的示例。帶有入口和出口傳感器的制造裝配線維護當前生產線上的項目的運行計數。每次項目進入行時,此計數都會增加,每次項目到達行尾并退出時,此計數就會減少。如果一個項目在另一個項目退出的同時進入該行,則計數應該遞增然后遞減(或反之亦然),以使凈變化為零。但是,正常的遞增和遞減不是原子操作;它們由一系列單獨的指令組成,這些指令首先從內存中加載值,然后在本地對其進行修改,最后將其存儲回內存中。如果更新事務是在沒有足夠保護措施的多線程系統(tǒng)中處理的,由于傳感器讀取和寫入共享數據:計數,因此可能會出現(xiàn)競爭條件。圖 1 中的交錯導致錯誤計數為 69。也有可能導致錯誤計數為 71 的交錯,以及一些正確導致計數為 70 的交錯。

圖 1:競爭條件導致裝配線上的項目計數不正確。

poYBAGKug2yAZX4YAAFML_Us9r8240.png

對于這個例子和一般的競爭條件錯誤,標準調試技術可能由于幾個原因而無效。

很少發(fā)生意味著發(fā)現(xiàn)問題的機會減少。如果問題不經常出現(xiàn),它可能永遠不會在測試期間出現(xiàn)。這個問題是雙重的。首先,兩個線程中可能的指令交錯數量可能很大,并且隨著指令數量的增加而急劇增加。這種現(xiàn)象被稱為組合爆炸。如果線程 A 執(zhí)行M條指令,線程 B 執(zhí)行N條指令,則兩個線程的可能交錯為:

等式 1

pYYBAGKug3OAajrHAAAvbcFv1Vc399.png

例如,給定兩個普通線程,每個線程有 10 條指令,則指令有 184,756 種可能的交錯?,F(xiàn)實世界的軟件龐大而復雜;測試每一個交織是根本不可能的。其次,即使測試人員可以識別出一些值得檢查的交錯,也很難設置測試用例來確保它們確實發(fā)生,因為線程調度可能是高度不確定的。

如果詳盡的測試難以解決,那么開發(fā)人員可以做什么?一種非常有用的方法是靜態(tài)分析。CodeSonar 等高級靜態(tài)分析工具使用高度復雜的符號執(zhí)行技術同時考慮許多可能的執(zhí)行路徑和交錯。這些技術可以在不需要執(zhí)行程序的情況下找到競爭條件和其他并發(fā)錯誤。

有幾個因素使比賽狀況診斷變得困難。首先,癥狀可能令人困惑。在圖 1 示例中,運行計數通常是正確的,但有時太高,有時太低。其次,不習慣考慮多線程編程的特定缺陷的程序員可能會在可能出現(xiàn)競爭條件之前花費大量時間對代碼感到困惑。高級靜態(tài)分析工具在這方面特別有用。他們通過檢查共享內存位置的訪問模式來識別競爭條件;也就是說,他們關注的是種族本身,而不是它的癥狀。當識別出競爭條件時,高級靜態(tài)分析工具將報告它以及支持信息,以幫助用戶進行評估和調試。程序員的負擔大大減輕。

更復雜,更多錯誤

競爭條件通常通過使用鎖來保護共享資源來避免。但是,鎖可能會引入性能瓶頸,可能會阻止程序充分利用多核的潛力,因此程序員在使用它們時必須小心謹慎。編寫有效使用鎖的代碼可能很棘手,這種復雜性可能導致一組不同的問題,即死鎖和饑餓。

在死鎖中,兩個或多個線程相互阻止,因為每個線程都持有另一個線程需要的鎖。圖 2 顯示了如何使用用于保護兩個共享變量的兩個鎖出現(xiàn)死鎖。在此示例中,多條裝配線共享當前正在裝配的項目總數,第二個 bad_items 值記錄有多少成品未通過質量控制。一個線程在 count 上獲得鎖,另一個在 bad_items 上獲得鎖。兩個線程都無法獲得它需要的第二個鎖;因此既不能執(zhí)行它的操作,也不能到達釋放鎖的地步。由于兩個更新都無法完成,因此兩個線程都完全卡住了。

圖 2:在兩個線程之間的死鎖中,兩個線程都無法前進。

poYBAGKug3yAXQzhAAIy7ley9hk593.png

靜態(tài)分析工具可以通過標記不同線程可以以不同順序獲取相同鎖的情況來識別存在死鎖風險的軟件,例如圖 2 中所示的線程。消除所有此類情況足以確保系統(tǒng)不會陷入死鎖。

饑餓是使用鎖的多線程程序中發(fā)生的另一個問題。如果一個線程正在等待另一個線程當前持有的資源需要很長時間,它可能會餓死。例如,假設上述制造自動化系統(tǒng)包括一個定期審核線程,該線程檢查所有進入和退出記錄,以確保運行計數與進入的總項目數相匹配,而不是退出的總項目數。審計線程需要鎖定計數和所有傳感器,因此所有更新都必須等待審計完成。如果審核運行很長時間,更新可能會顯著延遲。如果運行時間過長,下一次審計可能會設法獲取所有鎖并在未完成的線程取得任何進展之前開始運行。在最壞的情況下,部分或全部更新可能永遠沒有機會運行。

靜態(tài)分析可以通過提出諸如“在持有鎖時是否調用長時間運行的庫函數?”之類的問題來提供重要的價值。CodeSonar 等工具還為用戶提供了添加自己檢查的機制。如果已知內部函數 f() 具有較長的運行時間,工程師可以添加自定義檢查,每當持有一個或多個鎖的線程調用 f() 時觸發(fā)警告。

多線程為嵌入式開發(fā)人員必須考慮的潛在錯誤添加了全新的類別,使得查找各種錯誤變得更加困難。最新一代的靜態(tài)分析工具可以幫助解決這兩個問題。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2576

    文章

    55041

    瀏覽量

    791383
  • 嵌入式
    +關注

    關注

    5198

    文章

    20449

    瀏覽量

    334114
  • 計算機
    +關注

    關注

    19

    文章

    7807

    瀏覽量

    93205
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Go 語言高并發(fā)服務設計與性能調優(yōu)實戰(zhàn):從萬級到百萬級并發(fā)的演進之路

    在2026年的今天,Go 語言已成為高并發(fā)后端服務的首選語言。根據 Stack Overflow 最新開發(fā)者調查: 指標 數據 Go 語言采用率 后端服務中占比 42% 平均并發(fā)能力 單節(jié)點
    發(fā)表于 02-18 19:19

    一文說透了如何實現(xiàn)單片機的多任務并發(fā)!

    在嵌入式系統(tǒng)開發(fā)中,多任務并發(fā)是非常常見的,對于處理復雜的應用場景、提升系統(tǒng)的并發(fā)能力、提高系統(tǒng)的實時性等方面都有很大好處。在單片機中實現(xiàn)多任務并發(fā)是非常重要的,本文將為大家介紹如何在單片機中實現(xiàn)
    發(fā)表于 01-06 06:46

    鎖存器中的時間借用概念與靜態(tài)時序分析

    對于基于鎖存器的設計,靜態(tài)時序分析會應用一個稱為時間借用的概念。本篇博文解釋了時間借用的概念,若您的設計中包含鎖存器且時序報告中存在時間借用,即可適用此概念。
    的頭像 發(fā)表于 12-31 15:25 ?5501次閱讀
    鎖存器中的時間借用概念與<b class='flag-5'>靜態(tài)</b>時序<b class='flag-5'>分析</b>

    C語言中除數為0屬于什么錯誤

    在源程序的編寫時往往會出一些錯誤,這些錯誤大致分為靜態(tài)錯誤和動態(tài)錯誤兩類。 所謂動態(tài)錯誤:邏輯
    發(fā)表于 12-08 06:38

    什么是CVE?如何通過SAST/靜態(tài)分析工具Perforce QAC 和 Klocwork應對CVE?

    本文將為您詳解什么是CVE、CVE標識符的作用,厘清CVE與CWE、CVSS的區(qū)別,介紹CVE清單內容,并說明如何借助合適的靜態(tài)分析工具(如Perforce QAC/Klocwork),在軟件開發(fā)早期發(fā)現(xiàn)并修復漏洞。
    的頭像 發(fā)表于 10-31 14:24 ?525次閱讀
    什么是CVE?如何通過SAST/<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b>工具Perforce QAC 和 Klocwork應對CVE?

    分析負載特性時,有哪些常見的錯誤或誤區(qū)?

    分析負載特性時,很多人會因 “想當然套用經驗”“忽略實際場景細節(jié)” 或 “混淆概念” 導致判斷偏差,進而讓報警閾值調整失效(如誤報、漏報)。以下是 6 個最常見的錯誤 / 誤區(qū),附錯誤表現(xiàn)、危害
    的頭像 發(fā)表于 10-10 17:03 ?811次閱讀

    國巨貼片電容的電壓標識有哪些常見錯誤?

    國巨貼片電容的電壓標識在識別和使用過程中可能存在一些常見錯誤,這些錯誤可能源于標識本身的模糊性、不同系列產品的差異、對標識規(guī)則的誤解,或使用環(huán)境的影響。以下是具體分析: 一、標識模糊或缺失導致的
    的頭像 發(fā)表于 08-28 16:51 ?757次閱讀

    知識分享 | 使用MXAM進行AUTOSAR模型的靜態(tài)分析:Embedded Coder與TargetLink模型

    知識分享在知識分享欄目中,我們會定期與讀者分享來自MES模賽思的基于模型的軟件開發(fā)相關Know-How干貨,關注公眾號,隨時掌握基于模型的軟件設計的技術知識。使用MXAM進行AUTOSAR模型的靜態(tài)
    的頭像 發(fā)表于 08-27 10:04 ?730次閱讀
    知識分享 | 使用MXAM進行AUTOSAR模型的<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b>:Embedded Coder與TargetLink模型

    Nginx高并發(fā)優(yōu)化方案

    作為一名在生產環(huán)境中摸爬滾打多年的運維工程師,我見過太多因為Nginx配置不當導致的性能瓶頸。今天分享一套完整的Nginx高并發(fā)優(yōu)化方案,幫助你的系統(tǒng)從10萬QPS突破到百萬級別。
    的頭像 發(fā)表于 08-13 15:51 ?1011次閱讀

    汽車軟件團隊必看:基于靜態(tài)代碼分析工具Perforce QAC的ISO 26262合規(guī)實踐

    ISO 26262合規(guī)指南,從ASIL分級到工具落地,手把手教你用靜態(tài)代碼分析(Perforce QAC)實現(xiàn)高效合規(guī)。
    的頭像 發(fā)表于 08-07 17:33 ?1145次閱讀
    汽車軟件團隊必看:基于<b class='flag-5'>靜態(tài)</b>代碼<b class='flag-5'>分析</b>工具Perforce QAC的ISO 26262合規(guī)實踐

    動態(tài)BGP與靜態(tài)BGP的區(qū)別?

    的 IP,只要遠端發(fā)起 BGP 握手,且來自 AS 65002,即自動建立對等關系。四、實戰(zhàn)應用場景分析場景一:傳統(tǒng)運營商邊界路由器 使用靜態(tài) BGP BGP 對等關系固定,變化極少 需要手動管理
    發(fā)表于 06-24 06:57

    鴻蒙5開發(fā)寶藏案例分享---應用并發(fā)設計

    ?** 鴻蒙并發(fā)編程實戰(zhàn)指南:解鎖ArkTS多線程黑科技** 嘿,開發(fā)者朋友們! 今天給大家扒一扒鴻蒙官方文檔里藏著的并發(fā)編程寶藏—— 100+實戰(zhàn)場景解決方案 !從金融理財到游戲開發(fā),從折疊屏適配
    發(fā)表于 06-12 16:19

    Ingress網關高并發(fā)請求的解決方案

    當 Ingress 網關面臨高并發(fā)請求(如 QPS 超過 10萬+)時,可能導致服務崩潰、響應延遲激增或資源耗盡。
    的頭像 發(fā)表于 05-14 11:52 ?829次閱讀

    如何驗證CAN控制器的錯誤響應機制?

    CAN節(jié)點的穩(wěn)定性、可靠性和安全性得益于其強大的錯誤管理機制。上一篇文章我們介紹了CAN控制器的錯誤管理機制的工作原理。本文將基于其工作原理及ISO16845-1:2016標準,為大家介紹
    的頭像 發(fā)表于 04-30 18:24 ?868次閱讀
    如何驗證CAN控制器的<b class='flag-5'>錯誤</b>響應機制?

    芯片軟錯誤概率探究:基于汽車芯片安全設計視角

    對汽車關鍵系統(tǒng)的影響,分析先進工藝下軟錯誤變化趨勢,并提出相應的應對策略,旨在為芯片在汽車等安全關鍵領域的應用提供理論參考與實踐指導,保障電子系統(tǒng)可靠性。 一、引言 隨著電子技術在汽車領域的廣泛應用,芯片作為核心部件,其可靠性直接關系到車輛的安全性能。其中,軟
    的頭像 發(fā)表于 04-30 16:35 ?904次閱讀
    芯片軟<b class='flag-5'>錯誤</b>概率探究:基于汽車芯片安全設計視角