Запишите, была ли прочитана или записана глобальная переменная
Требования:
Учитывая программу C, мне нужно определить, читают ли функции, обращающиеся к глобальным переменным, или записывая их.
Пример кода:
#include <stdio.h>
/* global variable declaration */
int g = 20;
int main()
{
/* writing the global variable */
g = 10;
/* reading the global variable */
printf ("value of g = %d\n", g);
return 0;
}
Выполняя приведенный выше код, я хочу сгенерировать файл журнала в следующем формате:
1- Global variable a written in function main() "TIME_STAMP"
2- Global variable a read in function main() "TIME_STAMP"
Исследования:
Я вполне могу добиться этого, выполнив статический анализ исходного кода в соответствии с приведенной ниже логикой:
- Пройдите код c и определите утверждения, в которых глобальная
переменная читается.
- Затем проанализируйте оператор c-кода, чтобы определить, если
это оператор чтения или записи. (Проверяя, является ли оператор ++ или -
используется с глобальной переменной или любым назначением для
глобальная переменная)
- Добавить оператор журнала над идентифицированным оператором, который будет выполняться
наряду с выполнением этой инструкции.
Это не правильная реализация.
Некоторые исследования:
Я понял, как отладчики могут захватывать информацию.
Некоторые ссылки в Интернете:
Как поймать функцию записи и вызова памяти с адресом записи
Ответы
Ответ 1
Ниже я решил решить эту проблему:
- Я создал утилиту (в java), которая работает как ниже (исходный файл программы C - это вход в мою утилиту):
- Разбирайте строку строки, определяя переменные и функции.
- Он хранит глобальные переменные в отдельном контейнере и ищет строки, используя их.
- Для каждой строки, которая обращается к глобальной переменной, я анализирую их, определяя, является ли это операцией чтения или операции записи (ex: ==, + =, - +
и т.д. - операция записи).
- Для каждой такой операции я использую код, предложенный @alk (fooobar.com/questions/559610/...), и который, в свою очередь, будет генерировать файл журнала, когда я выполню измененный исходный файл.
Я, конечно, могу добиться того, чего хочу, но все еще ищу для лучшей реализации, если у кого есть.
Для дальнейшего обсуждения, если кто-то хочет, чтобы у нас был чат.
Я ссылаюсь на исходный код и algos из следующих инструментов:
http://www.dyninst.org/
https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool
Ответ 2
Не полностью отвечая на ваш вопрос, но для доступа к журналу вы можете:
#include <stdio.h>
int g = 0;
#define g (*(fprintf(stderr, "accessing g from %s. g = %d\n", __FUNCTION__, g), &g))
void foo(void)
{
g = 2;
printf("g=%d\n", g);
}
void bar(void)
{
g = 3;
printf("g=%d\n", g);
}
int main(void)
{
printf("g=%d\n", g);
g = 1;
foo();
bar();
printf("g=%d\n", g);
}
Что бы напечатать:
accessing g from main. g = 0
g=0
accessing g from main. g = 0
accessing g from foo. g = 1
accessing g from foo. g = 2
g=2
accessing g from bar. g = 2
accessing g from bar. g = 3
g=3
accessing g from main. g = 3
g=3