Re: [PATCH] [media] cxd2841er: avoid misleading gcc warning

From: Abylay Ospan
Date: Mon Jul 25 2016 - 00:25:12 EST


Hello Arnd,

thanks for patch. it looks ok.
Acked-by: Abylay Ospan <aospan@xxxxxxxx>


2016-07-13 16:42 GMT-04:00 Arnd Bergmann <arnd@xxxxxxxx>:
> The addition of jump label support in dynamic_debug caused an unexpected
> warning in exactly one file in the kernel:
>
> drivers/media/dvb-frontends/cxd2841er.c: In function 'cxd2841er_tune_tc':
> include/linux/dynamic_debug.h:134:3: error: 'carrier_offset' may be used uninitialized in this function [-Werror=maybe-uninitialized]
> __dynamic_dev_dbg(&descriptor, dev, fmt, \
> ^~~~~~~~~~~~~~~~~
> drivers/media/dvb-frontends/cxd2841er.c:3177:11: note: 'carrier_offset' was declared here
> int ret, carrier_offset;
> ^~~~~~~~~~~~~~
>
> The problem seems to be that the compiler gets confused by the extra conditionals
> in static_branch_unlikely, to the point where it can no longer keep track of
> which branches have already been taken, and it doesn't realize that this variable
> is now always initialized when it gets used.
>
> I have done lots of randconfig kernel builds and could not find any other file
> with this behavior, so I assume it's a rare enough glitch that we don't need
> to change the jump label support but instead just work around the warning in
> the driver.
>
> To achieve that, I'm moving the check for the return value into the switch()
> statement, which is an obvious transformation, but is enough to un-confuse
> the compiler here. The resulting code is not as nice to read, but at
> least we retain the behavior of warning if it gets changed to actually
> access an uninitialized carrier offset value in the future.
>
> Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
> Fixes: (in linux-mm) "dynamic_debug: add jump label support"
> ---
> drivers/media/dvb-frontends/cxd2841er.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/dvb-frontends/cxd2841er.c b/drivers/media/dvb-frontends/cxd2841er.c
> index 721fb074da7c..0639ca281a2c 100644
> --- a/drivers/media/dvb-frontends/cxd2841er.c
> +++ b/drivers/media/dvb-frontends/cxd2841er.c
> @@ -3223,20 +3223,28 @@ static int cxd2841er_tune_tc(struct dvb_frontend *fe,
> ret = cxd2841er_get_carrier_offset_i(
> priv, p->bandwidth_hz,
> &carrier_offset);
> + if (ret)
> + return ret;
> break;
> case SYS_DVBT:
> ret = cxd2841er_get_carrier_offset_t(
> priv, p->bandwidth_hz,
> &carrier_offset);
> + if (ret)
> + return ret;
> break;
> case SYS_DVBT2:
> ret = cxd2841er_get_carrier_offset_t2(
> priv, p->bandwidth_hz,
> &carrier_offset);
> + if (ret)
> + return ret;
> break;
> case SYS_DVBC_ANNEX_A:
> ret = cxd2841er_get_carrier_offset_c(
> priv, &carrier_offset);
> + if (ret)
> + return ret;
> break;
> default:
> dev_dbg(&priv->i2c->dev,
> @@ -3244,8 +3252,6 @@ static int cxd2841er_tune_tc(struct dvb_frontend *fe,
> __func__, priv->system);
> return -EINVAL;
> }
> - if (ret)
> - return ret;
> dev_dbg(&priv->i2c->dev, "%s(): carrier offset %d\n",
> __func__, carrier_offset);
> p->frequency += carrier_offset;
> --
> 2.9.0
>



--
Abylay Ospan,
NetUP Inc.
http://www.netup.tv