C静态指针守卫如何重复工作?

How C static pointer guards repeating work?

我是C新手,

在学习llvm的时候遇到了如下代码

#include <stdint.h>
#include <stdio.h>
#include <sanitizer/coverage_interface.h>


 // This callback is inserted by the compiler as a module constructor
 // into every DSO. 'start' and 'stop' correspond to the
 // beginning and end of the section with the guards for the entire
 // binary (executable or DSO). The callback will be called at least
 // once per DSO and may be called multiple times with the same parameters.
void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) {
  static uint64_t N;  // Counter for the guards.
  if (start == stop || *start) return;  // Initialize only once.
  printf("INIT: %p %p\n", start, stop);
  for (uint32_t *x = start; x < stop; x++)
    *x = ++N;  // Guards should start from 1.
    printf("%p \n", x);
}

static uint64_t N; 重要

守卫柜台。

没有它,将重复以下 for 循环。

我知道它能做什么。

它是如何工作的?


以上代码打印的内容如下:

INIT: 0x104351508 0x104351544
0x104351508 
0x10435150c 
0x104351510 
0x104351514 
0x104351518 
0x10435151c 
0x104351520 
0x104351524 
0x104351528 
0x10435152c 
0x104351530 
0x104351534 
0x104351538 
0x10435153c 
0x104351540 

uint32_t *x = start;

之后

为什么*x = ++N;不改变x的位置?

why *x = ++N; does not change x's position?

您似乎对“指针的值”“指针指向的值”(又名指向对象的值)。

指针x

初始化
uint32_t *x = start;
\---------/ \------/
 Defines     Initializes the value of the pointer to equal the value of start
 the 
 pointer x

然后x被这段代码改变:

x++

这部分

*x = ++N;

不会改变x的值。相反,它更改 指向 对象的值。

如果你改变

printf("%p \n", x); --> printf("%p %u\n", x, *x);

你会看到类似

的输出
INIT: 0x104351508 0x104351544
0x104351508 1
0x10435150c 2
0x104351510 3
0x104351514 4
0x104351518 5
0x10435151c 6
0x104351520 7
0x104351524 8
0x104351528 9
0x10435152c 10
0x104351530 11
0x104351534 12
0x104351538 13
0x10435153c 14
0x104351540 15

其中第一列是指针的值 x,第二列是指向对象的值.

在你写的问题中:

static uint64_t N; matters

Counter for the guards.

without it, the following for loop repeats.

有点不清楚您在这里问的是什么,但是使用关键字 static 意味着对象 N 在调用之间保留其值。换句话说,如果您在上述示例之后再次调用该函数,则 N 的起始值为 15。因此,如果您提供一个新区域(即新的 startstop 值),您可能会看到如下内容:

INIT: 0x104351600 0x10435160c
0x104351600 16
0x104351604 17
0x104351608 18