当前位置: 首页 > 知识库问答 >
问题:

clang tidy-忽略第三方头代码

翟兴邦
2023-03-14

我在我的项目中使用CMake,我想在项目中引入整洁的支票。

为此目的,我使用CMAKE_CXX_CLANG_TIDY.clang-tidy文件进行检查设置。

我想使用警告作为错误,以便在CI中有可靠的方法来检查提交是否引入了一些新的违规行为。不幸的是,由于第三方库,我在启用检查时遇到了一些问题。

请看EDIT2!

例如,我使用Eigen,这是一个只有头的库。由于这一事实,我在代码中收到了一些警告,例如“a_file.cpp”

/snap/cmake/301/bin/cmake -E __run_co_compile --tidy="clang-tidy;--extra-arg-before=--driver-mode=g++" --source=../../a_file.cpp -- /usr/bin/clang++ -DEIGEN_MPL2_ONLY -DEIGEN_STACK_ALLOCATION_LIMIT=16384 -I../../SomePath -I../../SomePath2 -isystem ../../path_to/include/Eigen -m64 -stdlib=libc++ -g -fPIC -std=c++11 -MD -MT a_file.cpp.o -MF a_file.cpp.o.d -o a_file.cpp.o -c a_file.cpp                                                                            
../../path_to/include/Eigen/Eigen/src/Core/Swap.h:89:36: error: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign,-warnings-as-errors] 
a_file.cpp:279:5: note: Loop condition is true.  Entering loop body                            
    for( unsigned int i = 0; i < 100; ++i )                                                                                                                                                                                                                         
    ^                                                                                                                                                                                                                                                                 
a_file.cpp:282:13: note: Calling move assignment operator for 'Matrix<float, 3, 1, 0, 3, 1>'   
            some_name = Vector3f( GetRandom( fDummy ),GetRandom( fDummy ), GetRandom( fDummy ) );  

我有点不知道如何忽略这种问题,因为Header-filter似乎无法解决此问题-对于其他检查[bugven-xxx]我也有类似的问题。除了在任何地方添加//NO-LINT之外,我还有什么选择?

编辑:给错误添加了一点上下文。

编辑2:

由于我仍然在努力正确处理叮当声,因此我准备了一个存储库来显示示例问题。

https://github.com/MaciejPatro/test_clang_tidy

这是一个最小的存储库,包含两个头文件和一个使用< code>doctest的cpp文件。我在这里使用了两个检查:< code>clang-analyzer-cplusplus*,Google-readability-todo -第一个检查演示了< code>doctest包含的问题,第二个检查是因为这是创建“bug”最简单的一个检查。

some_header.h

void else_after_return() {
  // TODO wrong hpp some
}

other_header.h

void wrong_function() {
  // TODO wrong hpp other
}

我的测试.cpp

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN

#include <doctest/doctest.h>
#include <some_header.h>
#include <other_header.h>

TEST_CASE("a test")
{
  // TODO wrong cpp
  else_after_return();
  wrong_function();
  CHECK(5 != 7);
}

有 3 个测试可得出以下结果:

>

  • 忽略头文件(未指定 --头筛选器)。我可以看到:

    /home/pmac/projects/test_clang_tidy/source/tests/my_test.cpp:9:3: warning: missing username/bug in TODO [google-readability-todo]
    

    这是意料之中的

    允许所有头文件(--Header-filter=. * ) 我可以看到:

    /home/pmac/projects/test_clang_tidy/source/include/other_header.h:5:3: warning: missing username/bug in TODO [google-readability-todo]
    /home/pmac/projects/test_clang_tidy/source/include/some_header.h:5:3: warning: missing username/bug in TODO [google-readability-todo]
    /home/pmac/projects/test_clang_tidy/source/tests/my_test.cpp:9:3: warning: missing username/bug in TODO [google-readability-todo]
    

    这对我来说是有道理的

    仅头文件名称中带有“some”(-header-filter = . some。)

    /home/pmac/projects/test_clang_tidy/source/include/some_header.h:5:3: warning: missing username/bug in TODO [google-readability-todo]
    /home/pmac/projects/test_clang_tidy/source/tests/my_test.cpp:9:3: warning: missing username/bug in TODO [google-readability-todo]
    

    一切似乎都很好

    接下来的3个测试添加了第二个检查clang-analyzer-cplusplus,它在doctest中可见。现在,无论提供给clang-tidy的设置如何,我都会收到来自doctestMACRODOCTEST_DO_BINARY_EXPRESSION_COMPARISON的警告,该警告是从CHECK扩展而来的:

    /home/pmac/.conan/data/doctest/2.4.6/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/doctest/doctest.h:1239:9: warning: Potential leak of memory pointed to by field 'ptr' [clang-analyzer-cplusplus.NewDeleteLeaks]
    

    我希望从doctest的警告被过滤掉 - 不幸的是,没有任何设置(--头-过滤器,也不包括它作为系统头-isystem)允许我忽略它。

    下面是my_test的完整命令行。cpp已编译(以确认doctestheader包含在-isystem中)

    /home/pmac/.local/lib/python3.8/site-packages/cmake/data/bin/cmake -E __run_co_compile --tidy="clang-tidy-12;-checks=-*,clang-analyzer-cplusplus*,google-readability-todo;--header-filter=.*some.*;--extra-arg-before=--driver-mode=g++" --source=../source/tests/my_test.cpp -- /usr/bin/c++++  -I../source/include -isystem /home/pmac/.conan/data/doctest/2.4.6/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -g -std=gnu++2a -MD -MT source/CMakeFiles/test_clang_tidy_tests.dir/tests/my_test.cpp.o -MF source/CMakeFiles/test_clang_tidy_tests.dir/tests/my_test.cpp.o.d -o source/CMakeFiles/test_clang_tidy_tests.dir/tests/my_test.cpp.o -c ../source/tests/my_test.cpp
    

    有没有其他方法可以过滤掉第三方库中包含的MACROs生成的警告?因为第三方库,我不想删除测试中的检查。

    在< code > https://github . com/MaciejPatro/test _ clang _ tidy/blob/master/cmakelists . txt 中更改存储库注释/取消注释行中的“测试”

    set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,google-readability-todo")
    #set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,google-readability-todo;--header-filter=.*")
    #set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,google-readability-todo;--header-filter=.*some.*")
    
    # Something works wrong here!
    #set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,clang-analyzer-cplusplus*,google-readability-todo)
    #set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,clang-analyzer-cplusplus*,google-readability-todo;--header-filter=.*")
    #set(CMAKE_CXX_CLANG_TIDY "clang-tidy-12;-checks=-*,clang-analyzer-cplusplus*,google-readability-todo;--header-filter=.*some.*")
    
  • 共有3个答案

    徐焱
    2023-03-14

    .叮当声整齐

    ...
    HeaderFilterRegex: '.*'
    ...
    

    <代码>铿锵整齐...- header-filter= '。*' ...

    分析大量代码时的clang-tidy输出:

    Suppressed ... warnings (... in non-user code).
    Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
    
    闾丘选
    2023-03-14
    1. GetRandom和fDummy代码可以添加到这里吗?你写的东西不清楚
    2. 此外,include目录在CMAKE中处理所有这些警告。(是的,我的意思是包含为系统标题。)
    孟茂
    2023-03-14

    您发布的错误看起来并不是假的。问题可能不在于第三方库,而在于您对它的使用。您没有提供足够的代码来给出完全正确的答案,因为不清楚fDummyGetRandomfDummy移动到GetRandom,则此处有一个真正的错误。

    注释已经列出了忽略头文件中包含的错误的方法:使用-issystem(在CMake中,导入的目标默认使用此方法,否则您可以手动将SYSTEM应用于target_include_directories)。

     类似资料:
    • 我有一个ASP.NET Core2.1Web应用程序,它通过Web API接口为DevExpress报告提供服务。 谢谢斯文

    • 问题内容: Json.NET文档说您过去不对类中的某些属性进行序列化: 在使用序列化第3方对象时,如何使Json.NET忽略特定属性? 问题答案: 制作自定义合同解析器: 我如何测试它:

    • Android6.0-11.0 СompileSdkVersion 30 minsdk版本23 HttpURLConnection忽略代理——当指定一个不存在的地址时,它不会发誓 我需要在编译应用程序后,应用程序可以通过代理发送请求 尝试了以下操作: 我的代码: 使用此选项时,根本不会加载页面: 请告诉我我做错了什么。

    • 很好的一天! 我的应用程序使用简单的http客户端-服务器通信,通过客户端的凌空库建立。首先,我启动一个授权请求: 之后,我请求列出与当前用户相关的设备列表。此时,我收到了来自响应标题的cookei。auth请求的完整标头响应输出: 缓存控制——没有存储,没有缓存,必须重新验证,后检查=0,预检查=0 在身份验证请求的onResponce回调中,我将Set Cookie值作为sessionId,并

    • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

    • 展开需要添加第三方库的工程,右键References->Add,会看到提供三种方式添加,分别是Global Assembly Cache、Browse、Solution。 <a>Global Assembly Cache: 在已经安装的.net framework中选择引入 <b>Browse: 通过文件浏览方式选择引入 <c>Solution: 添加项目方式引入 以添加.net framewor