как статически получить имя файла и номера строк, которые приводят к установке переменной в C? - PullRequest
0 голосов
/ 14 июля 2020

У меня большая программная система, написанная на C. У меня есть все источники. Я пытаюсь найти инструмент, который поможет мне определить (желательно с помощью анализа stati c) функции и номера строк, которые могут установить интересующую меня переменную. Пример:

void func_a(int q) {
   int z;
   ...
   z = q*2;
   ....
   func_b(z);   //  I NEED TO FIND OUT ALL LINES in ALL FILES that can set "z"
}

int main(int argc, char *argv[]) {
     int x;
     ...
     x = 38;
     ...
     func_a(x);
}

Мне бы хотелось, чтобы мне сказали:

main()   x = 38;
func_a(x);
void func_a(int q);
func_a() z = q*2;

Выше 4 строк определяют значение z, которое я собираюсь отправить в func_b ().

Я изучил clang, gtags (с --idutils) и некоторые другие. Я не могу определить, поддерживается ли это. Естественно, main () и func_a () могут находиться в разных файлах. c и иметь множество других строк, не связанных с моей интересующей переменной (это большая программная система).

Любые подсказки приветствуются.

1 Ответ

1 голос
/ 14 июля 2020

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

Эта проблема является неразрешимый. См. теорему Райса

Интуиция подсказывает, что если у вас есть automati c переменная x, вы можете передать его адрес &x в другое место и произвольно (также прочтите этот черновик отчета, возможно, рассмотрите возможность использования Bismon в конце 2020 года). У вас будет сложный псевдоним указателя .

Однако вы можете рассмотреть возможность использования Frama- C (с добавленными вручную аннотациями в ACSL ) или Clang stati c анализаторы и отладчики. Обратите внимание, что GDB предоставляет точки наблюдения .

Если ваш C компилятор является недавним G CC, вы можете написать свой собственный G CC plugin , чтобы помочь вам (и проанализировать GIMPLE представление вашей программы). Ожидайте нескольких недель или месяцев работы. В старых версиях G CC необслуживаемый G CC MELT (который я написал) может быть полезен.

...