如何在G 代码中找到给定的成员函数或CTOR的所有位置

How can I find all places a given member function or ctor is called in g++ code?

本文关键字:函数 成员 CTOR 位置 代码      更新时间:2023-10-16

我试图在调用某些构造函数或功能的大型和旧代码基础中找到所有位置。具体而言,这些是std::string类中的某些构造函数和成员功能(即basic_string<char>)。例如,假设有一行代码:

std::string foo(fiddle->faddle(k, 9).snark);

在此示例中,看着这一点并不明显,snark可能是char *,这是我感兴趣的。

尝试解决此问题到目前为止

我已经研究了GCC的一些转储功能,并生成了其中的一些功能,但是我找不到任何告诉我给定代码行的人会生成对string构造函数的呼叫const char *。我还使用-s编译了一些代码,以保存生成的等效汇编代码。但是,这有两件事:函数名称是"被弄糊的",因此不可能知道C 的术语所谓的内容;而且没有任何行数,因此即使在源文件中找到同等位置也很难。

动机和背景

在我的项目中,我们正在将大型的旧代码基础从HP-UX(及其ACC C 编译器)移植到RedHat Linux和GCC/G v.4.8.5。HP工具链允许使用NULL指针初始化string,将其视为空字符串。GNU工具生成的代码失败了,带有无效解释错误的风格。因此,我们需要找到所有潜在的情况,并纠正它们。(例如,通过添加代码检查NULL并使用指针到""字符串。)

因此,如果外面的任何人不得不处理基本问题并可以提供其他建议,那么也将受到欢迎。

您是否考虑过使用静态分析?

clang有一个可扩展的称为clang分析仪。

您可以通过实现查找字符串变量声明并将其设置为null的clang ast访问者来编写自定义插件来检查此特定行为。

这里有一本手册。

另请参见:https://github.com/facebook/facebook-clang-plugins/blob/master/master/analyzer/danglingdelegatefactfinder.cpp

首先,我会创建一个标题:

#include <string>
class dbg_string : public std::string {
public:
    using std::string::string;
    dbg_string(const char*) = delete;
};
#define string dbg_string

然后修改您的makefile,然后将" -cinclude dbg_string.h"添加到cflags将每个源文件包含在无需修改的情况下包含。

您还可以检查如何在平台上定义NULL并为其添加特定的过载(例如dbg_string(int))。

您可以尝试使用cppdepdept,其CQLINQ强大的代码查询语言来检测某些构图/方法/fields/types使用的位置。

from m in Methods where m.IsUsing ("CClassView.CClassView()") select new { m, m.NbLinesOfCode }