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 ~/.bashrc
或 source ~/.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)。
我正在尝试在一个非常简单的程序上使用 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 ~/.bashrc
或 source ~/.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)。