如何让Clang-tidy忽略Google Test宏触发的cppcoreguidelines-owning-memory告警
解决Google Test宏触发Clang-tidy告警的方案
你收到的告警翻译为:用新创建的gsl::owner<>实例初始化类型为testing::internal::TestFactoryBase *的非所有者参数,属于GTest内部实现导致的误报:GTest的TEST/TEST_F等宏内部会创建测试工厂实例,该实例的生命周期由GTest框架统一管理释放,不属于业务代码的内存泄漏问题。
以下是三种可行的解决方法:
方案1:修改clang-tidy配置精准抑制(推荐)
不需要修改业务代码和构建规则,直接在你的.clang-tidy配置文件中做调整即可:
- 新增
Suppressions字段,针对GTest宏触发的特定检查直接抑制,不会影响业务代码的规则校验,修改后配置示例如下:
Checks: '-*,clang-analyzer-*, modernize-avoid-bind, modernize-avoid-c-arrays, modernize-concat-nested-namespaces, modernize-deprecated-headers, modernize-deprecated-ios-base-aliases, modernize-loop-convert, modernize-make-shared, modernize-make-unique, modernize-pass-by-value, modernize-raw-string-literal, modernize-redundant-void-arg, modernize-replace-auto-ptr, modernize-replace-disallow-copy-and-assign-macro, modernize-replace-random-shuffle, modernize-return-braced-init-list, modernize-shrink-to-fit, modernize-unary-static-assert, modernize-use-auto, modernize-use-bool-literals, modernize-use-default-member-init, modernize-use-emplace, modernize-use-equals-default, modernize-use-equals-delete, modernize-use-nodiscard, modernize-use-noexcept, modernize-use-nullptr, modernize-use-override, modernize-use-transparent-functors, modernize-use-uncaught-exceptions, modernize-use-using, performance-*,readability*,cppcoreguidelines-*, llvm-*, google-*, bugprone-*' WarningsAsErrors: '' # 修改为你自己项目的源码目录,避免扫描GTest等第三方依赖头文件 HeaderFilterRegex: '^your_project_src_path/.*' AnalyzeTemporaryDtors: false # 新增GTest宏抑制规则 Suppressions: - check: cppcoreguidelines-owning-memory macro: [TEST, TEST_F, TEST_P, TEST_SUITE, TEST_SUITE_F, TYPED_TEST] CheckOptions: [{key: readability-identifier-naming.ClassCase, value: CamelCase}, {key: readability-identifier-naming.ClassMemberCase, value: lower_case}, {key: readability-identifier-naming.PrivateMemberPrefix, value: m_}, {key: readability-identifier-naming.ClassMethodCase, value: lower_case}, {key: readability-identifier-naming.StructCase, value: lower_case}, {key: readability-identifier-naming.VariableCase, value: lower_case}, {key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE}, ]
- 如果你使用的clang-tidy版本不支持针对宏的抑制规则,也可以直接在Checks字段末尾追加该检查的全局排除:
-cppcoreguidelines-owning-memory即可。
方案2:Bazel构建层面针对测试目标单独配置
不需要修改全局clang-tidy配置,规则只对测试目标生效:
在cc_test目标的copts中追加clang-tidy抑制参数:
cc_test( name = "xxx_test", srcs = ["xxx_test.cpp"], deps = ["@com_google_googletest//:gtest_main"], copts = [ "-Xclang-tidy=-checks=-cppcoreguidelines-owning-memory", ] )
如果需要全局对所有测试目标生效,可在.bazelrc中添加配置:
build:test --per_file_copt=.*test\.cpp@-Xclang-tidy=-checks=-cppcoreguidelines-owning-memory
方案3:测试文件内用NOLINT块包裹
之前单行//NOLINT不生效是因为GTest宏会展开为多行代码,单行注释无法覆盖所有展开内容,改用NOLINT块包裹所有测试宏即可:
// NOLINTBEGIN(cppcoreguidelines-owning-memory) TEST(MyTestSuite, Case1) { // 测试逻辑 } TEST_F(MyTestFixture, Case2) { // 测试逻辑 } // NOLINTEND(cppcoreguidelines-owning-memory)
内容的提问来源于stack exchange,提问作者Stefan Arnautu
相关产品推荐
相关产品推荐

