搜索具有特定签名调用的函数

Search for function with specific signature call?

本文关键字:名调用 函数 搜索      更新时间:2023-10-16

假设我有一些C++函数:

void A(int i) {
/* some code */
}
void A(string s) {
/* some code */
}
void A(string s, int i) {
/* some code */
}

假设第一次调用进行了 80% 的 A(( 调用,第二次调用进行了 15%,最后一次调用进行了 5%。

我想静态跟踪调用。如果我对第一种调用感兴趣,没问题,"A("的大部分字符串搜索结果都是类型 1,但如果我只想要类型 2 或类型 3,我会有很多不必要的噪音来自类型 1。

对于类型 3,如果我查找括号A(*,*,*)之间正好有 2 个逗号的以下字符串,正则表达式会有所帮助(我实际上不知道 RE 的编程语法(

但是对于类型 2,这将不起作用。

我可以使用任何技术来通过签名查找函数调用?

编辑:我所说的"跟踪"是通过查找所需函数的所有调用点来理解当前的代码库。

对于类型 3,如果我查找括号 A(,,*( 之间正好有 2 个逗号的以下字符串正则表达式会有所帮助(我实际上不知道 RE 的编程语法(

但是对于类型 2,这将不起作用。

我可以使用任何技术来通过签名查找函数调用?

除了使用一些正则表达式(例如记事本++文件搜索,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++ 编译的在线示例。

您甚至可以用一条消息来装饰它,发送给维护代码库的同事:

   [[deprecated("Get rid of these performance killing calls."
                " Use A(A::getPrecomputedHash(s)) instead.")]] 
      void A(string s) {
      }