| |
| /* This test case was originally written by Nicholas Nethercote. */ |
| |
| |
| |
| |
| /* For 'x', we get an uninitialised error for every addition to it. For |
| each one we get one origin identified, even though most of them involve |
| more than one undefined value. */ |
| |
| /* For 'y', we get a single uninitialised value error, on the value handed |
| to the exit() system call. Fair enough. |
| |
| An important question is: which of the origins is reported in the |
| error? Well, considering that (1) m_execontext allocates ECUs |
| (origin tags, basically) in increasing order, and (2) memcheck's |
| instrumentation for dealing with two uninitialised sources simply |
| involves 'max'-ing the otags, we expect the origin to be attributed |
| to the last of the 8 mallocs, that is, to p_ui8. |
| */ |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| |
| static int x = 0; |
| static int y = 0; |
| |
| int main(void) |
| { |
| // Do them separately rather than all in one array so they all have |
| // different origins. |
| int* p_ui1 = malloc(sizeof(int)); |
| int* p_ui2 = malloc(sizeof(int)); |
| int* p_ui3 = malloc(sizeof(int)); |
| int* p_ui4 = malloc(sizeof(int)); |
| int* p_ui5 = malloc(sizeof(int)); |
| int* p_ui6 = malloc(sizeof(int)); |
| int* p_ui7 = malloc(sizeof(int)); |
| int* p_ui8 = malloc(sizeof(int)); |
| int ui1 = *p_ui1; |
| int ui2 = *p_ui2; |
| int ui3 = *p_ui3; |
| int ui4 = *p_ui4; |
| int ui5 = *p_ui5; |
| int ui6 = *p_ui6; |
| int ui7 = *p_ui7; |
| int ui8 = *p_ui8; |
| |
| #define P printf("huh?") |
| |
| x += (ui1 == 0x12345678 ? P : 23); |
| x += (ui1 +ui2 == 0x12345678 ? P : 24); |
| x += (ui1 +ui2 +ui3 == 0x12345678 ? P : 25); |
| x += (ui1 +ui2 +ui3 +ui4 == 0x12345678 ? P : 26); |
| x += (ui1 +ui2 +ui3 +ui4 +ui5 == 0x12345678 ? P : 27); |
| x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 == 0x12345678 ? P : 28); |
| x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 == 0x12345678 ? P : 29); |
| x += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 +ui8 == 0x12345678 ? P : 30); |
| |
| y += (ui1 ); |
| y += (ui1 +ui2 ); |
| y += (ui1 +ui2 +ui3 ); |
| y += (ui1 +ui2 +ui3 +ui4 ); |
| y += (ui1 +ui2 +ui3 +ui4 +ui5 ); |
| y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 ); |
| y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 ); |
| y += (ui1 +ui2 +ui3 +ui4 +ui5 +ui6 +ui7 +ui8); |
| |
| return y & 1; |
| } |