假设我有一些C ++函数:
void A(int i) {
/* some code */
}
void A(string s) {
/* some code */
}
void A(string s, int i) {
/* some code */
}
假设第一个调用占A()调用的80%,第二个调用占15%,最后一个调用占5%。
我想静态跟踪呼叫。如果我对第一种调用感兴趣,没问题,大多数“ A(”)的字符串搜索结果都将是类型1,但是如果我只想要类型2或类型3,那么我将不需要很多类型1发出的噪音。
对于类型3,正则表达式可以帮助我寻找以下括号内A(*,*,*)
之间恰好有2个逗号的字符串(我实际上不知道RE的编程语法)
但是对于类型2,这是行不通的。
我可以使用任何技术来通过其签名找到函数调用吗?
编辑:“跟踪”的意思是通过查找所需函数的所有调用点来理解当前代码库。
答案 0 :(得分:2)
对于类型3,正则表达式可以帮助我查找以下括号内的括号A(,,*)之间恰好有2个逗号的字符串(我实际上不知道RE的编程语法)
但是对于类型2,这是行不通的。
我可以使用任何技术来通过其签名找到函数调用吗?
除了使用一些正则表达式搜索文件(例如,使用Notepad ++文件搜索,egrep或类似工具),并假设您能够更改声明/定义这些函数的源代码之外,还可以使用一些编译器标准[[deprecated]]
属性之类的功能:
void A(int i) {
/* some code */
}
[[deprecated]] void A(string s) {
// ^^^^^^^^^^^^^^
/* some code */
}
[[deprecated]] void A(string s, int i) {
// ^^^^^^^^^^^^^^
/* some code */
}
使用这些功能时,将向您显示警告:
int main() {
A(5);
A("Hello");
A("Hello",42);
}
main.cpp:9:25: note: declared here [[deprecated]] void A(string s) { ^ main.cpp:20:18: warning: 'void A(std::__cxx11::string)' is deprecated [-Wdeprecated-declarations] A("Hello"); ^ main.cpp:9:25: note: declared here [[deprecated]] void A(string s) { ^ main.cpp:21:21: warning: 'void A(std::__cxx11::string, int)' is deprecated [-Wdeprecated-declarations] A("Hello",42); ^ main.cpp:13:25: note: declared here [[deprecated]] void A(string s, int i) { ^ main.cpp:21:21: warning: 'void A(std::__cxx11::string, int)' is deprecated [-Wdeprecated-declarations] A("Hello",42); ^ main.cpp:13:25: note: declared here [[deprecated]] void A(string s, int i) { ^
请参阅使用g ++编译的online example。
您甚至可以用一条消息修饰您的同事,以维护代码库:
[[deprecated("Get rid of these performance killing calls."
" Use A(A::getPrecomputedHash(s)) instead.")]]
void A(string s) {
}