簡體   English   中英

防止 clang tidy 報告關於 Boost 測試標頭的警告

[英]Prevent clang tidy to report warnings on Boost Test headers

注意 2022 年 12 月:這個問題似乎在 clang-tidy 14 中得到了解決。僅通過實驗,我可以用clang-tidy 11, 12 and 13重現該問題,但不能用14重現。


我有一個使用 Boost.UnitTest 進行測試的 Cmake 項目。 當我使用 clang-tidy 進行靜態分析時,它會報告一些來自 Boost.UnitTest 標頭的警告。 我想過濾那些。

舉個例子(忽略細節)

/usr/include/boost/test/tools/old/interface.hpp:84:45: note: expanded from macro 'BOOST_REQUIRE'
#define BOOST_REQUIRE( P )                  BOOST_TEST_TOOL_IMPL( 2, \
                                            ^
/usr/include/boost/test/tools/old/interface.hpp:65:5: note: expanded from macro 'BOOST_TEST_TOOL_IMPL'
    BOOST_TEST_PASSPOINT();                                                     \
    ^
/usr/include/boost/test/unit_test_log.hpp:261:5: note: expanded from macro 'BOOST_TEST_PASSPOINT'
    ::boost::unit_test::unit_test_log.set_checkpoint(           \
    ^
/usr/include/boost/test/unit_test_log.hpp:209:82: note: default parameter was declared here
    void                set_checkpoint( const_string file, std::size_t line_num, const_string msg = const_string() );
                                                                                 ^
/home/user/prj/alf/boost/multi/test/zero_dimensionality.cpp:23:3: error: calling a function that uses a default argument is disallowed [fuchsia-default-arguments-calls,-warnings-as-errors]
                BOOST_REQUIRE( num_elements(m1) == 3 );

到目前為止,我使用這些行添加了對 Boost.UnitTest 的依賴

    target_link_libraries(${TEST_EXE} PRIVATE Boost::unit_test_framework Boost::serialization)

我試過這個,使 Boost.UnitTest 成為一個“系統”庫,但我仍然收到相同的警告

    target_include_directories(${TEST_EXE} SYSTEM PRIVATE ${Boost_INCLUDE_DIRS})
    target_link_libraries(${TEST_EXE} PRIVATE ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
    target_link_libraries(${TEST_EXE} PRIVATE ${Boost_SERIALIZATION_LIBRARY})

但我仍然得到相同的結果。

如何防止 clang-tidy 檢查或報告 Boost 標頭中的錯誤?

(我接受更改clang-tidy本身配置的答案(我使用了.clang-tidy配置文件);盡管改為更改 CMakeLists.txt 似乎更優雅。)


補充說明:

按照評論中的一項建議,我禁用了這些與 Boost.Test“不兼容”的警告。 我仍然希望保留它們並以某種方式使 clang-tidy 過濾器成為 Boost.Test 的標頭:

#  -altera-unroll-loops,                                  // BOOST_REQUIRE macro requires this
#  -cert-err58-cpp,                                       // BOOST_AUTO_TEST_CASE macro requires this
#  -cppcoreguidelines-avoid-non-const-global-variables,   // BOOST_AUTO_TEST_CASE macros require this
#  -cppcoreguidelines-macro-usage,                        // BOOST_TEST_MODULE macro requires this
#  -cppcoreguidelines-pro-type-vararg,                    // BOOST_REQUIRE macros require this
#  -fuchsia-default-arguments-declarations                // BOOST_AUTO_TEST_CASE_TEMPLATE
#  -fuchsia-default-arguments-calls,                      // BOOST_REQUIRE macros require this
#  -fuchsia-statically-constructed-objects,               // BOOST_AUTO_TEST_CASE creates these
#  -hicpp-vararg,                                         // all BOOST_TEST_REQUIRE macros require this

好的,我(對我而言)對此並不完全清楚:

我做 CXX=clang++ cmake.. -DCMAKE_CXX_CLANG_TIDY="clang-tidy" (加上 clang-tidy 的配置文件)

實際調用 clang-tidy 的方式或時間。 顯然,它使用了一些我不熟悉的 CMake 魔法。 我確實記得曾經看到過這樣的東西,但我最終沒有使用它是有原因的。

相反,我使用CMAKE_EXPORT_COMPILE_COMMANDS=On (對於所有基於 libclang 的工具非常方便,然后是一些,如 IDE 和 LSP 服務器)。 有了compile_commands.json ,您就可以調用run-clang-tidy工具並使用-p指向它。

以我的經驗,它確實過濾系統包括它應該包含的內容(並且它給出了在詳細模式下被抑制的診斷計數)。

如果您使用庫中的宏會引發 clang-tidy 警告,我認為今天沒有避免它的好方法。 即使您將該庫包含為系統庫(例如,通過-isystem ),我的理解是警告仍會觸發,因為您的代碼中使用了宏,即使它是在庫中聲明的。

這是修復它的提議,不幸的是,它似乎自 2021 年以來就停滯不前了。

解決方案:使用 clang-tidy 14 或更新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM