我有使用GCC构建的CMake。我生成了compile_commands.json然后运行了clang-tidy但我得到了数百个:
error: unknown warning option '-Wno-maybe-uninitialized'; did you mean '-Wno-uninitialized'? [clang-diagnostic-unknown-warning-option]
error: unknown warning option '-Wno-psabi' [clang-diagnostic-unknown-warning-option]
Run Code Online (Sandbox Code Playgroud)
如何禁用或删除这些警告?我看到了clang ++警告:“警告:未知警告选项'-Wno-maybe-uninitialized'”,但添加“ -Wno-unknown-warning-option”却给我一个错误:
run-clang-tidy-3.8.py: error: unrecognized arguments: -Wno-unknown-warning-option
Run Code Online (Sandbox Code Playgroud) 存在几种为 C/C++ 设计的静态分析工具,但它们对于测试 CUDA 源并不是特别有用。
由于clang 版本 6能够编译 CUDA,我想检查使用 clang-tidy 的选项,它似乎没有切换架构的选项。
有办法让它发挥作用吗?例如,用于打开 CUDA 解析器的编译时开关、自定义检查形式的扩展,或者可能是计划中的功能?
据我所知,Clan-tidy 可以
在默认检查集(clang-analysisr)之上执行这些检查https://clang.llvm.org/extra/clang-tidy/checks/list.html并且 Clang 也可以检测错误和警告
https://clang.llvm.org/docs/DiagnosticsReference.html
他们可以检测到不同的错误或警告列表吗?
Clang-Tidy 在后台使用 Clang 吗?两者之间有什么联系吗?
我正在clang-tidy使用以下命令运行:
run-clang-tidy.py -checks="-*,cppcoreguidelines-*,hicpps-*" -header-filter=".*" -fix"
Run Code Online (Sandbox Code Playgroud)
(或者clang-tidy -checks="-*,cppcoreguidelines-*,hicpps-*" -header-filter=".*" -fix"也可以)
这会返回很多错误。自从我添加了该选项以来,它还applying fixes...在终端中显示-fix。
我的问题是cppcoreguidelines-*和hicpps-*修复未应用,仅显示。我选择不支持修复我的 1000 个问题的检查吗?
我到处搜索,但可能使用了错误的术语。我还没有找到一个选择。
我发现的唯一问题是这个未解决的问题(但是范围更广):CPP棉绒:您可以对类变量强制使用它吗?。
我在一个项目中使用 clang-tidy 10,它在带有 MSVC STL 的 Windows 上表现得很奇怪。一个最小的例子如下:
#include <iostream>
#include <stdexcept>
int main()
{
try {
throw std::runtime_error {"Boom!"};
} catch (...) {
std::cerr << "Unexpected non-exception error!\n";
}
}
Run Code Online (Sandbox Code Playgroud)
如果我告诉它包含检查 bugprone-exception-escape,它会告诉我函数“main”中可能会引发异常。但是,如果我使用以下命令将行流更改为 std::cerr ,则检查不会引起投诉:
std::cerr << "Unexpected non-exception error!\n" << std::flush;
Run Code Online (Sandbox Code Playgroud)
我假设一个语句中的两个连续流操作是导致不同行为的原因,因为以下确实会引发问题。
std::cerr << "Unexpected non-exception error!\n";
std::cerr << std::flush;
Run Code Online (Sandbox Code Playgroud)
我注意到 clang-tidy 不会抱怨 Linux 上的任何这些示例,至少如果我传递 -stdlib=libc++ 的话。我是否遗漏了一些奇怪的微妙之处,或者这是 clang-tidy 和/或 MSVC 的 STL 实现中的错误?
我在一个项目树上运行了 clang-tidy(“现代化”模块),我一直在努力使 C++17 保持合理的最新状态。它纠正的几乎所有内容对我来说都不足为奇,除了一件事:它改变了所有这些类型的结构:
void foo(const std::string& str) {
}
Run Code Online (Sandbox Code Playgroud)
..对此:
void foo(std::string str) {
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么。在我未经训练的眼睛看来,这意味着两件事:
不过,我确实看到了一个好处——通过将一个对象作为const引用传递,它只是一个“删除常量”,无论如何都不会被改变,所以我想通过值传递可以解决这个问题。
为什么它建议删除带有非常量传递值的常量引用?
在 ubuntu 20.04 (10.0.0) 中打包的 clang-tidy 似乎在一个相当简单的代码块上窒息,它涉及结构化绑定和移动操作:
#include <memory>
#include <tuple>
struct T {
~T() {
if(ptr != nullptr) { // clang-tidy is convinced ptr is uninitialized when the tuple is destroyed.
}
}
T(T&& rhs) : ptr(rhs.ptr) {
rhs.ptr = nullptr;
}
// Be very explicit for the sake of the MCVE.
T() = default;
T(const T&) = delete;
T& operator=(T&&) = delete;
T& operator=(const T&) = delete;
int* ptr = nullptr;
};
std::tuple<T, T> foo();
void bar() { …Run Code Online (Sandbox Code Playgroud) 该clang-tidy --dump-config命令产生如下内容:
---
Checks: 'clang-diagnostic-*,clang-analyzer-*'
WarningsAsErrors: ''
HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false
FormatStyle: none
User: [...]
CheckOptions:
- key: [...]
value: [...]
[...]
Run Code Online (Sandbox Code Playgroud)
该选项的含义是什么AnalyzeTemporaryDtors?设置为 后会发生什么变化true?所有其他选项都有记录,但我找不到与此相关的任何文档,并且我找不到更改该选项值的任何差异。
请考虑下面的代码,特别是观察get_length返回const size_t.
#include <stdio.h>
const size_t get_length(void)
{
return 123;
}
void foo(void)
{
size_t length = get_length();
length++;
printf("Length #1 is %zu\n", length);
}
void bar(void)
{
// Still 123 because length was copied from get_length
// (copy ellision notwithstanding, which is not the point here)
size_t length = get_length();
printf("Length #2 is %zu\n", length);
}
int main(void) {
foo();
bar();
}
Run Code Online (Sandbox Code Playgroud)
输出:
Length #1 is 124
Length #2 is 123
Run Code Online (Sandbox Code Playgroud)
我从 clang-tidy 收到以下警告:
Clang-Tidy: …Run Code Online (Sandbox Code Playgroud) clang-tidy ×10
c++ ×7
c++17 ×2
clang ×2
c ×1
clang-format ×1
cmake ×1
cuda ×1
linux ×1
visual-c++ ×1