我试图找到一个大而古老的代码库中的所有位置,其中调用某些构造函数或函数。具体来说,这些是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
并使用指向""
字符串的指针。)
因此,如果那里的任何人不得不处理基本问题并且可以提供其他建议,那么这些建议也会受到欢迎。
答案 0 :(得分:1)
您是否考虑过使用静态分析?
Clang有一个叫做clang分析器,可以扩展。
您可以编写一个自定义插件,通过实现查找字符串变量声明并检查将其设置为null的clang ast访问者来检查此特定行为。
有here的手册。
答案 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 }