如何检查给定文件是否存在依赖项错误

How do I check whether given files have dependency bugs?

本文关键字:是否 文件 存在 依赖 错误 何检查 检查      更新时间:2023-10-16

我对C++相当陌生,并被分配了以下任务:

鉴于我有以下文件集:alpha.cpp,bravo.cpp和charlie.cpp,我应该创建一个程序来检查这些文件是否有依赖项错误。

我的想法是让程序读取文件,创建一个邻接列表图,将每个文件作为顶点,如果一个.cpp文件包含另一个.cpp文件,则从一个节点到另一个节点的定向边。所以总的来说,我需要先对图表进行深度搜索,看看图表是否有任何后边缘。

这是正确的轨道吗?我觉得我明白我应该做什么,但我不确定如何准确实现它。

我会使用带有一点解析魔法的构建系统。 我有一个Makefile,我在这里用于很多项目。 它解析出包含并为其生成目标。

关于像Make这样的工具的事情是,它们必须为你做一个图形遍历。 他们通过获取所有部分排序(依赖项声明(并对其进行拓扑排序以获得完整的排序(文件的线性化,以便如果 A 依赖于 B,则 B 在 A 之前(来实现这一点。

但是,关于拓扑排序的事情是它只存在于直接无环图中。 因此,如果您生成像 Makefile 这样的依赖项,并且有任何循环,则构建将失败,这是您想要的,因为当您尝试递归包含内容时,无论如何都会发生这种情况。

顺便说一句:根据您问题中的评论对"依赖错误"的定义不是很有用。一般来说,包含b.h包含a.h a.h不一定是任何类型的错误。如果包含它们的文件编译,那么显然您具有有效的C++。所以,不是错误。会出现以下情况:

  1. 给定的依赖周期可能是不必要的:某些b.h可能实际上不需要包含a.h。编译成功。

  2. 给定的依赖循环可能是必要的,但有效:某些b.h可能需要来自a.h的内容,并且它可能会向a.h提供一些东西,但包含语句和依赖项是有序的,以便它工作。编译成功。

  3. 给定的依赖周期可能是必要的,并且无效:不可能满足所述的依赖关系。编译失败。

要检测 #3,您只需要编译文件,如果编译失败,则可能存在依赖项错误。

可能会对 a.hb.h 中的声明/定义以及将 #3 转换为 #2 的包含语句进行重新排序。

#

2 和 #1 不一定是错误,但您必须完全解析文件以确定是否属于这种情况。

当然,您可以简单地声明这些循环在您的项目中是不允许的。所以它们违反了你的项目规则,也许这让你称它们为错误:)

如果您正在寻找工具来查看依赖项,我会考虑使用:

  • makedependg++ -MD(或clang++ -MD(用于生成#include依赖关系。然后构建一个图形来检测循环。
  • g++ -cnm(-U--defined-only(来读取目标文件中定义和需要的符号。您甚至可以比较已定义和声明的符号列表(包括像/usr/lib64/libstdc++.so.6这样在某处定义的符号(,以查看是否缺少符号。
相关文章: