gpt4 book ai didi

c++ - 我们如何检测源代码中的所有指针比较? C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:25 26 4
gpt4 key购买 nike

我们想从类类型中找到所有指针比较。例如,我们有一个类 A 和从 A 派生的类,如 B、C 等。

A *pa;
A *pa2;
B *pb;

必须在我们的源代码中找到所有比较,例如 if (pa == pa2) 或 if (pa != pb)。

我知道我们可以使用 CLang 分析器来查找这些比较,但我们的源代码与 CLang 不兼容。我们正在使用 visual studio 2015。

请不要给出这样的解决方案;从源代码中删除 A 类,然后尝试对其进行编译,以便找到 A 类中未编译的所有用法。

有没有人找到它的解决方案?像 CppCheck(检查可能的错误)或 Visual Studio 扩展这样的工具?

编辑:

有谁知道,我怎样才能在我的代码中找到所有与 CppDepend/CQLinq 语法的比较?它也可以帮助我。 CppDepend 使用 CLang,但如果它有解析错误,它会继续解析。

最佳答案

我们的 DMS Software Reengineering Toolkit与其 C++14 front end可用于执行此操作。

DMS 是一种通用的程序分析和转换机制,可以对其进行定制,以在作为插件模块提供给它的编程语言上实现所需的效果。它的 C++14 前端可配置地处理纯 ANSI、GCC/Clang 风格的语法或 Visual Studio 语法。它包括一个完整的预处理器。

为了实现 OP 的目的,可以将 DMS 配置为:

  1. 解析生成 AST 的编译单元。
  2. 为每个编译单元执行名称和类型解析。这构建了包含类型信息的符号表,并提供了一个基础用于计算任意表达式的类型。这种能力是内置于 DMS 的 C++ 前端。
  3. 抓取 AST,寻找运算符 == 和 !=
  4. 让 DMS 计算右侧和左侧子表达式的类型
  5. 验证该类型是目标类,还是从目标类继承的类型。 (大概目标类被标识为在某个源文件/行位置定义;这可以通过搜索符号表找到。检查一个类型是否派生自另一个类型只是递归搜索记录的可能多个父链接的问题用于符号表链接以检查父项是否是所需的目标类型)。
  6. 报告操作者的文件名、来源行和列。

上述每个步骤都由 DMS 和 C++14 前端提供的机制/API 直接支持。这可能需要将几页自定义代码添加到 DMS 才能达到效果。

关于c++ - 我们如何检测源代码中的所有指针比较? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39013233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com