看到一篇PVS學會在Linux下分析的刊物,決定在自己的專案上試試看。 這就是結果。
Содержание
優點
響應式支持
我請求了試用金鑰,他們當天就將其發送給了我。
相當清晰的文檔
我們成功地啟動了分析儀,沒有出現任何問題。 也提供了控制台命令的幫助(儘管這裡有一些抱怨,請參閱部分
多執行緒分析的可能性
分析儀有一個“標準”選項 -j
,允許在多個任務中並行進行分析。 這節省了大量時間。
良好的可視化效果
許多不同的輸出格式,從文字到小型網路槍口。
輕鬆整合到組件中
所有的文件都在他們的網站上,我只能說,如果你的專案是使用 CMake 建立的,那麼一切都非常簡單。
良好的診斷描述
如果您在模式下產生輸出 fullhtml
,那麼每條訊息都有一個指向診斷描述的鏈接,其中包含解釋、程式碼範例和其他連結。
缺點
分析器對 C++ 語言的無知
不幸的是,當程式碼完全正確時,PVS 有時會出現語法錯誤並產生誤報訊息。
例如,有一個函數返回 void
:
template <typename T>
auto copy (const void * source, void * destination)
->
std::enable_if_t
<
std::is_copy_constructible<T>::value
>
{
new (destination) T(*static_cast<const T *>(source));
}
是的,是關鍵字 auto
可以表示 void
,這就是它的用途 汽車。 但 PVS 產生以下訊息:
dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.
網站速度非常慢
是的,在網路介面中每個訊息旁邊都有一個指向相應診斷描述和範例的連結。 但是當你點擊一個連結時,你必須等待相當長的時間,有時會發生這種情況
語
所有描述都是俄語的,這很棒。 但報告中的連結始終指向英文版本。 如果能夠切換語言那就太好了,這樣您就可以立即用俄語查看診斷訊息。 我在介面中沒有找到這樣的選項。
透過控制台處理診斷等級不方便
讓我們從使用這兩個命令的事實開始(這 pvs-studio-analyzer
и plog-converter
)用於指定診斷的不同格式。
幫助 pvs-studio-analyzer
讀到:
-a [MODE], --analysis-mode [MODE]
MODE defines the type of warnings:
1 - 64-bit errors;
2 - reserved;
4 - General Analysis;
8 - Micro-optimizations;
16 - Customers Specific Requests;
32 - MISRA.
Modes can be combined by adding the values
Default: 4
我花了很長時間試圖弄清楚該去哪裡 添加 (“新增值”)鍵。 我嘗試將它們列出並用逗號分隔:
pvs-studio-analyzer analyze ... -a 1,4,16
我多次嘗試註冊密鑰:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16
然後我才意識到這些都是位元遮罩! 而你需要 總結而且不 添加 含義。 例如,要獲得一般診斷、微優化診斷和 MISRA,您需要將它們相加 (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44
在使用者介面中使用位元遮罩通常是不好的形式。 所有這些都可以在內部進行總結,並且可以為使用者設定一組標誌。
除此之外,還有一個實用工具 plog-converter
,它產生人類可讀的靜態分析資訊。 她還有其他問題。
程式幫助 plog-converter
報告:
-a, --analyzer Specifies analyzer(s) and level(s) to be
used for filtering, i.e.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Default: GA:1,2
這裡出現了一些以前沒有的“級別”,而且我在文件中也沒有找到有關它們的任何內容。
一般來說,還不清楚。 這就是為什麼我把一切都設定為最大。
Catch 上一堆愚蠢的髒話
我分析的三個專案中有兩個使用單元測試庫
不考慮多線程
對於所謂不變的變數或無限循環,存在許多誤報,而這些變數的工作是從不同的執行緒進行的,如果不是這樣,那麼單元測試將無法運作。
然而,靜態分析器可以考慮到這一點嗎? 不知道。
結果
PVS 在我的開源專案中沒有發現任何真正的錯誤 scan-build
一般來說,所有這些分析器的印像大致相同:是的,它們捕獲了一些東西,有時甚至捕獲了一些重要的東西,但總的來說編譯器就足夠了。
我們的團隊有可能使用軟體開發實踐來產生最少量的垃圾程式碼(我個人也這麼認為)。 與其英勇地克服問題,不如不製造問題。
因此,我冒昧地就如何用 C++ 寫一些建議,以免射斷任何人的腿或用耙子擊中任何人的額頭。
充分利用編譯器診斷
我們的團隊使用(並建議您)以下編譯選項:
-Werror
-Wall
-Wextra
-Wpedantic
-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo
在您的專案中啟用它們並了解有關您的程式碼的更多資訊。
堅持標準
如果有標準類似物,請盡量不要使用依賴於平台的東西,如果您絕對不能沒有它們,請將它們包裝在巨集(或其他東西)的特殊區塊中,並且不要讓您的程式碼在不受支援的條件下編譯。
堅持標準操作語義
加法必須是加法,乘法必須是乘法,函數調用必須是函數調用,複製必須是複製,進位必須是進位,容器必須是可迭代的,迭代器必須具有提升 ++
和解除引用 *
。 等等等等。
我認為這個想法很明確。 有些既定約定不具約束力,但程式碼的所有使用者和讀者都希望看到這些約定。 不要試圖智取別人,否則你會智取自己。
編寫相容的程式碼
首先,我指的是標準函式庫。 非常希望您的類別和函數的介面可以與標準庫和其他庫(例如,Boost)一起使用。
請隨意查看 STL 和 Boost 介面。 除了極少數例外,您都會在那裡看到有價值的榜樣。
充分利用開源工具
對於相同的靜態分析,至少有兩個開放的免費工具可以使用 CMake 建置系統將它們連接到任何專案一次。
後記
最後,我想強調的是,我並不是提倡不要使用PVS或任何其他靜態分析器。 但我鼓勵您考慮靜態分析器如何不斷地在您的程式碼中發現重大錯誤。
這只是一個後果。 我們需要尋找並消除原因。
來源: www.habr.com