Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: need an advice how to detect a bug

Author: Dieter Buerssner

Date: 14:01:07 11/04/02

Go up one level in this thread


On November 04, 2002 at 12:41:52, Daniel Clausen wrote:

>What is a "typical" level 4 warning in M$VC? I remove all warnings, even gccs
>warning "last line not terminated with CR". :)

I find even warning level 3 too annoying.

Look at the following very carefully written code:

/* Call with 2 < range <= MY_RAND_MAX+1, returns 0 <= r < range. */
unsigned long rand_rangei(unsigned long range)
{
  unsigned long rmax, r, d;
  /* find the largest number rmax <= MY_RAND_MAX, for which
     (rmax+1) % range == 0.
     All returns from rand() > rmax will be skipped, to guarantee
     equal probability for all return values. */
  d = (MY_RAND_MAX+1U-range) / range + 1;
  rmax = d * range - 1; /* -1 to avoid "overflow to zero" */
  do
    r = PRNG();
  while (r > rmax);
  return r/d;
}

If MY_RAND_MAX happens to be ULONG_MAX, MY_RAND_MAX+1 will be 0 (this is
guaranteed by the C-Standard). The code still works - actually it is written
with this case in mind. Slightly different formulations can easily be non
portable, or produce wrong result for some values of MY_RAND_MAX and/or range.

But MSVC with warning level 3 will take the fun, and complain about the
overflow.

Warning level 4 will warn about macros:

#define FOO() \
  do {statement1; statment2;} while (0)

because of the "while(0)" but not about the inferior:

#define FOO() \
  {statement1; statment2;}

The differnce can be seen, when something starts with

  if (some_condition)
    FOO();
  else
  { ... }

The first macro will do the intended thing, and the second one is a synthax
error. I think, more subtle cases are possible.

Regards,
Dieter










This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.