1 
2 /* This test case was originally written by Nicholas Nethercote. */
3 
4 
5 
6 
7 /* For 'x', we get an uninitialised error for every addition to it.  For
8    each one we get one origin identified, even though most of them involve
9    more than one undefined value. */
10 
11 /* For 'y', we get a single uninitialised value error, on the value handed
12    to the exit() system call.  Fair enough.
13 
14    An important question is: which of the origins is reported in the
15    error?  Well, considering that (1) m_execontext allocates ECUs
16    (origin tags, basically) in increasing order, and (2) memcheck's
17    instrumentation for dealing with two uninitialised sources simply
18    involves 'max'-ing the otags, we expect the origin to be attributed
19    to the last of the 8 mallocs, that is, to p_ui8.
20 */
21 
22 #include <stdlib.h>
23 #include <stdio.h>
24 
25 static int x = 0;
26 static int y = 0;
27 
main(void)28 int main(void)
29 {
30    // Do them separately rather than all in one array so they all have
31    // different origins.
32    int* p_ui1 = malloc(sizeof(int));
33    int* p_ui2 = malloc(sizeof(int));
34    int* p_ui3 = malloc(sizeof(int));
35    int* p_ui4 = malloc(sizeof(int));
36    int* p_ui5 = malloc(sizeof(int));
37    int* p_ui6 = malloc(sizeof(int));
38    int* p_ui7 = malloc(sizeof(int));
39    int* p_ui8 = malloc(sizeof(int));
40    int  ui1 = *p_ui1;
41    int  ui2 = *p_ui2;
42    int  ui3 = *p_ui3;
43    int  ui4 = *p_ui4;
44    int  ui5 = *p_ui5;
45    int  ui6 = *p_ui6;
46    int  ui7 = *p_ui7;
47    int  ui8 = *p_ui8;
48 
49 #define P   printf("huh?")
50 
51    x += (ui1                                    == 0x12345678 ? P : 23);
52    x += (ui1 +ui2                               == 0x12345678 ? P : 24);
53    x += (ui1 +ui2 +ui3                          == 0x12345678 ? P : 25);
54    x += (ui1 +ui2 +ui3 +ui4                     == 0x12345678 ? P : 26);
55    x += (ui1 +ui2 +ui3 +ui4 +ui5                == 0x12345678 ? P : 27);
56    x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6           == 0x12345678 ? P : 28);
57    x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7      == 0x12345678 ? P : 29);
58    x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 +ui8 == 0x12345678 ? P : 30);
59 
60    y += (ui1                                   );
61    y += (ui1 +ui2                              );
62    y += (ui1 +ui2 +ui3                         );
63    y += (ui1 +ui2 +ui3 +ui4                    );
64    y += (ui1 +ui2 +ui3 +ui4 +ui5               );
65    y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6          );
66    y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7     );
67    y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 +ui8);
68 
69    return y & 1;
70 }
71