我在Ubuntu 12.10上运行Clang 3.4(来自http://llvm.org/apt/).我在一些代码上运行了分析器(clang --analyze),它发现了一些问题:
Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size
unsigned char separatedData[groupDataLength];
^~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
但具体问题并不重要.我想知道它是如何得出这个结论的步骤(代码很复杂,我不能在15分钟内看到它).
我看到Clang网站的截图,显示了在网络浏览器中查看的工作步骤:

这可能是从Xcode获得的.
问题是:如何让Clang从命令行输出这些工作步骤?如果愿意,甚至可以将结果输出到浏览器?这将使分析仪显着更有用,并使修复更快.
(我注意到GCC的文档非常优秀,但Clang/LLVM的文档很差.我已经尝试过"clang --analyze -Xanalyzer'-v'"作为黑暗中的刺,告诉分析仪更详细 - -Xanalyzer开关来自手册页.)
我正在尝试为clang-tidy创建一个自定义cmake目标,以便对我的项目进行lint.源文件夹看起来像这样:
src/scripts/run-clang-tidy.py
src/.clang-tidy
src/...
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的计划是使用自定义命令将这两个文件复制到构建目录:
add_custom_command(
OUTPUT run-clang-tidy.py .clang-tidy
COMMAND cp ${CMAKE_SOURCE_DIR}/scripts/run-clang-tidy.py ${CMAKE_SOURCE_DIR}/.clang-tidy ${CMAKE_CURRENT_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)
我现在想要run-clang-tidy.py在构建目录(应该是工作目录)中调用自定义目标,以便我可以调用:
make lint
Run Code Online (Sandbox Code Playgroud)
哪个应该运行指定的检查.clang-tidy.
要使此脚本起作用,它还需要该CMAKE_EXPORT_COMPILE_COMMANDS选项.我尝试使用以下命令设置它,但它无法识别它:
add_definitions(-DCMAKE_EXPORT_COMPILE_COMMANDS=ON)
Run Code Online (Sandbox Code Playgroud)
电话add_custom_target怎么样?
我有一个非常简单的.c文件,里面有一些明显的错误.
#include <stdio.h>
struct S {
int x;
};
void f(struct S s){
}
void test() {
struct S s;
f(s); // warn
}
int test2(int x){
return 5/(x-x); // warn
}
int main(){
test();
test2(532);
printf("Hej\r\r");
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用clang的静态代码分析工具(scan-build)来检测错误.当我直接在文件上运行该工具时,例如使用以下命令:
scan-build g ++ -o 1 1.c.
我确实获得了预期的输出,包括来自编译器的警告,该警告提到除以0.
scan-build:使用'/usr/lib/llvm-3.8/bin/clang'进行静态分析
1.c:在函数'int test2(int)'中:1.c:16:11:警告:除零[-Wdiv-by-zero]返回5 /(xx); ^
1.c:16:11:警告:除零返回5 /(xx);
〜^ ~~~~~生成1个警告.scan-build:找到1个bug.scan-build:运行'scan-view/tmp/scan-build-2016-07-11-152043-3028-1'来检查错误报告.
现在,我试图将该命令放入一个非常简单的Makefile中.我的Makefile的内容是:
all: 1.c
g++ -o 1 1.c
clean:
rm -f *.o 1
Run Code Online (Sandbox Code Playgroud)
但是,每当我使用make运行scan-build时,使用以下命令:
scan-build make
我仍然收到编译器的警告,但不是扫描构建工具!
scan-build:使用'/usr/lib/llvm-3.8/bin/clang'进行静态分析
g ++ -o 1 1.c.
1.c:在函数'int test2(int)'中:
1.c:16:11:警告:除零[-Wdiv-by-zero]返回5 …
我想尝试一下clang静态分析仪.我在Windows上并使用Visual Studio构建了clang.它似乎工作,但同时它似乎是非常无用的.
我做了一个示例文件
example.c
int main(void)
{
int h = 0;
return 1/h;
}
Run Code Online (Sandbox Code Playgroud)
调用scan-build gcc -c example.c没有发现错误.
example.c
int main(void)
{
int h;
return 1/h;
}
Run Code Online (Sandbox Code Playgroud)
调用scan-build gcc -c example.c没有发现错误.
example.c
int main(void)
{
return 1/0;
}
Run Code Online (Sandbox Code Playgroud)
调用scan-build gcc -c example.c没有发现错误.
如果找不到这些最基本的错误(并且可以通过clang本身找到它们),静态分析仪如何才能使用?
gcc如果重要的话,我是MinGW.我也试过替代,clang但没有发生任何事情.
我在这里做错了吗?
clang 的二进制 Windows 安装程序包含 scan-build,但是当您使用 msbuild 运行它时,什么也没有发生。即使我做了类似的事情:
"C:\Program Files\LLVM\bin\scan-build.bat" "C:\Program Files\LLVM\bin\clang.exe" test.cpp
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西:
scan-build: Using 'C:\Program Files\LLVM\bin\clang.exe' for static analysis
scan-build: Removed Directory '....'
scan-build: No Bugs found
Run Code Online (Sandbox Code Playgroud)
其中test.cpp是:
void DivideByZero(int z){
if (z == 0) {
int x = 1 / z;
}
}
int main() {
int *i = nullptr;
*i = 42;
DivideByZero(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下内容,我会收到一些警告:
"C:\Program Files\LLVM\bin\clang.exe" --analyze test.cpp
Run Code Online (Sandbox Code Playgroud)
回到我的问题。如何让它与 MSBUild 一起工作?scan-build 实际上在做什么,我应该使用它还是 --analyze?有什么不同?
clang ×5
c ×2
c++ ×1
clang-tidy ×1
cmake ×1
command-line ×1
lint ×1
linux ×1
llvm ×1
makefile ×1
msbuild ×1
scan-build ×1
target ×1
windows ×1