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