dmd warning request: warn for bitwise OR in conditional

Daniel Murphy yebbliesnospam at gmail.com
Fri Jan 22 03:25:59 PST 2010


bearophile Wrote:

> Ali:
> > We've been bitten by the following bug recently in C code:
> >      uint flag = 0x1;
> >      uint flags;
> > 
> >      if (flags | flag) {
> >          dout.writefln("oops");
> >      }
> > 
> > The programmer intended &.
> > It is (almost?) always an error to use | in a conditional.
> 
> Why do you think it's almost always an error?
> 
> I have seen more than one time a related bug in C code (once written by me and other times written by other people):
> if (foo & bar) {...
> 
> instead of:
> if (foo && bar) {...
> 
> To avoid this kind of bug you can disallow integers in conditionals (requiring something like a ! or == 0 to turn an integral value in a boolean) as Java (and partially Pascal), or you can remove the && || from the language and replace them with "and" and "or", so it becomes easy to tell them apart from bitwise operators. I like the second way.
> 
> Bye,
> bearophile

The difference between those two use cases is that (a & b) is commonly used to check if a bit has been set.  (a | b) yields the same result as (a || b) when used in a conditional.

Is there any valid use for (a | b) as a 'truth' value?

Daniel



More information about the Digitalmars-d mailing list