如何在g ++代码中找到给定成员函数或ctor的所有位置?

时间:2016-12-07 01:37:22

标签: c++ gcc

我试图找到一个大而古老的代码库中的所有位置,其中调用某些构造函数或函数。具体来说,这些是std::string类中的某些构造函数和成员函数(即basic_string<char>)。例如,假设有一行代码:

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

在这个示例中,我不明白snark可能是char *,这是我感兴趣的。

尝试解决这个问题

我已经查看了gcc的一些转储功能,并生成了其中一些功能,但是我还没有找到任何能告诉我给定代码行会调用string构造函数采用const char *。我还用-s编译了一些代码来保存生成的等效汇编代码。但这有两个方面:功能名称是&#34;损坏,&#34;因此无法知道C ++术语中的内容是什么;并且没有任何类型的行号,所以即使在源文件中找到相同的位置也很难。

动机与背景

在我的项目中,我们将大型旧代码库从HP-UX(及其aCC C ++编译器)移植到RedHat Linux和gcc / g ++ v.4.8.5。 HP工具链允许用string指针初始化NULL,将其视为空字符串。 Gnu工具&#39;生成的代码失败,带有一些null的解除引用错误。因此,我们需要找到所有可能的情况,并对其进行补救。 (例如,通过添加代码来检查NULL并使用指向""字符串的指针。)

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

3 个答案:

答案 0 :(得分:1)

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

Clang有一个叫做clang分析器,可以扩展。

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

here的手册。

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

答案 1 :(得分:0)

首先我要创建一个这样的标题:

#include <string>

class dbg_string : public std::string {
public:
    using std::string::string;
    dbg_string(const char*) = delete;
};

#define string dbg_string

然后修改你的makefile并将“-include dbg_string.h”添加到cflags中以强制包含在每个源文件上而不进行修改。

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

答案 2 :(得分:0)

您可以尝试使用CppDepend及其CQLinq强大的代码查询语言来检测使用某些构造函数/方法/字段/类型的位置。

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