搜索具有特定签名调用的函数?
Search for function with specific signature call?
假设我有一些 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,如果我查找在括号之间恰好有 2 个逗号的后续字符串 A(*,*,*)
(我实际上并不知道 RE 的编程语法)
,正则表达式会有所帮助
但是对于类型 2 这将不起作用。
有什么技术可以用来通过签名查找函数调用吗?
编辑:"trace" 的意思是通过查找所需函数的所有调用点来理解当前代码库。
For type 3, regular expressions can help if I look for a following string that has exactly 2 comas between parenthesis A(,,*) (I don't actually know the programming syntax for RE)
But for type 2 this won't work.
Is there any technique I can use to find a function call by its signature?
除了使用一些正则表达式(例如 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) {
}
假设我有一些 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,如果我查找在括号之间恰好有 2 个逗号的后续字符串 A(*,*,*)
(我实际上并不知道 RE 的编程语法)
但是对于类型 2 这将不起作用。
有什么技术可以用来通过签名查找函数调用吗?
编辑:"trace" 的意思是通过查找所需函数的所有调用点来理解当前代码库。
For type 3, regular expressions can help if I look for a following string that has exactly 2 comas between parenthesis A(,,*) (I don't actually know the programming syntax for RE)
But for type 2 this won't work.
Is there any technique I can use to find a function call by its signature?
除了使用一些正则表达式(例如 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) {
}