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