[Bug c/29280] misleading warning for assignment used as truth construct

2006-09-30 Thread elanthis at awesomeplay dot com


--- Comment #2 from elanthis at awesomeplay dot com  2006-09-30 15:20 
---
I only bring it up because I've repeatedly seen novice programmers get confused
by the warning.  It might be clear to someone who's an experienced C developer,
but then, they probably don't really need the warning all that much anyhow.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29280



[Bug c/29280] New: misleading warning for assignment used as truth construct

2006-09-28 Thread elanthis at awesomeplay dot com
For code of the form:
if (var = 0)
gcc recommends adding parentheses around the construct.  This is intended to
disambiguate code of the form:
if (ptr = get_ptr())
by coercing people to write it in the form:
if ((ptt = get_ptr()) != NULL)

However, in many cases, especially for novice C developers, the code was
intended to mean:
if (ptr == get_ptr())
or
if (var == 0)

I'm submitting this bug report because I just saw yet another case of a novice
developer posting on a forum that he had been trying to get some code to work,
and the code he posted included:
if (( var = 0 ))
I asked and found that he had done what the gcc warning had kindly suggested,
not really understanding what the warning meant.

The warning is "warning: suggest parentheses around assignment used as truth
value"

I suggest several possibilities to improve the situation.  The first is to
simply alter or expand the warning slightly.  Perhaps something like, "warning:
use == for testing equality; suggest parentheses around assignment used as
truth value"

The second is to use two separate warning message with some heuristics to
determine which to prefer.  For example, an assignment to a constant is very
rarely used as a truth value.  Code of the form 'if ( var = 0 )' should produce
a warning that == must be used to test equality.  I won't try to make concrete
suggestions on the best set of heuristics for these cases, but that one at
least is obvious.  I would wager that using any non-function expression in an
assignment rvalue as a truth value is very rare; that is, 'if ( (foo = bar) !=
0 )' is far rarer than 'if ( (foo = baz()) != 0 )'.


-- 
   Summary: misleading warning for assignment used as truth
construct
   Product: gcc
   Version: 4.1.2
Status: UNCONFIRMED
  Severity: minor
  Priority: P3
 Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: elanthis at awesomeplay dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29280