c - 记录全局变量是否已被读取或写入

标签 c algorithm

要求:

给定一个 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代码语句以确定是否 它是一个读或写语句。(检查++ 或 -- 运算符是否 与全局变量一起使用或已对 全局变量)
  • 在将要执行的标识语句上方添加一条日志语句 随着这条语句的执行。

这不是一个正确的实现。

一些研究:

我已经了解了调试器如何捕获信息。

部分网络链接: How to catch a memory write and call function with address of write

最佳答案

没有完全回答你的问题,但只是记录你可以做的访问:

#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

关于c - 记录全局变量是否已被读取或写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41158677/

相关文章:

c - 为什么这个小函数(在opengl中画一个圆圈)不能用c编译?

c - 调用 pthread_spin_destroy() 时,到底释放了什么 "resources"?

c - 没有这样的文件或目录,但文件在那里

c++ - 如何将字符串压入堆栈?

java - 在邻接表中存储边缘数据?

c++ - 这个算法的复杂度是多少

c - for循环无限运行为什么?

algorithm - 在有向无环加权图中查找前 3 条最长路径

algorithm - 计算问答游戏的准确性

从n中生成k个元素的 "anti-Gray"按需组合的算法