Запишите, была ли прочитана или записана глобальная переменная

Требования:

Учитывая программу 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