【问题标题】:PVS-Studio: No compilation units were foundPVS-Studio:未找到编译单元
【发布时间】:2021-05-17 02:29:06
【问题描述】:

我在基于 ubuntu:18.04 的 docker 镜像中使用 PVS-Studio 使用 arm-none-eabi-gcc 交叉编译几个文件。在做pvs-studio-analyzer trace -- .test/compile_with_gcc.sh strace_out 文件创建成功后,它不是空的并且包含对arm-none-eabi-gcc 的调用。

但是pvs-studio-analyzer analyze 抱怨“没有找到编译单元”。我尝试使用--compiler arm-none-eabi-gcc 键没有成功。

有什么想法吗?

【问题讨论】:

  • 很遗憾,要回答您的问题,我们需要的信息比您的问题包含的更多。为了研究这个问题,我们需要分析 strace_out 文件中的编译器调用。你能和我们分享这个文件吗?您可以将其上传到云资源并在此处发布链接。
  • @AndreyKarpov 当然,pastebin.com/4mSMvM9e
  • 您好,我们查看了 strace_out 文件,发现源文件位于根文件夹中。假设分析器缺乏分析它们的权限。尝试使用 sudo 或在管理员帐户下运行分析。
  • @AndreyKarpov 嗯,它在 docker 容器中,没有指定用户,所以它已经在 root 下运行。

标签: pvs-studio


【解决方案1】:

问题在于我的编译方法。我没有使用正确的构建系统,而是使用了一个古怪的 shell 脚本(当然,我认为,对 3 个文件使用构建系统是一种过度杀伤,shell 脚本不会伤害任何人)。在那个脚本中,我使用grep 重新定义了源代码中的一个常量——有点像:grep -v -i "#define[[:blank:]]\+${define_name}[[:blank:]]" ${project}/src/main/main.c | ~/opt/gcc-arm-none-eabi-8-2018-q4-major/bin/arm-none-eabi-gcc -o main.o -xc

所以编译器没有实际上编译了一个正确的文件,它编译了 grep 的输出。很自然,PVS-Studio 无法对其进行分析。

TL;DR:不要使用 shell 脚本作为构建系统。

【讨论】:

    【解决方案2】:

    我们已经查看了 stace_out 文件。如果源文件和编译器位于 stace_out 文件中的绝对路径,则分析器可以正确处理它。我们有一个可以帮助你的建议。您可以在对pvs-studio-analyzer -- tracepvs-studio-analyzer analyze 的调用中“包装”构建命令,并将它们放在您的脚本中(compile_with_gcc.sh)。因此,脚本应该以命令开头:

    pvs-studio-analyzer trace --
    

    并以命令结束:

    pvs-studio-analyzer analyze
    

    这样我们将确保构建和分析是在同一个容器运行时开始的。如果建议的方法没有帮助,请通过命令更详细地描述构建项目和运行分析器的过程。还告诉我们容器是否在构建和形成 strace_out 之间重新运行,以及分析本身。 如果您使用可选的 --dump-log 标志运行 pvs-studio-analyzer 命令并将其提供给我们,这也会对我们有很大帮助。可用于执行此操作的命令示例:

    pvs-studio-analyzer analyze --dump-log ex.log
    

    另外,好像不能快速解决问题,通过产品网站上的反馈表继续对话可能更方便。

    【讨论】:

    • 我试图为你准备最小的例子来重现这个,我想我不小心把它缩小到问题的实际根源(我:D)。我编译了三个文件,但是其中两个被故意排除在分析之外,只剩下main.c。这就是我如何编译它grep -v -i "#define[[:blank:]]\+${define_name}[[:blank:]]" ${project}/src/main/main.c | ~/opt/gcc-arm-none-eabi-8-2018-q4-major/bin/arm-none-eabi-gcc -o main.o -xc。是啊,难怪PVS不能分析这个文件。我觉得有点恶心-_-
    • 我是否理解正确,问题已找到并解决?如果是这样,请将问题标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 2013-06-07
    • 2019-10-31
    • 2017-09-11
    • 1970-01-01
    • 2019-03-21
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多