Clang 静态分析器找不到 stdio.h

Clang static analyzer can't find stdio.h

我正在尝试在一个非常简单的程序上使用 Clang 静态分析器:

#include <stdio.h>
main ()
{
    printf("Hello, world !");
}

当我这样做时

clang helloworld.c

程序编译成功


当我这样做时

clang -cc1 -analyze -analyzer-checker=unix helloworld.c

它引发错误:

helloworld.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^
1 error generated.

clang --analyze -Xanalyzer -analyzer-checker=unix helloworld.c

不打印任何东西。


有什么问题,我该如何解决? 我假设静态分析器看不到头文件,尽管编译器可以使用它们。 请帮帮我。

有时检查器无法读取默认包含路径。因此,您可能希望将其作为参数传递。 您可以使用以下命令找到 clang 查看的确切包含路径:

clang -E -x c - -v < /dev/null

然后您的最终查询将变为:

clang -I<path to include> --analyze -Xanalyzer -analyzer-checker=unix helloworld.c

使用 -cc1 标志的解决方案:

查看 clang 正在接收哪些包含路径。标志 -v 是关键选项。使用它的快速方法如下(由@Nishant 给出)以及它打印的示例包含路径,

$ clang -E -x c - -v < /dev/null
...
#include <...> search starts here:
/usr/local/include
/home/codeman/.itsoflife/local/packages-live/llvm-clang6/build/lib/clang/6.0.1/include
/usr/include/x86_64-linux-gnu
/usr/include
...

在我的机器上,简单地使用以下命令就可以无缝地工作,

$ clang --analyze -Xanalyzer -analyzer-checker=debug.DumpCFG main.c

然而,正如您所指出的,以下表格失败了,

$ clang -cc1 -analyze -analyzer-checker=debug.DumpCFG main.c

对于第二个命令(使用 -cc1),您可以创建一个环境变量,比如 MY_INCLUDES,其中包含必要的内容。将下面的代码(根据您的系统使用必要的包含路径)粘贴到 ~/.bashrc~/.zshrc 中,具体取决于您使用的是 bash 还是 zsh。 (不要忘记 source ~/.bashrcsource ~/.zshrc

export MY_INCLUDES="-I/usr/local/include -I/home/codeman/.itsoflife/local/packages-live/llvm-clang6/build/lib/clang/6.0.1/include -I/usr/include/x86_64-linux-gnu -I/usr/include"

现在bash使用,

$ clang -cc1 $MY_INCLUDES -analyze -analyzer-checker=debug.DumpCFG main.c

关于 zsh 使用,

$ clang -cc1 ${=MY_INCLUDES} -analyze -analyzer-checker=debug.DumpCFG main.c

请注意在 -cc1 之后但在 main.c 文件之前使用 MY_INCLUDES。此外,在 zsh 上,必须使用带有环境变量的 = 前缀,否则它被视为单个字符串(详情 see this answer)。