【发布时间】:2018-07-29 21:26:37
【问题描述】:
我想为在make 的帮助下构建的大型软件项目运行静态 C/C++(可能还有 Python、Java 等)代码分析工具。众所周知,make(或任何其他构建工具)为指定的源代码文件调用编译器和类似工具。也可以通过定义环境变量来控制编译,以便稍后通过其参数传递给编译器。
准确静态分析的关键是提供与传递给编译器完全相同的定义和包含路径(基本上是它的所有-D 和-I 参数)。这样,该工具将能够遵循编译器遵循的相同代码路径。
问题是,项目的高度复杂性意味着无法静态确定这样的环境,因为不同的文件是使用不同的定义/包含路径和其他编译标志集构建的。
这个想法是,应该有可能以某种方式捕获编译器的单个调用,并为每个输入文件传递给它的所有参数。有了这些信息并在其直接过滤之后(例如,不需要知道-O 优化级别或-W 警告设置),应该可以使用相同的一组定义/包含为每个输入文件调用静态分析器只针对那个输入文件。
问题是:是否有现有的工具/工作流程可以实现我所描述的想法?我最感兴趣的是针对 POSIX 系统的解决方案,但也欢迎针对 Windows 的想法。 p>
我自己的一些想法。
最简单的解决方案是收集
make输出并在之后处理它。但是,某些项目的 makefile 规则可以提供非常简洁的输出而不是冗长的输出,因此可能需要对 Makefile 进行一些修补,这并不总是可取的。并行构建也可能将它们的控制台输出混合在一起并且无法解析。适应其他构建系统 (Cmake) 也并非易事,因此远非最方便的方式。在
ptrace下运行make并记录与启动新应用程序相对应的exec*系统调用的所有调用,包括编译器调用。然后需要解析ptrace的输出。这种方法与构建系统和语言无关(将捕获对任何语言的任何编译器的所有调用)并且应该适用于并行构建。然而,它似乎在技术上更复杂。由于ptrace坐在make的背上,构建过程的性能下降也不清楚。将其移植到 Windows 也将更加困难,因为那里的程序跟踪 API 有所不同。Windows 上的 C++ 专有静态分析器(以及最近的 Linux AFAIK)PVS-Studio 似乎实现了第二种方法,但欢迎详细说明他们是如何做到的。如果有其他 IDE/工具已经有类似我需要的东西,请分享它们的信息。
【问题讨论】:
-
Android NDK 是一个基于 make 的框架,支持命令行参数
V=1回显所有编译和链接命令。以同样的方式检测您的 makefile 应该不会很困难。 -
@AlexCohn 是的,我知道 Makefiles 允许这样做;我们的项目中有相同的
V=1选项。问题是关于将静态分析器集成到大项目中的更一般的解决方案。直接为单源文件程序运行编译器是微不足道的;但是对于多文件源,人们使用make代替。静态分析器也是如此——它很容易用于玩具项目,但对于具有复杂源代码树的项目,最好以编排方式运行。 -
make -d 或 make SHELL='/bin/sh -x'
标签: c++ c makefile static-analysis ptrace