需求:
给定一个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代码语句来确定是否
它是一个读或写语句(检查if或 – 操作符
与全局变量或任何assignemnt一起使用
全局变量)
>在执行的标识语句之上添加一个日志声明
连同这个陈述执行.
这不是一个正确的实现.
一些研究:
我已经了解了调试器如何捕获信息.
互联网中的一些链接:
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