Parasoft C/C++test針對C/C++開發的專業白盒自動化測試方案,能有效提高軟件開發效率和代碼質量。C++test 可以進行靜態分析,全面代碼審查,運行時錯誤檢測,并在單元測試和組件測試中集成覆蓋率分析。
配置流分析深度
Flow Analysis 通過分析的代碼構建路徑以檢測不同類型的問題。由于對跨越整個應用程序的所有可能路徑的分析可能不可行,因此您可以設置所需的分析深度級別。更深入的分析會得到更多的發現,但性能會變慢,內存消耗會略有增加。
可以使用 DTP 中的測試配置界面指定分析深度。轉至 報告中心> 測試配置> 靜態分析> 流分析高級設置> 性能> 分析深度, 然后通過選擇單選按鈕選擇以下選項之一:
-
Shallowest(最快):只查找源代碼中最明顯的問題。它僅限于問題的原因位于靠近出現問題的代碼的情況。此類分析發現的違規執行路徑通常跨越單個函數中的多行代碼。它們很少會跨越 3 個以上的函數調用。
-
Shallow(快速):和“Shallowest”分析類型一樣,只查找源代碼中最明顯的問題。但是,它會產生更多的結果,并允許檢查更長的執行路徑。
-
標準:查找包含數十個元素的執行路徑的許多復雜問題。標準分析超越了淺層分析,還尋找更復雜的問題,這些問題可能是由于單個功能中的流程不暢或由于所分析項目的不同部分中不同功能之間的交互不當而導致的。此類分析發現的違規行為通常會揭示所分析源代碼中的重大錯誤,并且通常跨越數十行代碼。
-
深度(慢):允許檢測更多與“標準”深度定義的問題具有相同復雜性和性質的問題。這種類型的分析比標準分析慢。
-
徹底(最慢):發現更復雜的問題。這種類型的分析將對代碼庫進行徹底掃描;這需要更多時間,但會發現許多非常復雜的問題,這些問題的違規路徑可能跨越掃描應用程序不同部分的一百多行代碼。建議在夜間運行時使用此選項。
Flow Analysis 的深度 默認設置為 標準。
設置超時策略
除了分析深度之外,Flow Analysis 還使用額外的超時保護來確保分析在合理的時間內完成。使用 DTP 中的測試配置界面可以設置適當的策略。轉至 報告中心> 測試配置> 靜態分析> 流分析高級設置> 性能> 超時策略, 然后通過選擇單選按鈕選擇以下選項之一:
-
time:在給定的熱點上花費定義的時間后停止分析。注意:在某些情況下,使用此選項可能會導致報告的違規數量略微不穩定。
-
instructions:執行定義數量的 Flow Analysis 指令后,將停止對給定熱點的分析。注意:要確定要為您的環境設置的正確指令數量,請在生成的報告的“設置問題”部分查看有關超時的信息。
-
off:沒有超時。注意:使用此選項可能需要更多的時間來完成分析。
默認超時選項的 時間 設置為 60 秒。
在增量模式下運行流量分析
默認情況下,Flow Analysis 會對其運行的范圍執行完整的分析。在大型代碼庫上運行時,這可能需要相當長的時間。
執行 Flow Analysis 分析的最常見方法是在每天都略有變化的單個代碼庫上運行夜間測試。Flow Analysis 的增量分析模式旨在減少在這種典型場景中運行分析所需的時間。在增量分析模式下,Analysis 會在初始運行期間記住重要的分析數據,然后在后續運行中重新使用它——僅對已修改或與修改代碼緊密相關的代碼部分重新運行分析。
需要磁盤空間來存儲必要的數據。增量分析選項控制增量分析功能。可用選項有:
-
啟用增量分析:確定是否使用增量分析。
-
每隔 [天] 壓縮增量緩存:確定運行增量緩存壓縮的頻率。增量分析針對速度進行了優化;盡管 Flow Analysis 力求始終保持較小的緩存大小并刪除不必要的數據,但源代碼更改可能會導致這些緩存包含一些不再使用的數據。按照此參數的定義定期運行的壓縮會刪除所有過時的數據。更準確地說,如果自上次壓縮以來經過的時間大于為此選項指定的天數,則在 Flow Analysis 增量運行后立即執行壓縮。
在啟用分析數據交換的情況下運行流分析
在這種模式下,分析數據被寫入磁盤。分析數據的交換使用相同的持久存儲,并在與增量分析類似的過程中完成。如果在大型項目上運行分析,則表示所分析源代碼的語義模型的分析數據可能會消耗可用于運行 Flow Analysis 的所有內存。如果發生這種情況,Flow Analysis 將從內存中刪除當前不需要的分析數據部分,并稍后從磁盤中重新讀取。
通常,我們建議在配置了 Xmx JVM 選項的大型 JVM 堆中運行 C/C++ 測試。這是為了最大限度地減少交換,從而提高性能。如果有足夠的可用內存,則可以禁用分析數據的交換,這可以加快代碼分析。
您可以使用 DTP 中的測試配置界面啟用或禁用該模式:
啟用將分析數據交換到磁盤:默認情況下啟用。如果禁用此選項,則可能會加快分析速度,如果您正在對不需要大量內存的中小型項目運行 Flow Analysis 分析,或者有足夠的內存可用(例如,對于 64 位系統) )。
配置流分析的詳細程度
您可以使用 DTP 中的測試配置界面來配置以下選項:
-
無法顯示原因時不報告違規:確定 Flow Analysis 是否報告無法顯示原因的違規。
某些 Flow Analysis 規則要求 Flow Analysis 檢查通向某個點的所有可能路徑,并驗證所有這些路徑是否滿足某個條件。在這種情況下,違規與一組路徑相關聯(而在簡單情況下,違規僅由一條路徑表示)。這種違例中的所有路徑都以違例中所有路徑共有的違例點結束。但是,不同的路徑可能從代碼中的不同點開始。每條路徑的開頭是一個違規原因(代碼中的一個點,它規定了在違規點的代碼中后面的某個條件的違規)。如果多路徑違規的不同路徑有不同的原因,Flow Analysis 將僅顯示違規點(而不是違規原因)。
僅包含違規點的違規可能難以理解(與 Flow Analysis 顯示從違規原因開始并導致違規點的完整路徑的常規情況相比)。這就是為什么我們提供了一個選項來隱藏無法顯示原因的違規行為。
-
每個點不顯示多個違規: 限制每個違規點報告一次違規(針對單個規則)。例如,當 Flow Analysis 檢測到具有多個空值來源的潛在空取消引用時,將報告一次違規。當詳細程度設置為該級別時,Flow Analysis 性能會稍快一些。
指定終止函數
您可以定義終止應用程序執行的函數。C/C++ 開發人員有時會使用在發生無法恢復的致命錯誤時終止應用程序執行的函數。這些功能的示例是abort()與exit()從標準庫。由于 Flow Analysis 分析應用程序的執行流程,因此了解通過立即停止應用程序而中斷執行流程的終止函數很重要。如果沒有這些知識,Flow Analysis 可能會對應用程序流程做出錯誤的假設。
Flow Analysis 知道標準庫中定義的終止函數。然而,這通常是不夠的,因為非標準庫定義了它們自己的終止函數。如果您的應用程序使用這些函數之一,您應該通過在 Terminators 選項卡中指定自定義終止函數將其傳達給 Flow Analysis。否則,Flow Analysis 可能會在執行路徑通過終止函數時產生誤報。
使用列出支持的 API 的表格來啟用/禁用來自各種 API 的終止符,以及定義您自己的包含終止函數的 API。要從某個庫中添加有關終止函數的信息:
-
單擊表格頂行中的+按鈕。
-
單擊箭頭以展開終止應用程序執行的功能選項卡。
-
完成打開的表格;該表包含以下列:
? 已啟用:指定在分析過程中是否應考慮內置或自定義終止符。
?完全限定的類型名稱或命名空間(通配符):指定特定終止符的實體。如果此字段留空,則只有在“函數名稱”列中指定名稱的全局函數才會被視為終止符。例如: 如果終止符是在來自 'myNameSpace' 命名空間的 'myClass' 中聲明的,則字段值可能是“myNameSpace::myClass”。或者,如果它未在類型中聲明,而僅屬于“myNameSpace”,則它可能是“myNameSpace”。
?函數名稱(通配符):指定終止函數的名稱。
:指示子類中的終止函數定義是否也應視為終止函數。這適用于實例函數和非實例函數,并且只有在指定了它的完全限定類型名稱時才有意義。
指定多線程選項
的多線程標簽允許你以及以激活線程之間限定用于同步的功能/停用已知多線程功能。此處定義的信息會影響來自 BD.TRS(線程和同步)類別的規則的行為。這些規則將檢查在此選項卡上定義和激活的所有功能。
使用列出支持的 API 的表來啟用/禁用來自各種 API 的同步功能,以及定義您自己的包含同步功能的 API。要從某個庫中添加有關同步函數的信息:
-
單擊表格頂行中的 + 按鈕。
-
在 API 字段中輸入庫的名稱。
-
單擊箭頭展開選項卡并完成表格以定義以下類型的功能(下面提供了有關完成表格的詳細信息):
? 鎖定功能(例如,獲取互斥鎖)
? 解鎖功能(例如,釋放互斥鎖)
? 睡眠功能
? 銷毀鎖定功能
鎖定功能
使用以下信息完成表格:
-
已啟用:指定在分析過程中是否應考慮鎖定功能。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):鎖定函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為鎖定函數。請注意,這適用于實例函數和靜態函數。
-
“this”對象是一個互斥體:一個復選框,表示該函數在調用該函數的對象中鎖定了一個互斥體。
-
返回一個互斥體:一個復選框,指示該函數返回一個互斥體。
-
錯誤時的返回值約束:如果資源分配器返回整數值,則指定分配失敗時的返回值約束。按以下格式輸入條件:<比較運算符><整數值>。例如,如果函數在失敗時返回非零值,請在字段中輸入“!=0”(不帶引號)。如果錯誤返回碼為 -1,請在此處輸入“==-1”。除了“!=”和“==”,您還可以使用以下運算符來指定錯誤條件:“>”、“>=”、“<”和“<=”。
-
互斥量參數:指定函數在其參數之一中鎖定互斥量。
解鎖功能
使用以下信息完成表格:
-
Enabled:指定在分析時是否應考慮解鎖功能。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名(通配符):解鎖函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為解鎖函數。請注意,這適用于實例函數和靜態函數。
-
“this”對象是一個互斥鎖:一個復選框,指示調用該函數的對象中的互斥鎖已解鎖
-
互斥量參數:指定參數之一中的互斥量被解鎖。
睡眠功能
使用以下信息完成表格:
-
Enabled : 指定在分析過程中是否應考慮睡眠功能。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):睡眠函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為睡眠函數。請注意,這適用于實例函數和靜態函數。
破壞鎖功能
使用以下信息完成表格:
-
Enabled:指定在分析過程中是否應考慮鎖破壞功能。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):鎖破壞函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為破壞鎖的函數。請注意,這適用于實例函數和靜態函數。
-
“this”對象是一個互斥鎖:一個復選框,指示調用該函數的對象中的互斥鎖已被銷毀。
-
互斥量參數:指定參數之一中的互斥量被銷毀。
指定資源
在 資源 選項卡允許您定義BD.RES類(資源)規則應該檢查哪些資源。這些規則檢查在此選項卡上定義和啟用的所有資源的正確使用。
-
指定資源類型。
-
選中啟用復選框。
-
如果合適/需要,禁用終止時不報告泄漏選項。
-
單擊箭頭展開Resource Allocators、Resource Closers、Resource checkers和Safe functions選項卡并完成打開的表格,其中包含有關分配器、關閉器、檢查器和安全功能的信息。下面提供了有關完成這些選項卡的詳細信息。
配置資源分配器
該資源分配器表可以用能夠產生資源的功能描述中完成。該表包含以下列:
-
已啟用:指定在分析期間是否應考慮分配器。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):分配函數的名稱。'*' 可用于表示任意數量的任意符號。
-
資源參數:指定函數在其一個或多個參數中分配資源。在這種情況下,要么指定函數分配的參數的從 1 開始的編號,要么使用“*”表示所有參數都已分配。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為分配器。請注意,這適用于實例函數和靜態函數。
-
“this”對象是一個資源:一個復選框,指示該函數在調用該函數的對象中分配資源。
-
返回資源對象:一個復選框,指示該函數返回已分配的資源。
-
錯誤時的返回值約束:如果資源分配器返回整數值,則指定在分配失敗的情況下的返回值約束。按以下格式輸入條件:<比較運算符><整數值>。例如,如果函數在失敗時返回非零值,請在字段中輸入“!=0”(不帶引號)。如果錯誤返回碼為 -1,請在此處輸入“==-1”。除了“!=”和“==”,您還可以使用以下運算符來指定錯誤條件:“>”、“>=”、“<”和“<=”。
分配函數返回錯誤代碼以指示分配失敗是很常見的。當分配函數返回指向資源的指針時,NULL 指針通常表示分配失敗。Flow Analysis 在尋找資源泄漏時,需要了解分配是成功還是失敗;這有助于它僅報告在實際發生分配的路徑上丟失的對釋放函數的調用。在資源分配器函數返回指向資源的指針的情況下,如果指針不為 NULL,則 Flow Analysis 假定資源已成功分配。
配置資源關閉器
該資源成交表可以與功能的描述,可以關閉資源完成。該表包含以下列:
-
已啟用:指定在分析期間是否應考慮關閉器。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):關閉函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應被視為更接近。請注意,這適用于實例函數和靜態函數。
-
“this”對象是一個資源:一個復選框,指示調用該函數的對象中的資源已關閉。
-
資源參數:指定一個資源在它的一個或多個參數中是關閉的。在這種情況下,要么指定由函數關閉的參數的從 1 開始的編號,要么使用“*”表示所有參數都已分配。
配置資源檢查器
該資源跳棋表可以與功能的描述,可以檢查資源是開放的完成。該表包含以下列:
-
已啟用:指定在分析期間是否應考慮檢查器。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):檢查函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應視為檢查器。請注意,這適用于實例函數和靜態函數。
-
'this' 對象是一個資源:一個復選框,指示該函數檢查調用該函數的對象中的資源。
-
資源參數:指定函數在其一個或多個參數中檢查資源。在這種情況下,要么指定函數檢查的參數的從 1 開始的數字,要么使用“*”表示檢查所有參數。
-
資源打開時返回值:指定資源打開時檢查函數的返回值。可接受的值為true或false。
配置安全功能
該安全功能表可以用的,可以安全地調用在一個封閉的資源功能的描述完成-不觸發BD-RES-FREE規則。該表包含以下列:
-
已啟用:指定在分析過程中是否應考慮安全功能。
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名稱(通配符):安全函數的名稱。'*' 可用于表示任意數量的任意符號。
-
+ 子類中的定義:一個復選框,指示子類中的定義(具有給定名稱的函數)是否也應該被認為是安全的。請注意,這適用于實例函數和靜態函數。
擴展分析范圍
在執行代碼分析時,Flow Analysis 會處理在被測源文件和頭文件中定義的函數定義。在測試范圍之外的頭文件中定義的函數不會被分析,并且 Flow Analysis 不知道它們的語義。如果 Flow Analysis 需要有關在測試范圍之外的頭文件中定義的函數定義的信息,您可以配置以下選項:
要分析的外部文件:指定要由 Flow Analysis 分析的其他頭文件的絕對路徑。使用通配符指定模式。
要分析的外部函數:指定要由 Flow Analysis 分析的附加函數。使用以下信息完成表格:
-
已啟用:指定在分析期間是否應考慮該功能
-
完全限定的類型名稱或命名空間(通配符):聲明函數的類型或命名空間的完全限定名稱。如果要描述在任何類型或命名空間中聲明的函數,或者在任何類型之外聲明的全局函數,請使用“*”。
-
函數名(通配符):函數名。'*' 可用于表示任意數量的任意符號。
-
數參數:指定的函數的參數個數。“-1”可用于表示任意數量的參數。
-
+ 子類中的定義:一個復選框,指示是否還應包括子類中的定義(具有給定名稱的函數)。請注意,這適用于實例函數和靜態函數。
指定始終被分析的函數
將始終分析功能選項允許您定義的執行路徑上遇到的時候,將永遠被分析的功能。這有助于您確保規則將分析檢查給定路徑時通常不會輸入的函數。
選擇啟用復選框并提供以下信息:
-
完全限定的類型名稱或命名空間(通配符):包含函數的類型或命名空間的完全限定名稱。
-
函數名(通配符):函數名。
-
+ 子類中的定義:指示是否也應在子類中考慮該函數。
特定于編譯器的設置
“ errno ”值的內部表示:Standarddefineserno 是 int 類型的可修改左值。未指定 errno 是宏還是使用外部鏈接聲明的標識符。實現可以使用全局變量“errno”或“__errno”,或應用具有不同名稱的被調用函數的“(*errno_function())”模式。此選項允許您使用正則表達式指定這些變量和函數的名稱:
-
函數名稱模式:使用“errno”值時調用的函數名稱。必須使用正則表達式指定名稱。
-
變量名模式:使用“errno”值時調用的變量名。必須使用正則表達式指定名稱。
從頭文件 <ctype.h> 調用函數的內部表示:標準指定了要在頭文件 <ctype.h> 中定義的幾個函數。一些實現(例如 C 模式下的 GNU GCC)將這些函數定義為宏,這些宏擴展到代碼,該代碼根據某些標志測試內部數組的元素。這可以是全局數組或函數返回的指針。此選項允許您使用正則表達式指定這些變量和函數的名稱:
-
函數名稱模式:內部調用的函數的名稱,而不是頭文件 <ctype.h> 中的函數之一(使用正則表達式定義)。必須使用正則表達式指定名稱。
-
變量名稱模式:在從頭文件 <ctype.h> 調用其中一個函數后在內部使用的變量名稱。必須使用正則表達式指定名稱。
重用流動分析數據進行桌面分析
使用 Flow Analysis 提高桌面性能的一種方法是重用桌面上的服務器分析數據。為此,您需要定義一個映射,以允許 Flow Analysis 將服務器文件路徑與相應的桌面文件路徑相匹配。
此外,您可以重用數據以在小范圍(例如,一個文件)上運行分析,并構建包含在定義的分析范圍之外的文件中定義的方法的路徑,前提是這些文件已經過分析。
Parasoft——領先的自動化測試工具,滿足絕大多數行業標準
Parasoft是一家專門提供軟件測試解決方案的公司,幫助企業打造無缺陷的軟件。
從開發到質量檢查,Parasoft的技術通過集成靜態和運行時分析,單元、功能和API測試,以及服務虛擬化,在不犧牲質量和安全性的情況下加快軟件交付,節約交付成本。
強大的報告和分析功能可幫助用戶快速查明有風險的代碼區域,并了解新代碼更改如何影響其軟件質量,而突破性的技術將人工智能和機器學習添加到軟件測試中,使組織更容易采用和擴展跨開發和測試團隊的有效的軟件測試實踐。
Parasoft針對C/C++、Java、.NET和嵌入式的開發測試都有著30多年的深入研究,很多全國500強企業使用Parasoft的產品實現了軟件快速、高質量的交付。
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn