如何在G 代码中找到给定的成员函数或CTOR的所有位置
How can I find all places a given member function or ctor is called in g++ code?
我试图在调用某些构造函数或功能的大型和旧代码基础中找到所有位置。具体而言,这些是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 }
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针