diff mbox series

bcache: avoid clang -Wunintialized warning

Message ID 20190322143507.1256436-1-arnd@arndb.de
State Accepted
Commit 78d4eb8ad9e1d413449d1b7a060f50b6efa81ebd
Headers show
Series bcache: avoid clang -Wunintialized warning | expand

Commit Message

Arnd Bergmann March 22, 2019, 2:35 p.m. UTC
clang has identified a code path in which it thinks a
variable may be unused:

drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false
      [-Werror,-Wsometimes-uninitialized]
                        fifo_pop(&ca->free_inc, bucket);
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'
 #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))
                                ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'
        if (_r) {                                                       \
            ^~
drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here
                        allocator_wait(ca, bch_allocator_push(ca, bucket));
                                                                  ^~~~~~
drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'
                if (cond)                                               \
                    ^~~~
drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true
                        fifo_pop(&ca->free_inc, bucket);
                        ^
drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'
 #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))
                                ^
drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'
        if (_r) {                                                       \
        ^
drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning
                        long bucket;
                                   ^

This cannot happen in practice because we only enter the loop
if there is at least one element in the list.

Slightly rearranging the code makes this clearer to both the
reader and the compiler, which avoids the warning.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 drivers/md/bcache/alloc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

-- 
2.20.0

Comments

Nathan Chancellor March 22, 2019, 4:03 p.m. UTC | #1
On Fri, Mar 22, 2019 at 03:35:00PM +0100, Arnd Bergmann wrote:
> clang has identified a code path in which it thinks a

> variable may be unused:

> 

> drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false

>       [-Werror,-Wsometimes-uninitialized]

>                         fifo_pop(&ca->free_inc, bucket);

>                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>                                 ^~~~~~~~~~~~~~~~~~~~~~~~~

> drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'

>         if (_r) {                                                       \

>             ^~

> drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here

>                         allocator_wait(ca, bch_allocator_push(ca, bucket));

>                                                                   ^~~~~~

> drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'

>                 if (cond)                                               \

>                     ^~~~

> drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true

>                         fifo_pop(&ca->free_inc, bucket);

>                         ^

> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>                                 ^

> drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'

>         if (_r) {                                                       \

>         ^

> drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning

>                         long bucket;

>                                    ^

> 

> This cannot happen in practice because we only enter the loop

> if there is at least one element in the list.

> 

> Slightly rearranging the code makes this clearer to both the

> reader and the compiler, which avoids the warning.

> 

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


Yes, I like this much better than my patch, thanks!

Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>


> ---

>  drivers/md/bcache/alloc.c | 5 +++--

>  1 file changed, 3 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c

> index 5002838ea476..f8986effcb50 100644

> --- a/drivers/md/bcache/alloc.c

> +++ b/drivers/md/bcache/alloc.c

> @@ -327,10 +327,11 @@ static int bch_allocator_thread(void *arg)

>  		 * possibly issue discards to them, then we add the bucket to

>  		 * the free list:

>  		 */

> -		while (!fifo_empty(&ca->free_inc)) {

> +		while (1) {

>  			long bucket;

>  

> -			fifo_pop(&ca->free_inc, bucket);

> +			if (!fifo_pop(&ca->free_inc, bucket))

> +				break;

>  

>  			if (ca->discard) {

>  				mutex_unlock(&ca->set->bucket_lock);

> -- 

> 2.20.0

>
Nathan Chancellor April 25, 2019, 6:08 p.m. UTC | #2
On Fri, Mar 22, 2019 at 03:35:00PM +0100, Arnd Bergmann wrote:
> clang has identified a code path in which it thinks a

> variable may be unused:

> 

> drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false

>       [-Werror,-Wsometimes-uninitialized]

>                         fifo_pop(&ca->free_inc, bucket);

>                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>                                 ^~~~~~~~~~~~~~~~~~~~~~~~~

> drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'

>         if (_r) {                                                       \

>             ^~

> drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here

>                         allocator_wait(ca, bch_allocator_push(ca, bucket));

>                                                                   ^~~~~~

> drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'

>                 if (cond)                                               \

>                     ^~~~

> drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true

>                         fifo_pop(&ca->free_inc, bucket);

>                         ^

> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>                                 ^

> drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'

>         if (_r) {                                                       \

>         ^

> drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning

>                         long bucket;

>                                    ^

> 

> This cannot happen in practice because we only enter the loop

> if there is at least one element in the list.

> 

> Slightly rearranging the code makes this clearer to both the

> reader and the compiler, which avoids the warning.

> 

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  drivers/md/bcache/alloc.c | 5 +++--

>  1 file changed, 3 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c

> index 5002838ea476..f8986effcb50 100644

> --- a/drivers/md/bcache/alloc.c

> +++ b/drivers/md/bcache/alloc.c

> @@ -327,10 +327,11 @@ static int bch_allocator_thread(void *arg)

>  		 * possibly issue discards to them, then we add the bucket to

>  		 * the free list:

>  		 */

> -		while (!fifo_empty(&ca->free_inc)) {

> +		while (1) {

>  			long bucket;

>  

> -			fifo_pop(&ca->free_inc, bucket);

> +			if (!fifo_pop(&ca->free_inc, bucket))

> +				break;

>  

>  			if (ca->discard) {

>  				mutex_unlock(&ca->set->bucket_lock);

> -- 

> 2.20.0

> 


Hi all,

Could someone please review/pick this up? This is one of two remaining
-Wsometimes-uninitialized warnings among arm, arm64, and x86_64
all{yes,mod}config and I'd like to get it turned on as soon as possible
to catch more bugs.

Thanks,
Nathan
Coly Li April 26, 2019, 2:43 a.m. UTC | #3
On 2019/4/26 2:08 上午, Nathan Chancellor wrote:
> On Fri, Mar 22, 2019 at 03:35:00PM +0100, Arnd Bergmann wrote:

>> clang has identified a code path in which it thinks a

>> variable may be unused:

>>

>> drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false

>>       [-Werror,-Wsometimes-uninitialized]

>>                         fifo_pop(&ca->free_inc, bucket);

>>                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>>                                 ^~~~~~~~~~~~~~~~~~~~~~~~~

>> drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'

>>         if (_r) {                                                       \

>>             ^~

>> drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here

>>                         allocator_wait(ca, bch_allocator_push(ca, bucket));

>>                                                                   ^~~~~~

>> drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'

>>                 if (cond)                                               \

>>                     ^~~~

>> drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true

>>                         fifo_pop(&ca->free_inc, bucket);

>>                         ^

>> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>>                                 ^

>> drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'

>>         if (_r) {                                                       \

>>         ^

>> drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning

>>                         long bucket;

>>                                    ^

>>

>> This cannot happen in practice because we only enter the loop

>> if there is at least one element in the list.

>>

>> Slightly rearranging the code makes this clearer to both the

>> reader and the compiler, which avoids the warning.

>>

>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

>> ---

>>  drivers/md/bcache/alloc.c | 5 +++--

>>  1 file changed, 3 insertions(+), 2 deletions(-)

>>

>> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c

>> index 5002838ea476..f8986effcb50 100644

>> --- a/drivers/md/bcache/alloc.c

>> +++ b/drivers/md/bcache/alloc.c

>> @@ -327,10 +327,11 @@ static int bch_allocator_thread(void *arg)

>>  		 * possibly issue discards to them, then we add the bucket to

>>  		 * the free list:

>>  		 */

>> -		while (!fifo_empty(&ca->free_inc)) {

>> +		while (1) {

>>  			long bucket;

>>  

>> -			fifo_pop(&ca->free_inc, bucket);

>> +			if (!fifo_pop(&ca->free_inc, bucket))

>> +				break;

>>  

>>  			if (ca->discard) {

>>  				mutex_unlock(&ca->set->bucket_lock);

>> -- 

>> 2.20.0

>>

> 

> Hi all,

> 

> Could someone please review/pick this up? This is one of two remaining

> -Wsometimes-uninitialized warnings among arm, arm64, and x86_64

> all{yes,mod}config and I'd like to get it turned on as soon as possible

> to catch more bugs.


Hi Nathan,

It is in Jens' block tree for-next branch already, for Linux v5.2 merge
window.

Thanks.

-- 

Coly Li
Nathan Chancellor April 26, 2019, 1:01 p.m. UTC | #4
On Fri, Apr 26, 2019 at 10:43:01AM +0800, Coly Li wrote:
> On 2019/4/26 2:08 上午, Nathan Chancellor wrote:

> > On Fri, Mar 22, 2019 at 03:35:00PM +0100, Arnd Bergmann wrote:

> >> clang has identified a code path in which it thinks a

> >> variable may be unused:

> >>

> >> drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false

> >>       [-Werror,-Wsometimes-uninitialized]

> >>                         fifo_pop(&ca->free_inc, bucket);

> >>                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

> >> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

> >>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

> >>                                 ^~~~~~~~~~~~~~~~~~~~~~~~~

> >> drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'

> >>         if (_r) {                                                       \

> >>             ^~

> >> drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here

> >>                         allocator_wait(ca, bch_allocator_push(ca, bucket));

> >>                                                                   ^~~~~~

> >> drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'

> >>                 if (cond)                                               \

> >>                     ^~~~

> >> drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true

> >>                         fifo_pop(&ca->free_inc, bucket);

> >>                         ^

> >> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

> >>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

> >>                                 ^

> >> drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'

> >>         if (_r) {                                                       \

> >>         ^

> >> drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning

> >>                         long bucket;

> >>                                    ^

> >>

> >> This cannot happen in practice because we only enter the loop

> >> if there is at least one element in the list.

> >>

> >> Slightly rearranging the code makes this clearer to both the

> >> reader and the compiler, which avoids the warning.

> >>

> >> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> >> ---

> >>  drivers/md/bcache/alloc.c | 5 +++--

> >>  1 file changed, 3 insertions(+), 2 deletions(-)

> >>

> >> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c

> >> index 5002838ea476..f8986effcb50 100644

> >> --- a/drivers/md/bcache/alloc.c

> >> +++ b/drivers/md/bcache/alloc.c

> >> @@ -327,10 +327,11 @@ static int bch_allocator_thread(void *arg)

> >>  		 * possibly issue discards to them, then we add the bucket to

> >>  		 * the free list:

> >>  		 */

> >> -		while (!fifo_empty(&ca->free_inc)) {

> >> +		while (1) {

> >>  			long bucket;

> >>  

> >> -			fifo_pop(&ca->free_inc, bucket);

> >> +			if (!fifo_pop(&ca->free_inc, bucket))

> >> +				break;

> >>  

> >>  			if (ca->discard) {

> >>  				mutex_unlock(&ca->set->bucket_lock);

> >> -- 

> >> 2.20.0

> >>

> > 

> > Hi all,

> > 

> > Could someone please review/pick this up? This is one of two remaining

> > -Wsometimes-uninitialized warnings among arm, arm64, and x86_64

> > all{yes,mod}config and I'd like to get it turned on as soon as possible

> > to catch more bugs.

> 

> Hi Nathan,

> 

> It is in Jens' block tree for-next branch already, for Linux v5.2 merge

> window.

> 

> Thanks.

> 

> -- 

> 

> Coly Li


Hi Coly,

Thank you for the reply and heads up, it hadn't hit -next when I sent
that message and I didn't check Jens' tree.

I appreciate you picking it up!

Nathan
Coly Li April 26, 2019, 2:27 p.m. UTC | #5
On 2019/4/26 9:01 下午, Nathan Chancellor wrote:
> On Fri, Apr 26, 2019 at 10:43:01AM +0800, Coly Li wrote:

>> On 2019/4/26 2:08 上午, Nathan Chancellor wrote:

>>> On Fri, Mar 22, 2019 at 03:35:00PM +0100, Arnd Bergmann wrote:

>>>> clang has identified a code path in which it thinks a

>>>> variable may be unused:

>>>>

>>>> drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false

>>>>       [-Werror,-Wsometimes-uninitialized]

>>>>                         fifo_pop(&ca->free_inc, bucket);

>>>>                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>>>> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>>>>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>>>>                                 ^~~~~~~~~~~~~~~~~~~~~~~~~

>>>> drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'

>>>>         if (_r) {                                                       \

>>>>             ^~

>>>> drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here

>>>>                         allocator_wait(ca, bch_allocator_push(ca, bucket));

>>>>                                                                   ^~~~~~

>>>> drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'

>>>>                 if (cond)                                               \

>>>>                     ^~~~

>>>> drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true

>>>>                         fifo_pop(&ca->free_inc, bucket);

>>>>                         ^

>>>> drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'

>>>>  #define fifo_pop(fifo, i)       fifo_pop_front(fifo, (i))

>>>>                                 ^

>>>> drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'

>>>>         if (_r) {                                                       \

>>>>         ^

>>>> drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning

>>>>                         long bucket;

>>>>                                    ^

>>>>

>>>> This cannot happen in practice because we only enter the loop

>>>> if there is at least one element in the list.

>>>>

>>>> Slightly rearranging the code makes this clearer to both the

>>>> reader and the compiler, which avoids the warning.

>>>>

>>>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

>>>> ---

>>>>  drivers/md/bcache/alloc.c | 5 +++--

>>>>  1 file changed, 3 insertions(+), 2 deletions(-)

>>>>

>>>> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c

>>>> index 5002838ea476..f8986effcb50 100644

>>>> --- a/drivers/md/bcache/alloc.c

>>>> +++ b/drivers/md/bcache/alloc.c

>>>> @@ -327,10 +327,11 @@ static int bch_allocator_thread(void *arg)

>>>>  		 * possibly issue discards to them, then we add the bucket to

>>>>  		 * the free list:

>>>>  		 */

>>>> -		while (!fifo_empty(&ca->free_inc)) {

>>>> +		while (1) {

>>>>  			long bucket;

>>>>  

>>>> -			fifo_pop(&ca->free_inc, bucket);

>>>> +			if (!fifo_pop(&ca->free_inc, bucket))

>>>> +				break;

>>>>  

>>>>  			if (ca->discard) {

>>>>  				mutex_unlock(&ca->set->bucket_lock);

>>>> -- 

>>>> 2.20.0

>>>>

>>>

>>> Hi all,

>>>

>>> Could someone please review/pick this up? This is one of two remaining

>>> -Wsometimes-uninitialized warnings among arm, arm64, and x86_64

>>> all{yes,mod}config and I'd like to get it turned on as soon as possible

>>> to catch more bugs.

>>

>> Hi Nathan,

>>

>> It is in Jens' block tree for-next branch already, for Linux v5.2 merge

>> window.

>>

>> Thanks.

>>

>> -- 

>>

>> Coly Li

> 

> Hi Coly,

> 

> Thank you for the reply and heads up, it hadn't hit -next when I sent

> that message and I didn't check Jens' tree.

> 

> I appreciate you picking it up!


Hi Nathan,

You are welcome, and thanks for the contribution to make bcache better :-)

-- 

Coly Li
diff mbox series

Patch

diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c
index 5002838ea476..f8986effcb50 100644
--- a/drivers/md/bcache/alloc.c
+++ b/drivers/md/bcache/alloc.c
@@ -327,10 +327,11 @@  static int bch_allocator_thread(void *arg)
 		 * possibly issue discards to them, then we add the bucket to
 		 * the free list:
 		 */
-		while (!fifo_empty(&ca->free_inc)) {
+		while (1) {
 			long bucket;
 
-			fifo_pop(&ca->free_inc, bucket);
+			if (!fifo_pop(&ca->free_inc, bucket))
+				break;
 
 			if (ca->discard) {
 				mutex_unlock(&ca->set->bucket_lock);