You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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配置文件中做调整即可:

  1. 新增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},
         ]
  1. 如果你使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:45:03