我需要检查某个函数是否使用了一些常量字符串,在我的示例中将其称为SpecialFunc
,但这在普通情况下变得非常复杂。
假设我们有两个文件:
Foo.h:
class Foo {
public:
void RandomFunc();
private:
static constexpr auto SomeConst {"Buzz"};
};
Foo.cpp:
#include "Foo.h"
#include <string>
void Foo::RandomFunc() {
SpecialFunc("Fizz");
SpecialFunc(SomeConst);
const std::string otherConst = "Bar";
SpecialFunc(otherConst);
}
我希望获得Fizz
,Buzz
和Bar
作为我的输出。
当前,我尝试使用正则表达式在Python中实现此功能以找到SpecialFunc
,但是当您必须搜索常量时,这种实现变得非常混乱且难以处理,并且变得更加混乱范围问题。 Clang是我尝试解析所有内容的下一个选择,但是我不确定是否有更好的方法。
解决此问题的最佳方法是什么?我一直在尝试使用Python作为当前的语言,但是我也愿意跳到另一种语言。
答案 0 :(得分:0)
好吧,因为您不想使用RegEx,并且像在深度代码分析中一样想表达自己的问题,所以我现在建议使用(一部分)编译器进行词法分析。这种方式非常困难且耗时。但是您实际上可以分析有关代码的所有内容。而且您会学到很多。
因此,基本思想是编译器将您的C / C ++代码带入一个称为AST(抽象语法树)的图形中。在该图中,您可以找到所谓的令牌,它们代表程序的不同“部分”。
这个想法很简单:如果在词法分析器构建AST之前告诉编译器您不希望进行优化,那么您将找到字符串或包含字符串的变量。因此,您必须使用AST,查找所有相关功能,然后检查参数是字符串还是字符串变量。
几年前,我已经使用python包“ pycparser”做过类似的事情。
但是我必须警告您,这将是很多工作。我强烈建议您首先问自己为什么要这样做,并检查是否没有可用的工具来完成您想做的事情。