]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/exp-ptrcheck/tests/partial.c
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / exp-ptrcheck / tests / partial.c
1
2 #include <stdlib.h>
3
4 int main ( void )
5 {
6    int* x3 = malloc(3); float f __attribute__((unused)), *f3 = malloc(3);
7    int* x4 = malloc(4); double d __attribute__((unused)), *d7 = malloc(7);
8    int* x5 = malloc(5); long long int lli __attribute__((unused)), *lli7 = malloc(7);
9    int* x6 = malloc(6); char c __attribute__((unused)), *c0   = malloc(0);
10    int* x7 = malloc(7); short int s __attribute__((unused)), *s1 = malloc(1);
11    int  x __attribute__((unused));
12    int* y4 = malloc(4);
13    int* y5 = malloc(5);
14    int* y6 = malloc(6);
15    int* y7 = malloc(7);
16
17    #define ADDB(ptr, n)  ((int*)(((unsigned long)(ptr)) + (n)))
18
19    // All these overrun by a single byte;  the reads are happening at
20    // different alignments.
21    x = * ADDB(x3,0);    // ok if --partial-loads-ok=yes
22    x = * ADDB(x4,1);
23    x = * ADDB(x5,2);
24    x = * ADDB(x6,3);
25    x = * ADDB(x7,4);    // ok if --partial-loads-ok=yes
26
27    // These are fine
28    x = * ADDB(y4,0);
29    x = * ADDB(y5,1);
30    x = * ADDB(y6,2);
31    x = * ADDB(y7,3);
32
33    // These are all bad, at different points along
34    x = * ADDB(x3,-1);   // before
35    x = * ADDB(x3, 0);   // inside      // ok if --partial-loads-ok=yes ...
36    x = * ADDB(x3, 1);   // inside      // ... but only on 32 bit platforms
37    x = * ADDB(x3, 2);   // inside      // ... ditto
38    x = * ADDB(x3, 3);   // after
39
40    // These are all bad
41    f   = * f3;    // ok if --partial-loads-ok=yes  // ... ditto
42    d   = * d7;
43    lli = * lli7;  // ok if --partial-loads-ok=yes  see XXX below
44    c   = * c0;
45    s   = * s1;
46
47    return 0;
48 }
49
50 /* Note re XXX, this gives different behaviour on 32 and 64 bit
51 platforms, because on 64-bit it's one load whereas as on 32 bit
52 platforms it's necessarily 2 32-bit loads, and the first one is OK. */