Hacker Newsnew | comments | show | ask | jobs | submit login

That should generate a compiler warning. And if you're not a criminal you have warnings set as errors.



There is nothing incorrect or dubious in C about an expression like if (foo = bar), so it wasn't considered a reason to warn the user about for a long time, despite being a rather common culprit for bugs. Compilers popping up warnings about that is a fairly recent event.

-----


Pretty sure that's been a warning for a long long time in most compilers. They require you to wrap the assignment to suppress it, that is: if ( (foo=bar) )

Anyho, it really depends on what your -W level is set to. It's good practice to use "-Wall"

-----


-Wall doesn't give all errors though, you probably want -Wall -Wextra.

-----


What a misleading name for a compiler flag.

-----


Yes this is why people worship LLVM...

-----


That's still stupid. Put the assignment on its own line.

-----


Wow, what an insightful comment.

-----


Likewise.

-----


I hope you're being sarcastic!

-----


Under what circumstances would you place an assignment into an if statement condition?

-----


I like doing it in certain cases. It definitely helps in a while loop when you are working with a stream, iterator, or stack and pulling items off while it isn't empty. Not really sure about the if, it's just kind of convenient sometimes. Guess it all comes down to preference. Too much use and it becomes very unreadable.

-----


You just gave me an example of a loop. In what circumstances do you find it convenient, and when do you feel that the advantages of convenience outweigh that of code readability?

-----


If it's a single assignment, then it's merely a preference. I cannot think of a case where it is explicitly better for a single conditional.

However, a compound conditional can actually be more clear if the assignment is there in many cases. For example:

    if ( (elt = db.getNextResult) && elt.shouldProcess){
        ...  ...
    }
In a compound conditional, the assignment is forced to be wrapped in parenthesis, so the ambiguity doesn't exist.

Anyho, that's that.

-----


With that if statement, does it first assign the value of db.getNextResult() and then check the elt.shouldProcess variable to see if it is true or false, or does it firstly check to see if elt.shouldProcess is true or false and then load the next result from the database?

-----


Conditionals are evaluated left to right chris. It's no different than any other conditional. An assignment simply evaluates to the lvalue.

-----


According to C99, 6.5.16 clause 4, the order of evaluations on operands is undefined and if an attempt is made to modify or access the operand is after the next sequence point then the behavior is undefined.

-----


Chris, && and || are short-circuited operators that create sequence points. They are exceptions to that rule.

except where noted [e.g. special rules for && and ||], the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is Unspecified.

This is basic stuff Chris, let's not debate the obvious, this kind of code is all over the place in the Linux kernel.

-----


I appreciate your candour. Can you point me to where this sort of thing is used in the Linux kernel? It looks like it is frowned on to me:

* http://linux-kernel.2935.n7.nabble.com/PATCH-drivers-net-ifb...

* http://linux-kernel.2935.n7.nabble.com/PATCH-1-4-silicom-che...

* http://linux-kernel.2935.n7.nabble.com/PATCH-0-4-Staging-sil...

Not to mention, checkpatch.pl checks for assignments in if statements:

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...

I should point out that someone tried to add a backdoor into the Linux kernel source through the use of an assignment in an if statement in 2004. What are your thoughts on this?

https://freedom-to-tinker.com/blog/felten/the-linux-backdoor...

Also, where is the place in the C99 standard that details the exception? Genuinely curious. When I reviewed the standard, all that is said about the if statement is in section 6.8.4.1, and that says nothing about short circuited logic, certainly nothing about "exceptions to the rule". This seems compiler specific, but I'm happy to be shown to be wrong - if you can point me to the part in the standard.

-----


Sure, if by "fairly recent" you mean at least more than twenty years ago:

http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=1853

-----


That's GCC. Some of us were blessed with commercial compilers.

-----


GCC isn't the only compiler on the planet :-). Other compilers either started doing it more recently, or not at all. The construct it most often warns about is fairly idiomatic on Unix platforms, but not everywhere, so a lot of vendors were not quite as bothered about it.

-----


GCC is indeed not the only compiler around, which is why I said "at least" :-) Even if you're stuck with some other compiler for production builds, it's handy to be compiling regularly with a variety of compilers so as to benefit from the union of the diagnostic abilities of all of them.

The construct is a useful idiom, but oftentimes there would be or ought to be a local coding standard recommending that you make what you're doing explicit by comparing the assignment result to the appropriate flavour of zero:

  if ((foo = bar) != NULL)
Now everybody can see what's going on, the warning doesn't arise, and no pedants can complain about the theoretically-unnecesary parentheses in `if ((foo = bar))`.

-----


> GCC is indeed not the only compiler around, which is why I said "at least" :-) Even if you're stuck with some other compiler for production builds, it's handy to be compiling regularly with a variety of compilers so as to benefit from the union of the diagnostic abilities of all of them.

In my case, at least one of the compilers in question was for the 8051, the platform that won't fucking die. Due to the peculiarities of the aforementioned piece of silicon crap, the compiler was not entirely ANSI-compliant (various #pragmas were actually required to produce working code, indicating various parameters related to memory organisation and the such), thus making it rather difficult to compile the codebase with anything but that particular compiler.

> The construct is a useful idiom, but oftentimes there would be or ought to be a local coding standard recommending that you make what you're doing explicit by comparing the assignment result to the appropriate flavour of zero

This is the solution I adhere to as well.

-----


This was an oooold SunOS compiler that didn't warn about much other than you owe Sun more cash.

Also when you're drunk, the warnings result in "ahh who cares" :)

-----




Applications are open for YC Winter 2016

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact

Search: