blob: 6bb850ecd588392fdefc9b8645773d9b00c7386c [file] [log] [blame]
/* 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;
}