CCTLib
Calling-context and data-object attribution library for Intel Pin
redspy_tp_sizes.c
Go to the documentation of this file.
1 // True-positive victim exercising multiple write sizes: for each size class
2 // (1/2/4/8 bytes), write the same value twice to the same location.
3 #include <stdint.h>
4 
5 #define WORK_COUNT 5000
6 
7 static volatile uint64_t sink;
8 
9 __attribute__((noinline)) void s1(volatile uint8_t* p, uint8_t v) { *p = v; }
10 __attribute__((noinline)) void s2(volatile uint16_t* p, uint16_t v) { *p = v; }
11 __attribute__((noinline)) void s4(volatile uint32_t* p, uint32_t v) { *p = v; }
12 __attribute__((noinline)) void s8(volatile uint64_t* p, uint64_t v) { *p = v; }
13 
14 int main(int argc, char** argv) {
15  (void)argc; (void)argv;
16  uint8_t b1[WORK_COUNT] __attribute__((aligned(64)));
17  uint16_t b2[WORK_COUNT] __attribute__((aligned(64)));
18  uint32_t b4[WORK_COUNT] __attribute__((aligned(64)));
19  uint64_t b8[WORK_COUNT] __attribute__((aligned(64)));
20 
21  for (int i = 0; i < WORK_COUNT; ++i) {
22  b1[i]=0xA; b2[i]=0xAAAA; b4[i]=0xAAAAAAAAu; b8[i]=0xAAAAAAAAAAAAAAAAull;
23  }
24  for (int i = 0; i < WORK_COUNT; ++i) {
25  s1(&b1[i], 0x5A); s1(&b1[i], 0x5A); // redundant byte pair
26  s2(&b2[i], 0x1234); s2(&b2[i], 0x1234);
27  s4(&b4[i], 0xC0FFEEu); s4(&b4[i], 0xC0FFEEu);
28  s8(&b8[i], 0xDEADBEEFull); s8(&b8[i], 0xDEADBEEFull);
29  }
30 
31  uint64_t s = 0;
32  for (int i = 0; i < WORK_COUNT; ++i) s += (uint64_t)b1[i] + b2[i] + b4[i] + b8[i];
33  sink = s;
34  return 0;
35 }
#define WORK_COUNT
int main(int argc, char **argv)
__attribute__((noinline))
static volatile uint64_t sink