我在我的项目中使用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
的设置如何,我都会收到来自doctest
MACRODOCTEST_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已编译(以确认doctest
header包含在-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.*")
.叮当声整齐
...
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.
您发布的错误看起来并不是假的。问题可能不在于第三方库,而在于您对它的使用。您没有提供足够的代码来给出完全正确的答案,因为不清楚fDummy
和GetRandomfDummy
移动到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