给定一个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)
我可以通过按照以下逻辑对源代码进行静态分析来实现这一点:
这不是一个正确的实现.
一些研究:
我已经了解了调试器如何捕获信息.
互联网中的一些链接: 如何使用写入地址捕获内存写入和调用函数
没有完全回答你的问题,但只是记录访问你可以做:
#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
下面是我解决这个问题的方法:
我当然能够实现我想要的,但如果有人有的话,我仍在寻找更好的实现。
为了进一步讨论,如果有人愿意,我们可以聊天。
我参考以下工具的源代码和算法:
https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool