linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* i2c/busses/i2c-highlander.c: using char variable in bit operation
@ 2010-02-01  9:51 d binderman
       [not found] ` <BLU108-W10538CE8A7EF6373FB36AE9C580-MsuGFMq8XAE@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: d binderman @ 2010-02-01  9:51 UTC (permalink / raw)
  To: khali-PUYAD+kWke1g9hUCZPvPmw; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA



Hello there,

I just ran the sourceforge tool cppcheck over the source code of the
new Linux kernel 2.6.33-rc6

It said

[./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation

The source code is

static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
                                  unsigned short flags, char read_write,
                                  u8 command, int size,
                                  union i2c_smbus_data *data)
{
        struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
        int read = read_write & I2C_SMBUS_READ;

In C, chars can be signed or unsigned, so the value written into
local variable read by sign extension is not certain.

Suggest new code

static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
                                  unsigned short flags, char read_write,
                                  u8 command, int size,
                                  union i2c_smbus_data *data)
{
        struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
        int read = ((unsigned char) read_write) & I2C_SMBUS_READ;


Regards

David Binderman

 		 	   		  
_________________________________________________________________
Tell us your greatest, weirdest and funniest Hotmail stories
http://clk.atdmt.com/UKM/go/195013117/direct/01/--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: i2c/busses/i2c-highlander.c: using char variable in bit operation
       [not found] ` <BLU108-W10538CE8A7EF6373FB36AE9C580-MsuGFMq8XAE@public.gmane.org>
@ 2010-02-01 10:07   ` Jean Delvare
       [not found]     ` <20100201110721.461fd142-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Jean Delvare @ 2010-02-01 10:07 UTC (permalink / raw)
  To: d binderman; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

On Mon, 1 Feb 2010 09:51:42 +0000, d binderman wrote:
> 
> 
> Hello there,
> 
> I just ran the sourceforge tool cppcheck over the source code of the
> new Linux kernel 2.6.33-rc6
> 
> It said
> 
> [./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation
> 
> The source code is
> 
> static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
>                                   unsigned short flags, char read_write,
>                                   u8 command, int size,
>                                   union i2c_smbus_data *data)
> {
>         struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
>         int read = read_write & I2C_SMBUS_READ;
> 
> In C, chars can be signed or unsigned, so the value written into
> local variable read by sign extension is not certain.
> 
> Suggest new code
> 
> static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
>                                   unsigned short flags, char read_write,
>                                   u8 command, int size,
>                                   union i2c_smbus_data *data)
> {
>         struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
>         int read = ((unsigned char) read_write) & I2C_SMBUS_READ;

read_write can only have value 0 or 1, so we don't care if chars are
signed or not. That being said, the code above looks odd, the value of
read_write can be used in the code directly without using an
intermediate variable:

	iowrite16((addr << 1) | read_write, dev->base + SMSMADR);

This would solve your warning issue and make the code more simple too.

-- 
Jean Delvare

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

* Re: i2c/busses/i2c-highlander.c: using char variable in bit operation
       [not found]     ` <20100201110721.461fd142-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
@ 2010-02-01 10:15       ` Wolfram Sang
       [not found]         ` <20100201101509.GB3288-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Wolfram Sang @ 2010-02-01 10:15 UTC (permalink / raw)
  To: Jean Delvare; +Cc: d binderman, linux-i2c-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 2034 bytes --]

On Mon, Feb 01, 2010 at 11:07:21AM +0100, Jean Delvare wrote:
> On Mon, 1 Feb 2010 09:51:42 +0000, d binderman wrote:
> > 
> > 
> > Hello there,
> > 
> > I just ran the sourceforge tool cppcheck over the source code of the
> > new Linux kernel 2.6.33-rc6
> > 
> > It said
> > 
> > [./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation
> > 
> > The source code is
> > 
> > static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
> >                                   unsigned short flags, char read_write,
> >                                   u8 command, int size,
> >                                   union i2c_smbus_data *data)
> > {
> >         struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
> >         int read = read_write & I2C_SMBUS_READ;
> > 
> > In C, chars can be signed or unsigned, so the value written into
> > local variable read by sign extension is not certain.
> > 
> > Suggest new code
> > 
> > static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
> >                                   unsigned short flags, char read_write,
> >                                   u8 command, int size,
> >                                   union i2c_smbus_data *data)
> > {
> >         struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
> >         int read = ((unsigned char) read_write) & I2C_SMBUS_READ;
> 
> read_write can only have value 0 or 1, so we don't care if chars are
> signed or not. That being said, the code above looks odd, the value of
> read_write can be used in the code directly without using an
> intermediate variable:
> 
> 	iowrite16((addr << 1) | read_write, dev->base + SMSMADR);
> 
> This would solve your warning issue and make the code more simple too.

Don't forget to convert the 'if (read)' below, too.

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

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

* [PATCH] i2c/highlander: remover superflous variable
       [not found]         ` <20100201101509.GB3288-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
@ 2010-02-02 12:17           ` Wolfram Sang
       [not found]             ` <1265113063-22894-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Wolfram Sang @ 2010-02-02 12:17 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
  Cc: Wolfram Sang, Paul Mundt, Jean Delvare, Ben Dooks

When cppcheck found this flaw

[./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation

it was noted that the 'read'-variable could just be removed as read_write can
only be 0 or 1 anyhow. So, we remove the flaw by simplifying the code.

Reported-by: d binderman <dcb314-PkbjNfxxIARBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
Cc: Paul Mundt <lethal-M7jkjyW5wf5g9hUCZPvPmw@public.gmane.org>
Cc: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
Cc: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
---

There was no patch following the original report, so I picked it up. Not
tested, due to no hardware.

Jean, I put you on CC as you commented on the original mail, although it is
more an embedded driver.

 drivers/i2c/busses/i2c-highlander.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c
index 87ecace..db290b9 100644
--- a/drivers/i2c/busses/i2c-highlander.c
+++ b/drivers/i2c/busses/i2c-highlander.c
@@ -281,7 +281,6 @@ static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
 				  union i2c_smbus_data *data)
 {
 	struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
-	int read = read_write & I2C_SMBUS_READ;
 	u16 tmp;
 
 	init_completion(&dev->cmd_complete);
@@ -336,11 +335,11 @@ static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
 	highlander_i2c_done(dev);
 
 	/* Set slave address */
-	iowrite16((addr << 1) | read, dev->base + SMSMADR);
+	iowrite16((addr << 1) | read_write, dev->base + SMSMADR);
 
 	highlander_i2c_command(dev, command, dev->buf_len);
 
-	if (read)
+	if (read_write)
 		return highlander_i2c_read(dev);
 	else
 		return highlander_i2c_write(dev);
-- 
1.6.5

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

* Re: [PATCH] i2c/highlander: remover superflous variable
       [not found]             ` <1265113063-22894-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
@ 2010-02-02 12:29               ` Jean Delvare
  2010-02-02 14:31               ` Paul Mundt
  1 sibling, 0 replies; 6+ messages in thread
From: Jean Delvare @ 2010-02-02 12:29 UTC (permalink / raw)
  To: Wolfram Sang; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Paul Mundt, Ben Dooks

On Tue,  2 Feb 2010 13:17:43 +0100, Wolfram Sang wrote:
> When cppcheck found this flaw
> 
> [./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation
> 
> it was noted that the 'read'-variable could just be removed as read_write can
> only be 0 or 1 anyhow. So, we remove the flaw by simplifying the code.
> 
> Reported-by: d binderman <dcb314-PkbjNfxxIARBDgjK7y7TUQ@public.gmane.org>
> Signed-off-by: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
> Cc: Paul Mundt <lethal-M7jkjyW5wf5g9hUCZPvPmw@public.gmane.org>
> Cc: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
> Cc: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
> ---
> 
> There was no patch following the original report, so I picked it up. Not
> tested, due to no hardware.
> 
> Jean, I put you on CC as you commented on the original mail, although it is
> more an embedded driver.
> 
>  drivers/i2c/busses/i2c-highlander.c |    5 ++---
>  1 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c
> index 87ecace..db290b9 100644
> --- a/drivers/i2c/busses/i2c-highlander.c
> +++ b/drivers/i2c/busses/i2c-highlander.c
> @@ -281,7 +281,6 @@ static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
>  				  union i2c_smbus_data *data)
>  {
>  	struct highlander_i2c_dev *dev = i2c_get_adapdata(adap);
> -	int read = read_write & I2C_SMBUS_READ;
>  	u16 tmp;
>  
>  	init_completion(&dev->cmd_complete);
> @@ -336,11 +335,11 @@ static int highlander_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
>  	highlander_i2c_done(dev);
>  
>  	/* Set slave address */
> -	iowrite16((addr << 1) | read, dev->base + SMSMADR);
> +	iowrite16((addr << 1) | read_write, dev->base + SMSMADR);
>  
>  	highlander_i2c_command(dev, command, dev->buf_len);
>  
> -	if (read)
> +	if (read_write)
>  		return highlander_i2c_read(dev);
>  	else
>  		return highlander_i2c_write(dev);

Acked-by: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>

Thanks Wolfram.

-- 
Jean Delvare

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

* Re: [PATCH] i2c/highlander: remover superflous variable
       [not found]             ` <1265113063-22894-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  2010-02-02 12:29               ` Jean Delvare
@ 2010-02-02 14:31               ` Paul Mundt
  1 sibling, 0 replies; 6+ messages in thread
From: Paul Mundt @ 2010-02-02 14:31 UTC (permalink / raw)
  To: Wolfram Sang; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Jean Delvare, Ben Dooks

On Tue, Feb 02, 2010 at 01:17:43PM +0100, Wolfram Sang wrote:
> When cppcheck found this flaw
> 
> [./i2c/busses/i2c-highlander.c:284]: (style) Warning - using char variable in bit operation
> 
> it was noted that the 'read'-variable could just be removed as read_write can
> only be 0 or 1 anyhow. So, we remove the flaw by simplifying the code.
> 
> Reported-by: d binderman <dcb314-PkbjNfxxIARBDgjK7y7TUQ@public.gmane.org>
> Signed-off-by: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
> Cc: Paul Mundt <lethal-M7jkjyW5wf5g9hUCZPvPmw@public.gmane.org>
> Cc: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
> Cc: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>

Fine with me.

Acked-by: Paul Mundt <lethal-M7jkjyW5wf5g9hUCZPvPmw@public.gmane.org>

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

end of thread, other threads:[~2010-02-02 14:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-01  9:51 i2c/busses/i2c-highlander.c: using char variable in bit operation d binderman
     [not found] ` <BLU108-W10538CE8A7EF6373FB36AE9C580-MsuGFMq8XAE@public.gmane.org>
2010-02-01 10:07   ` Jean Delvare
     [not found]     ` <20100201110721.461fd142-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2010-02-01 10:15       ` Wolfram Sang
     [not found]         ` <20100201101509.GB3288-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2010-02-02 12:17           ` [PATCH] i2c/highlander: remover superflous variable Wolfram Sang
     [not found]             ` <1265113063-22894-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2010-02-02 12:29               ` Jean Delvare
2010-02-02 14:31               ` Paul Mundt

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).