1 /* For a long time (from Valgrind 1.0 to 1.9.6, AFAICT) when realloc() was
2    called and made a block smaller, or didn't change its size, the
3    ExeContext of the block was not updated;  therefore any errors that
4    referred to it would state that it was allocated not by the realloc(),
5    but by the previous malloc() or whatever.  While this is true in one
6    sense, it is misleading and not what you'd expect.  This test
7    demonstrates this -- 'x' and 'y' are unchanged and shrunk, and their
8    ExeContexts should be updated upon their realloc().  I hope that's clear.
9 */
10 #include <stdlib.h>
11 
12 int main(void)
13 {
14    int* x = malloc(5);
15    int* y = malloc(10);
16    int* z = malloc(2);
17    int a, b, c;
18 
19    x = realloc(x, 5);   // same size
20    y = realloc(y, 5);   // make smaller
21    z = realloc(z, 5);   // make bigger
22 
23    a = (x[5] == 0xdeadbeef ? 1 : 0);
24    b = (y[5] == 0xdeadbeef ? 1 : 0);
25    c = (z[5] == 0xdeadbeef ? 1 : 0);
26 
27    return a + b + c;
28 }
29