Good point, though changing the function to return rval in the other case seems to change the result not at all. I suspect that (due to luck) rval is on the stack in any case.
Here is the modified code, with some additional checks: #include <ext/rope> #include <iostream> #include <assert.h> using namespace std; using namespace __gnu_cxx; static unsigned int rand(unsigned int max) { unsigned int rval = (unsigned int)(((double)max)*rand()/(RAND_MAX)); if (rval == max) return max-1; return rval; } int main() { crope r; char buf[10240]; while (1) { if (rand(2) && r.size() < 1024*1024) { unsigned int s = rand(10240); assert(s <= 10240); r.append(buf, rand(10240)); } else if (r.size() > 10240) { unsigned int s = rand(10240); assert(s <= r.size()); r.erase(0, rand(10240)); } } return 0; } On Wed, Mar 19, 2003 at 12:52:07AM +0000, Philip Martin wrote: > > unsigned int rand(unsigned int max) { > > unsigned int rval = (unsigned int)(((double)max)*rand()/(RAND_MAX)); > > if (rval == max) > > return max-1; > > } > > This function returns no value if rval != max so the behaviour is > undefined. > > -- > Philip Martin