1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h"
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void)
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // The n*size multiplication overflows in this example.  The only sensible
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // thing to do is return NULL, but old versions of Valgrind didn't (they
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // often ground to a halt trying to allocate an enormous (but not as
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // enormous as asked-for!) block.  See bug 149878.
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int* x;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if VG_WORDSIZE == 8
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size_t szB = 0x1000000010000001ULL;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size_t szB = 0x10000001UL;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x = calloc(szB, 0x10);
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "x = %#lx\n", (long)x);
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
21