微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

需求:

给定一个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

原文地址:https://www.jb51.cc/c/115731.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐