Поиск функции с определенным вызовом подписи? - PullRequest
1 голос
/ 09 апреля 2019

Предположим, у меня есть некоторые функции 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 регулярные выражения могут помочь, если я ищу следующую строку, содержащую ровно 2 запятых между скобками A(*,*,*) (на самом деле я не знаю синтаксиса программирования для RE)

Но для типа 2 это не сработает.

Можно ли использовать какой-либо метод для поиска вызова функции по ее сигнатуре?

Редактировать: что я имею в виду под "трассировка "понимает текущую кодовую базу, находя все точки вызова необходимой функции.

1 Ответ

2 голосов
/ 09 апреля 2019

Для типа 3 регулярные выражения могут помочь, если я ищу следующую строку, содержащую ровно 2 запятых между скобками A (, , *) (на самом деле я не знаю синтаксиса программирования для 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 ++.

Вы можете даже украсить это сообщением для ваших коллег, поддерживающих кодовую базу:

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