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

San*_*hra 10 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;
}
Run Code Online (Sandbox Code Playgroud)

执行上面的代码我想生成以下格式的日志文件:

1- Global variable a written in function main() "TIME_STAMP"
2- Global variable a read in function main() "TIME_STAMP"
Run Code Online (Sandbox Code Playgroud)

研究:

我可以通过按照以下逻辑对源代码进行静态分析来实现这一点:

  • 浏览c代码并识别读取全局变量的语句.
  • 然后分析c代码语句以确定它是读还是写语句.(检查++或 - 运算符是否与全局变量一起使用或者是否已对全局变量进行任何赋值)
  • 在标识的语句上方添加一条日志语句,该语句将与此语句执行一起执行.

这不是一个正确的实现.

一些研究:

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

互联网中的一些链接: 如何使用写入地址捕获内存写入和调用函数

alk*_*alk 7

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

哪个会打印:

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
Run Code Online (Sandbox Code Playgroud)


San*_*hra -1

下面是我解决这个问题的方法:

  • 我创建了一个实用程序(在java中),其工作原理如下(C程序源文件是我的实用程序的输入):
    • 逐行解析文件,识别变量和函数。
    • 它将全局变量存储在单独的容器中并查找使用它们的行。
    • 对于访问全局变量的每一行,我正在分析它们,以确定它是读操作还是写操作(例如:==、+=、-+ 等是写操作)。
    • 对于每一个这样的操作,我都会按照@alk(/sf/answers/2881124991/)的建议来检测代码,当我执行修改后的源文件时,这又会生成日志文件。

我当然能够实现我想要的,但如果有人有的话,我仍在寻找更好的实现。

为了进一步讨论,如果有人愿意,我们可以聊天。

我参考以下工具的源代码和算法:

http://www.dyninst.org/

https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool