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。因此,如果您提供一个新区域(即新的 start
和 stop
值),您可能会看到如下内容:
INIT: 0x104351600 0x10435160c
0x104351600 16
0x104351604 17
0x104351608 18
我是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。因此,如果您提供一个新区域(即新的 start
和 stop
值),您可能会看到如下内容:
INIT: 0x104351600 0x10435160c
0x104351600 16
0x104351604 17
0x104351608 18