LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
@ 2008-02-26 20:44 Julia Lawall
  2008-02-26 22:47 ` Tomas Winkler
  2008-03-05  6:38 ` Ingo Molnar
  0 siblings, 2 replies; 14+ messages in thread
From: Julia Lawall @ 2008-02-26 20:44 UTC (permalink / raw)
  To: yi.zhu, linux-wireless, ipw3945-devel, linux-kernel, kernel-janitors

From: Julia Lawall <julia@diku.dk>

In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337, a bug was fixed that
involved converting !x & y to !(x & y).  The code below shows the same
pattern, and thus should perhaps be fixed in the same way.

This is not tested and clearly changes the semantics, so it is only
something to consider.

The semantic patch that makes this change is as follows:
(http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@@ expression E1,E2; @@
(
  !E1 & !E2
|
- !E1 & E2
+ !(E1 & E2)
)
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>

---

diff -u -p a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-05 20:56:01.000000000 +0100
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-26 08:09:12.000000000 +0100
@@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(stru
 
 	if (sta_ht_inf) {
 		if ((!sta_ht_inf->ht_supported) ||
-		   (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
+		   (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
 			return 0;
 	}
 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-02-26 20:44 [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and & Julia Lawall
@ 2008-02-26 22:47 ` Tomas Winkler
  2008-02-27  0:59   ` John W. Linville
  2008-03-05  6:38 ` Ingo Molnar
  1 sibling, 1 reply; 14+ messages in thread
From: Tomas Winkler @ 2008-02-26 22:47 UTC (permalink / raw)
  To: Julia Lawall
  Cc: yi.zhu, linux-wireless, ipw3945-devel, linux-kernel, kernel-janitors

On Tue, Feb 26, 2008 at 10:44 PM, Julia Lawall <julia@diku.dk> wrote:
> From: Julia Lawall <julia@diku.dk>
>
>  In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337, a bug was fixed that
>  involved converting !x & y to !(x & y).  The code below shows the same
>  pattern, and thus should perhaps be fixed in the same way.
>
>  This is not tested and clearly changes the semantics, so it is only
>  something to consider.
>
>  The semantic patch that makes this change is as follows:
>  (http://www.emn.fr/x-info/coccinelle/)
>
>  // <smpl>
>  @@ expression E1,E2; @@
>  (
>   !E1 & !E2
>  |
>  - !E1 & E2
>  + !(E1 & E2)
>  )
>  // </smpl>
>
>  Signed-off-by: Julia Lawall <julia@diku.dk>
>
>  ---
>
>  diff -u -p a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
>  --- a/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-05 20:56:01.000000000 +0100
>  +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-26 08:09:12.000000000 +0100
>  @@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(stru
>
>         if (sta_ht_inf) {
>                 if ((!sta_ht_inf->ht_supported) ||
>  -                  (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
>  +                  (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
>                         return 0;
>         }

The patch was already submitted by Roel Kluin '[PATCH]
[wireless/iwlwifi/iwl-4965.c] add parentheses' I've acked it.
Didn't track it if it's actually committed into tree... John, Reinette ?

Thanks
Tomas


>  -
>  To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
>  the body of a message to majordomo@vger.kernel.org
>  More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-02-26 22:47 ` Tomas Winkler
@ 2008-02-27  0:59   ` John W. Linville
  0 siblings, 0 replies; 14+ messages in thread
From: John W. Linville @ 2008-02-27  0:59 UTC (permalink / raw)
  To: Tomas Winkler
  Cc: Julia Lawall, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors

On Wed, Feb 27, 2008 at 12:47:56AM +0200, Tomas Winkler wrote:

> >  diff -u -p a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
> >  --- a/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-05 20:56:01.000000000 +0100
> >  +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c 2008-02-26 08:09:12.000000000 +0100
> >  @@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(stru
> >
> >         if (sta_ht_inf) {
> >                 if ((!sta_ht_inf->ht_supported) ||
> >  -                  (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
> >  +                  (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
> >                         return 0;
> >         }
> 
> The patch was already submitted by Roel Kluin '[PATCH]
> [wireless/iwlwifi/iwl-4965.c] add parentheses' I've acked it.
> Didn't track it if it's actually committed into tree... John, Reinette ?

Already merged and sent to davem...

Thanks,

John
-- 
John W. Linville
linville@tuxdriver.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-02-26 20:44 [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and & Julia Lawall
  2008-02-26 22:47 ` Tomas Winkler
@ 2008-03-05  6:38 ` Ingo Molnar
  2008-03-05  6:49   ` Christopher Li
  1 sibling, 1 reply; 14+ messages in thread
From: Ingo Molnar @ 2008-03-05  6:38 UTC (permalink / raw)
  To: Julia Lawall
  Cc: yi.zhu, linux-wireless, ipw3945-devel, linux-kernel,
	kernel-janitors, Harvey Harrison, Alexander Viro, linux-sparse,
	Josh Triplett


* Julia Lawall <julia@diku.dk> wrote:

> From: Julia Lawall <julia@diku.dk>
> 
> In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337, a bug was fixed 
> that involved converting !x & y to !(x & y).  The code below shows the 
> same pattern, and thus should perhaps be fixed in the same way.

>  	if (sta_ht_inf) {
>  		if ((!sta_ht_inf->ht_supported) ||
> -		   (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
> +		   (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
>  			return 0;

i'm wondering, could Sparse be extended to check for such patterns? 

People are regularly running "make C=1" and are sending fixes to make 
entire subsystems sparse-warning-free, so Sparse is a nice mechanism 
that works and it keeps code clean in the long run.

I dont think the "!X & Y" pattern is ever used legitimately [and even if 
it were used legitimately, it's easy to avoid the sparse false positive 
- while in the buggy case we have a clear bug].

	Ingo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  6:38 ` Ingo Molnar
@ 2008-03-05  6:49   ` Christopher Li
  2008-03-05  7:02     ` Ingo Molnar
  0 siblings, 1 reply; 14+ messages in thread
From: Christopher Li @ 2008-03-05  6:49 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Julia Lawall, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors, Harvey Harrison, Alexander Viro,
	linux-sparse, Josh Triplett

I think Al Viro has sent a patch to linux-sparse with subject
"[PATCH 3/3] catch !x & y brainos" does exactly that.

Chris



On Tue, Mar 4, 2008 at 10:38 PM, Ingo Molnar <mingo@elte.hu> wrote:
>
>  * Julia Lawall <julia@diku.dk> wrote:
>
>  > From: Julia Lawall <julia@diku.dk>
>  >
>  > In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337, a bug was fixed
>  > that involved converting !x & y to !(x & y).  The code below shows the
>  > same pattern, and thus should perhaps be fixed in the same way.
>
>
> >       if (sta_ht_inf) {
>  >               if ((!sta_ht_inf->ht_supported) ||
>  > -                (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
>  > +                (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
>  >                       return 0;
>
>  i'm wondering, could Sparse be extended to check for such patterns?
>
>  People are regularly running "make C=1" and are sending fixes to make
>  entire subsystems sparse-warning-free, so Sparse is a nice mechanism
>  that works and it keeps code clean in the long run.
>
>  I dont think the "!X & Y" pattern is ever used legitimately [and even if
>  it were used legitimately, it's easy to avoid the sparse false positive
>  - while in the buggy case we have a clear bug].
>
>         Ingo
>  --
>  To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
>
>
> the body of a message to majordomo@vger.kernel.org
>  More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  6:49   ` Christopher Li
@ 2008-03-05  7:02     ` Ingo Molnar
  2008-03-05  7:09       ` Harvey Harrison
  2008-03-05  8:55       ` Julia Lawall
  0 siblings, 2 replies; 14+ messages in thread
From: Ingo Molnar @ 2008-03-05  7:02 UTC (permalink / raw)
  To: Christopher Li
  Cc: Julia Lawall, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors, Harvey Harrison, Alexander Viro,
	linux-sparse, Josh Triplett


* Christopher Li <sparse@chrisli.org> wrote:

> I think Al Viro has sent a patch to linux-sparse with subject "[PATCH 
> 3/3] catch !x & y brainos" does exactly that.

ah - nice :-)

/me checks the linux-sparse archive

Al's patch is:

+                       if (op == '&' && expr->left->type == EXPR_PREOP &&
+                           expr->left->op == '!')
+                               warning(expr->pos, "dubious: !x & y");

i think there might be similar patterns: "x & !y", "!x | y", "x | !y" ?

	Ingo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  7:02     ` Ingo Molnar
@ 2008-03-05  7:09       ` Harvey Harrison
  2008-03-05  8:19         ` Ingo Molnar
  2008-03-05  8:55       ` Julia Lawall
  1 sibling, 1 reply; 14+ messages in thread
From: Harvey Harrison @ 2008-03-05  7:09 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Christopher Li, Julia Lawall, yi.zhu, linux-wireless,
	ipw3945-devel, linux-kernel, kernel-janitors, Alexander Viro,
	linux-sparse, Josh Triplett

On Wed, 2008-03-05 at 08:02 +0100, Ingo Molnar wrote:
> * Christopher Li <sparse@chrisli.org> wrote:
> 
> > I think Al Viro has sent a patch to linux-sparse with subject "[PATCH 
> > 3/3] catch !x & y brainos" does exactly that.
> 
> ah - nice :-)
> 
> /me checks the linux-sparse archive
> 
> Al's patch is:
> 
> +                       if (op == '&' && expr->left->type == EXPR_PREOP &&
> +                           expr->left->op == '!')
> +                               warning(expr->pos, "dubious: !x & y");
> 
> i think there might be similar patterns: "x & !y", "!x | y", "x | !y" ?
> 

Well, (!x & y) and (!x | y) are probably the two that might have been
intended otherwise.  (x & !y), (x | !y) are probably ok.

Harvey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  7:09       ` Harvey Harrison
@ 2008-03-05  8:19         ` Ingo Molnar
  2008-03-05 12:13           ` Derek M Jones
  0 siblings, 1 reply; 14+ messages in thread
From: Ingo Molnar @ 2008-03-05  8:19 UTC (permalink / raw)
  To: Harvey Harrison
  Cc: Christopher Li, Julia Lawall, yi.zhu, linux-wireless,
	ipw3945-devel, linux-kernel, kernel-janitors, Alexander Viro,
	linux-sparse, Josh Triplett


* Harvey Harrison <harvey.harrison@gmail.com> wrote:

> > Al's patch is:
> > 
> > +                       if (op == '&' && expr->left->type == EXPR_PREOP &&
> > +                           expr->left->op == '!')
> > +                               warning(expr->pos, "dubious: !x & y");
> > 
> > i think there might be similar patterns: "x & !y", "!x | y", "x | !y" ?
> > 
> 
> Well, (!x & y) and (!x | y) are probably the two that might have been 
> intended otherwise.  (x & !y), (x | !y) are probably ok.

i think the proper intention in the latter cases is (x & ~y) and
(x | ~y).

My strong bet is that in 99% of the cases they are real bugs and && or 
|| was intended.

	Ingo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  7:02     ` Ingo Molnar
  2008-03-05  7:09       ` Harvey Harrison
@ 2008-03-05  8:55       ` Julia Lawall
  2008-03-05 12:20         ` Ingo Molnar
  1 sibling, 1 reply; 14+ messages in thread
From: Julia Lawall @ 2008-03-05  8:55 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Christopher Li, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors, Harvey Harrison, Alexander Viro,
	linux-sparse, Josh Triplett

There are some legitimate uses of !x & y which are actually of the form !x 
& !y, where x and y are function calls.  That is a not particularly 
elegant way of getting both x and y to be evaluated and then combining the 
results using "and".  If such code is considered acceptable, then perhaps 
the sparse patch should be more complicated.

julia

> Al's patch is:
> 
> +                       if (op == '&' && expr->left->type == EXPR_PREOP &&
> +                           expr->left->op == '!')
> +                               warning(expr->pos, "dubious: !x & y");
> 
> i think there might be similar patterns: "x & !y", "!x | y", "x | !y" ?
> 
> 	Ingo
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  8:19         ` Ingo Molnar
@ 2008-03-05 12:13           ` Derek M Jones
  0 siblings, 0 replies; 14+ messages in thread
From: Derek M Jones @ 2008-03-05 12:13 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Harvey Harrison, Christopher Li, Julia Lawall, yi.zhu,
	linux-wireless, ipw3945-devel, linux-kernel, kernel-janitors,
	Alexander Viro, linux-sparse, Josh Triplett

All,

>>> i think there might be similar patterns: "x & !y", "!x | y", "x | !y" ?
>>>
>> Well, (!x & y) and (!x | y) are probably the two that might have been 
>> intended otherwise.  (x & !y), (x | !y) are probably ok.
> 
> i think the proper intention in the latter cases is (x & ~y) and
> (x | ~y).
> 
> My strong bet is that in 99% of the cases they are real bugs and && or 
> || was intended.

Developer knowledge of operator precedence and the issue of what
they intended to write are interesting topics.  Some experimental
work is described in (binary operators only I'm afraid):

www.knosof.co.uk/cbook/accu06a.pdf
www.knosof.co.uk/cbook/accu07a.pdf

The ACCU 2006 experiment provides evidence that developer knowledge
is proportional to the number of occurrences of a construct in
source code, it also shows a stunningly high percentage of incorrect
answers.

The ACCU 2007 experiment provides evidence that the names of the
operands has a significant impact on operator precedence choice.

I wonder what kind of names are used as the operand of unary
operators?

I would expect the ~ operator to have a bitwise name, but the
! operator might have an arithmetic or bitwise name.

-- 
Derek M. Jones                              tel: +44 (0) 1252 520 667
Knowledge Software Ltd                      mailto:derek@knosof.co.uk
Applications Standards Conformance Testing    http://www.knosof.co.uk

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05  8:55       ` Julia Lawall
@ 2008-03-05 12:20         ` Ingo Molnar
  2008-03-05 12:30           ` Bart Van Assche
  2008-03-05 12:35           ` Julia Lawall
  0 siblings, 2 replies; 14+ messages in thread
From: Ingo Molnar @ 2008-03-05 12:20 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Christopher Li, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors, Harvey Harrison, Alexander Viro,
	linux-sparse, Josh Triplett


* Julia Lawall <julia@diku.dk> wrote:

> There are some legitimate uses of !x & y which are actually of the 
> form !x & !y, where x and y are function calls.  That is a not 
> particularly elegant way of getting both x and y to be evaluated and 
> then combining the results using "and".  If such code is considered 
> acceptable, then perhaps the sparse patch should be more complicated.

i tend to be of the opinion that the details in C source code should be 
visually obvious and should be heavily simplified down from what is 
'possible' language-wise - with most deviations and complications that 
depart from convention considered an error. I'd consider "!fn1() & 
!fn2()" a borderline coding style violation in any case - and it costs 
nothing to change it to "!fn1() && !fn2()".

	Ingo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05 12:20         ` Ingo Molnar
@ 2008-03-05 12:30           ` Bart Van Assche
  2008-03-05 12:36             ` Ingo Molnar
  2008-03-05 12:35           ` Julia Lawall
  1 sibling, 1 reply; 14+ messages in thread
From: Bart Van Assche @ 2008-03-05 12:30 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Julia Lawall, Christopher Li, yi.zhu, linux-wireless,
	ipw3945-devel, linux-kernel, kernel-janitors, Harvey Harrison,
	Alexander Viro, linux-sparse, Josh Triplett

On Wed, Mar 5, 2008 at 1:20 PM, Ingo Molnar <mingo@elte.hu> wrote:
>
>  * Julia Lawall <julia@diku.dk> wrote:
>
>  > There are some legitimate uses of !x & y which are actually of the
>  > form !x & !y, where x and y are function calls.  That is a not
>  > particularly elegant way of getting both x and y to be evaluated and
>  > then combining the results using "and".  If such code is considered
>  > acceptable, then perhaps the sparse patch should be more complicated.
>
>  i tend to be of the opinion that the details in C source code should be
>  visually obvious and should be heavily simplified down from what is
>  'possible' language-wise - with most deviations and complications that
>  depart from convention considered an error. I'd consider "!fn1() &
>  !fn2()" a borderline coding style violation in any case - and it costs
>  nothing to change it to "!fn1() && !fn2()".

If someone writes (!x & !y) instead of (!x && !y) because both x and y
have to be evaluated, this means that both x and y have side effects.
Please keep in mind that the C language does not specify whether x or
y has to be evaluated first, so if x and y have to be evaluated in
that order, an expression like (!x & !y) can be the cause of very
subtle bugs. I prefer readability above brevity.

Bart Van Assche.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05 12:20         ` Ingo Molnar
  2008-03-05 12:30           ` Bart Van Assche
@ 2008-03-05 12:35           ` Julia Lawall
  1 sibling, 0 replies; 14+ messages in thread
From: Julia Lawall @ 2008-03-05 12:35 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Christopher Li, yi.zhu, linux-wireless, ipw3945-devel,
	linux-kernel, kernel-janitors, Harvey Harrison, Alexander Viro,
	linux-sparse, Josh Triplett

On Wed, 5 Mar 2008, Ingo Molnar wrote:

>
> * Julia Lawall <julia@diku.dk> wrote:
>
> > There are some legitimate uses of !x & y which are actually of the
> > form !x & !y, where x and y are function calls.  That is a not
> > particularly elegant way of getting both x and y to be evaluated and
> > then combining the results using "and".  If such code is considered
> > acceptable, then perhaps the sparse patch should be more complicated.
>
> i tend to be of the opinion that the details in C source code should be
> visually obvious and should be heavily simplified down from what is
> 'possible' language-wise - with most deviations and complications that
> depart from convention considered an error. I'd consider "!fn1() &
> !fn2()" a borderline coding style violation in any case - and it costs
> nothing to change it to "!fn1() && !fn2()".

!fn1() && !fn2() does not have the same semantics as !fn1() & !fn2().  In
!fn1() & !fn2() both function calls are evaluated.  In !fn1() && !fn2(),
if !fn1() returns false then !fn2() is not evaluated.  I haven't studied
the particular instances of fn2(), though, to know whether it makes a
difference.

One could instead do something like:

x = fn1();
y = fn2();
if (!x && !y) ...

It would certainly be clearer, but more verbose.

julia


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and &
  2008-03-05 12:30           ` Bart Van Assche
@ 2008-03-05 12:36             ` Ingo Molnar
  0 siblings, 0 replies; 14+ messages in thread
From: Ingo Molnar @ 2008-03-05 12:36 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Julia Lawall, Christopher Li, yi.zhu, linux-wireless,
	ipw3945-devel, linux-kernel, kernel-janitors, Harvey Harrison,
	Alexander Viro, linux-sparse, Josh Triplett


* Bart Van Assche <bart.vanassche@gmail.com> wrote:

> If someone writes (!x & !y) instead of (!x && !y) because both x and y 
> have to be evaluated, this means that both x and y have side effects.
> Please keep in mind that the C language does not specify whether x or 
> y has to be evaluated first, so if x and y have to be evaluated in 
> that order, an expression like (!x & !y) can be the cause of very 
> subtle bugs. I prefer readability above brevity.

such expressions _must_ be written as:

  ret1 = x();
  ret2 = y();

  if (ret1 && ret2)
	...

any side-effects are totally un-obvious when they are in expressions and 
someone doing cleanups later on could easily change the '&' to '&&' and 
introduce a bug.

	Ingo

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2008-03-05 12:37 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-26 20:44 [PATCH 6/9] drivers/net/wireless/iwlwifi/iwl-4965.c: Correct use of ! and & Julia Lawall
2008-02-26 22:47 ` Tomas Winkler
2008-02-27  0:59   ` John W. Linville
2008-03-05  6:38 ` Ingo Molnar
2008-03-05  6:49   ` Christopher Li
2008-03-05  7:02     ` Ingo Molnar
2008-03-05  7:09       ` Harvey Harrison
2008-03-05  8:19         ` Ingo Molnar
2008-03-05 12:13           ` Derek M Jones
2008-03-05  8:55       ` Julia Lawall
2008-03-05 12:20         ` Ingo Molnar
2008-03-05 12:30           ` Bart Van Assche
2008-03-05 12:36             ` Ingo Molnar
2008-03-05 12:35           ` Julia Lawall

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).