Как найти все обращения к памяти (глобальные, локальные) каждой функцией в данном C-коде? - PullRequest
2 голосов
/ 11 ноября 2019

Учитывая код C и переменную в коде C (глобальную или локальную переменную функции), есть ли способ найти функции, которые используют эту переменную? Это также должно показать доступ к переменной с помощью функции, если к ней также обращаются через указатель.

Попытка извлечь информацию с использованием LLVM IR, но кажется трудной.


int a = 2;
int array1 = {1,2,3};

int function1(int c, int d) {
   return c + d;
}

int function2 (int arg1[], int * p1, int *p2) {
   int a;
   return arg1[2]+ (*p1) +a + (*p2);
}

int main() {
   int e =2, f=3,g;

   g = function1(e,f);

   int array2[] = {1,2,3,4};

   g = function2(array1,&e,array2);

   return 0;
}
variables and the functions which uses them<br/>
globals:<br/>
  a - none,<br/>
  array1 - function2, main<br/>
local variables :<br/>
  function2:a - function2,<br/>
  main:e - main,  function2,<br/>
  main:f - main,<br/>
  main:g - main,<br/>
  main:array2 - main,function2

1 Ответ

1 голос
/ 11 ноября 2019

есть способ найти функции, использующие эту переменную

Лучше всего будет использовать IDE, большинство из них смогут отслеживать ссылки на глобальные переменные.

В качестве альтернативы вы можете использовать инструмент статического анализа, например cxref (тот, который соответствует https://linux.die.net/man/1/cxref).. Я использовал его давным-давно, и это было полезно. Есть инструмент документации с тем же именем, которыйможет работать.

В крайнем случае, если у вас нет другого выбора, прокомментируйте объявление переменной и попробуйте построить код. Компилятор выдаст ошибку при каждой неправильной ссылке. (Незначительное исключение: локально ограниченопеременные, которые скрывают глобальные определения, могут не вызывать ошибку).

показывает доступ к переменной с помощью функции, если к ней также осуществляется доступ через указатель.

Эточрезвычайно сложный (невозможный для реальных программ) с статическим анализом. Обычно это делается во время выполнения. Некоторые отладчики (например, gdb watch) позволяют идентифицировать whru переменная изменяется (в том числе с помощью указателей). С помощью аппаратной поддержки также можно установить 'read watch' в gdb. См. Gdb rwatch и Можно ли установить точку останова для «доступа к памяти» в GDB?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...