On Fri, Sep 14, 2018 at 10:47 PM Nathan Chancellor <natechancellor@xxxxxxxxx> wrote: > > Clang warns that 'interleaving' is assigned to itself in this function. > > drivers/media/dvb-frontends/dib7000p.c:1874:15: warning: explicitly > assigning value of variable of type 'int' to itself [-Wself-assign] > interleaving = interleaving; > ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~ > 1 warning generated. > > It's correct. Just removing the self-assignment would sufficiently hide > the warning but all of this code is dead because 'tmp' is zero due to > being multiplied by zero. This doesn't appear to be an issue with > dib8000, which this code was copied from in commit 041ad449683b > ("[media] dib7000p: Add DVBv5 stats support"). > > Reported-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > Signed-off-by: Nathan Chancellor <natechancellor@xxxxxxxxx> > --- > drivers/media/dvb-frontends/dib7000p.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/drivers/media/dvb-frontends/dib7000p.c b/drivers/media/dvb-frontends/dib7000p.c > index 58387860b62d..25843658fc68 100644 > --- a/drivers/media/dvb-frontends/dib7000p.c > +++ b/drivers/media/dvb-frontends/dib7000p.c > @@ -1800,9 +1800,8 @@ static u32 dib7000p_get_time_us(struct dvb_frontend *demod) Something looks wrong here (with this function). The patch is no functional change, since as you point out `interleaving` is initialized to 0, then never updated before read, but I think there's an underlying bug here that should be fixed differently. Thanks for the patch though, as it does raise the question. dib7000p_get_time_us has this comment above it: 1798 /* FIXME: may require changes - this one was borrowed from dib8000 */ Wondering if it has the same bug, it seems it does not: drivers/media/dvb-frontends/dib8000.c#dib8000_get_time_us():3986 dib8000_get_time_us() seems to loop over multiple layers, and then assigns interleaving to the final layers interleaving (that looks like loop invariant code to me). Mauro, should dib7000p_get_time_us() use c->layer[???].interleaving? I don't see a single reference to `layer` in drivers/media/dvb-frontends/dib7000p.c. > { > struct dtv_frontend_properties *c = &demod->dtv_property_cache; > u64 time_us, tmp64; > - u32 tmp, denom; > - int guard, rate_num, rate_denum = 1, bits_per_symbol; > - int interleaving = 0, fft_div; > + u32 denom; > + int guard, rate_num, rate_denum = 1, bits_per_symbol, fft_div; > > switch (c->guard_interval) { > case GUARD_INTERVAL_1_4: > @@ -1871,8 +1870,6 @@ static u32 dib7000p_get_time_us(struct dvb_frontend *demod) > break; > } > > - interleaving = interleaving; > - > denom = bits_per_symbol * rate_num * fft_div * 384; > > /* If calculus gets wrong, wait for 1s for the next stats */ > @@ -1887,9 +1884,6 @@ static u32 dib7000p_get_time_us(struct dvb_frontend *demod) > time_us += denom / 2; > do_div(time_us, denom); > > - tmp = 1008 * 96 * interleaving; > - time_us += tmp + tmp / guard; > - > return time_us; > } > > -- > 2.18.0 > -- Thanks, ~Nick Desaulniers