Message ID | 20250409095006.1422620-1-anshuman.khandual@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | selftests/mm: Fix compiler -Wmaybe-uninitialized warning | expand |
On 09.04.25 11:50, Anshuman Khandual wrote: > Following build warning comes up for cow test as 'transferred' variable has > not been initialized. Fix the warning via zero init for the variable. > > CC cow > cow.c: In function ‘do_test_vmsplice_in_parent’: > cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] > 365 | cur = read(fds[0], new + total, transferred - total); > | ~~~~~~~~~~~~^~~~~~~ > cow.c:296:29: note: ‘transferred’ was declared here > 296 | ssize_t cur, total, transferred; > | ^~~~~~~~~~~ > CC compaction_test > CC gup_longterm > > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Shuah Khan <shuah@kernel.org> > Cc: linux-mm@kvack.org > Cc: linux-kselftest@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> > --- > tools/testing/selftests/mm/cow.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c > index f0cb14ea8608..b6cfe0a4b7df 100644 > --- a/tools/testing/selftests/mm/cow.c > +++ b/tools/testing/selftests/mm/cow.c > @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, > .iov_base = mem, > .iov_len = size, > }; > - ssize_t cur, total, transferred; > + ssize_t cur, total, transferred = 0; > struct comm_pipes comm_pipes; > char *old, *new; > int ret, fds[2]; if (before_fork) { transferred = vmsplice(fds[1], &iov, 1, 0); ... if (!before_fork) { transferred = vmsplice(fds[1], &iov, 1, 0); ... for (total = 0; total < transferred; total += cur) { ... And I don't see any jump label that could jump to code that would ve using transferred. What am I missing?
On 4/9/25 15:27, David Hildenbrand wrote: > On 09.04.25 11:50, Anshuman Khandual wrote: >> Following build warning comes up for cow test as 'transferred' variable has >> not been initialized. Fix the warning via zero init for the variable. >> >> CC cow >> cow.c: In function ‘do_test_vmsplice_in_parent’: >> cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] >> 365 | cur = read(fds[0], new + total, transferred - total); >> | ~~~~~~~~~~~~^~~~~~~ >> cow.c:296:29: note: ‘transferred’ was declared here >> 296 | ssize_t cur, total, transferred; >> | ^~~~~~~~~~~ >> CC compaction_test >> CC gup_longterm >> >> Cc: Andrew Morton <akpm@linux-foundation.org> >> Cc: Shuah Khan <shuah@kernel.org> >> Cc: linux-mm@kvack.org >> Cc: linux-kselftest@vger.kernel.org >> Cc: linux-kernel@vger.kernel.org >> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >> --- >> tools/testing/selftests/mm/cow.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c >> index f0cb14ea8608..b6cfe0a4b7df 100644 >> --- a/tools/testing/selftests/mm/cow.c >> +++ b/tools/testing/selftests/mm/cow.c >> @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, >> .iov_base = mem, >> .iov_len = size, >> }; >> - ssize_t cur, total, transferred; >> + ssize_t cur, total, transferred = 0; >> struct comm_pipes comm_pipes; >> char *old, *new; >> int ret, fds[2]; > > > if (before_fork) { > transferred = vmsplice(fds[1], &iov, 1, 0); > ... > > if (!before_fork) { > transferred = vmsplice(fds[1], &iov, 1, 0); > ... > > for (total = 0; total < transferred; total += cur) { > ... > > > And I don't see any jump label that could jump to code that would ve using transferred. > > What am I missing? Probably because both those conditional statements are not mutually exclusive above with an if-else construct. Hence compiler flags it rather as a false positive ? Initializing with 0 just works around that false positive.
On 09.04.25 12:09, Anshuman Khandual wrote: > > > On 4/9/25 15:27, David Hildenbrand wrote: >> On 09.04.25 11:50, Anshuman Khandual wrote: >>> Following build warning comes up for cow test as 'transferred' variable has >>> not been initialized. Fix the warning via zero init for the variable. >>> >>> CC cow >>> cow.c: In function ‘do_test_vmsplice_in_parent’: >>> cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] >>> 365 | cur = read(fds[0], new + total, transferred - total); >>> | ~~~~~~~~~~~~^~~~~~~ >>> cow.c:296:29: note: ‘transferred’ was declared here >>> 296 | ssize_t cur, total, transferred; >>> | ^~~~~~~~~~~ >>> CC compaction_test >>> CC gup_longterm >>> >>> Cc: Andrew Morton <akpm@linux-foundation.org> >>> Cc: Shuah Khan <shuah@kernel.org> >>> Cc: linux-mm@kvack.org >>> Cc: linux-kselftest@vger.kernel.org >>> Cc: linux-kernel@vger.kernel.org >>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>> --- >>> tools/testing/selftests/mm/cow.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c >>> index f0cb14ea8608..b6cfe0a4b7df 100644 >>> --- a/tools/testing/selftests/mm/cow.c >>> +++ b/tools/testing/selftests/mm/cow.c >>> @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, >>> .iov_base = mem, >>> .iov_len = size, >>> }; >>> - ssize_t cur, total, transferred; >>> + ssize_t cur, total, transferred = 0; >>> struct comm_pipes comm_pipes; >>> char *old, *new; >>> int ret, fds[2]; >> >> >> if (before_fork) { >> transferred = vmsplice(fds[1], &iov, 1, 0); >> ... >> >> if (!before_fork) { >> transferred = vmsplice(fds[1], &iov, 1, 0); >> ... >> >> for (total = 0; total < transferred; total += cur) { >> ... >> >> >> And I don't see any jump label that could jump to code that would ve using transferred. >> >> What am I missing? > > Probably because both those conditional statements are not mutually > exclusive above with an if-else construct. Hence compiler flags it > rather as a false positive ? Initializing with 0 just works around > that false positive. This is something the compiler should clearly be able to verify. before_fork is never changed in that function. We should not work around wrong compilers. Which compiler are you using such that you run into this issue?
On 4/9/25 15:51, David Hildenbrand wrote: > On 09.04.25 12:09, Anshuman Khandual wrote: >> >> >> On 4/9/25 15:27, David Hildenbrand wrote: >>> On 09.04.25 11:50, Anshuman Khandual wrote: >>>> Following build warning comes up for cow test as 'transferred' variable has >>>> not been initialized. Fix the warning via zero init for the variable. >>>> >>>> CC cow >>>> cow.c: In function ‘do_test_vmsplice_in_parent’: >>>> cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] >>>> 365 | cur = read(fds[0], new + total, transferred - total); >>>> | ~~~~~~~~~~~~^~~~~~~ >>>> cow.c:296:29: note: ‘transferred’ was declared here >>>> 296 | ssize_t cur, total, transferred; >>>> | ^~~~~~~~~~~ >>>> CC compaction_test >>>> CC gup_longterm >>>> >>>> Cc: Andrew Morton <akpm@linux-foundation.org> >>>> Cc: Shuah Khan <shuah@kernel.org> >>>> Cc: linux-mm@kvack.org >>>> Cc: linux-kselftest@vger.kernel.org >>>> Cc: linux-kernel@vger.kernel.org >>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>>> --- >>>> tools/testing/selftests/mm/cow.c | 2 +- >>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>> >>>> diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c >>>> index f0cb14ea8608..b6cfe0a4b7df 100644 >>>> --- a/tools/testing/selftests/mm/cow.c >>>> +++ b/tools/testing/selftests/mm/cow.c >>>> @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, >>>> .iov_base = mem, >>>> .iov_len = size, >>>> }; >>>> - ssize_t cur, total, transferred; >>>> + ssize_t cur, total, transferred = 0; >>>> struct comm_pipes comm_pipes; >>>> char *old, *new; >>>> int ret, fds[2]; >>> >>> >>> if (before_fork) { >>> transferred = vmsplice(fds[1], &iov, 1, 0); >>> ... >>> >>> if (!before_fork) { >>> transferred = vmsplice(fds[1], &iov, 1, 0); >>> ... >>> >>> for (total = 0; total < transferred; total += cur) { >>> ... >>> >>> >>> And I don't see any jump label that could jump to code that would ve using transferred. >>> >>> What am I missing? >> >> Probably because both those conditional statements are not mutually >> exclusive above with an if-else construct. Hence compiler flags it >> rather as a false positive ? Initializing with 0 just works around >> that false positive. > > This is something the compiler should clearly be able to verify. before_fork is never changed in that function. > > We should not work around wrong compilers. > > Which compiler are you using such that you run into this issue? gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
On 09.04.25 12:25, Anshuman Khandual wrote: > > > On 4/9/25 15:51, David Hildenbrand wrote: >> On 09.04.25 12:09, Anshuman Khandual wrote: >>> >>> >>> On 4/9/25 15:27, David Hildenbrand wrote: >>>> On 09.04.25 11:50, Anshuman Khandual wrote: >>>>> Following build warning comes up for cow test as 'transferred' variable has >>>>> not been initialized. Fix the warning via zero init for the variable. >>>>> >>>>> CC cow >>>>> cow.c: In function ‘do_test_vmsplice_in_parent’: >>>>> cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] >>>>> 365 | cur = read(fds[0], new + total, transferred - total); >>>>> | ~~~~~~~~~~~~^~~~~~~ >>>>> cow.c:296:29: note: ‘transferred’ was declared here >>>>> 296 | ssize_t cur, total, transferred; >>>>> | ^~~~~~~~~~~ >>>>> CC compaction_test >>>>> CC gup_longterm >>>>> >>>>> Cc: Andrew Morton <akpm@linux-foundation.org> >>>>> Cc: Shuah Khan <shuah@kernel.org> >>>>> Cc: linux-mm@kvack.org >>>>> Cc: linux-kselftest@vger.kernel.org >>>>> Cc: linux-kernel@vger.kernel.org >>>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>>>> --- >>>>> tools/testing/selftests/mm/cow.c | 2 +- >>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>> >>>>> diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c >>>>> index f0cb14ea8608..b6cfe0a4b7df 100644 >>>>> --- a/tools/testing/selftests/mm/cow.c >>>>> +++ b/tools/testing/selftests/mm/cow.c >>>>> @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, >>>>> .iov_base = mem, >>>>> .iov_len = size, >>>>> }; >>>>> - ssize_t cur, total, transferred; >>>>> + ssize_t cur, total, transferred = 0; >>>>> struct comm_pipes comm_pipes; >>>>> char *old, *new; >>>>> int ret, fds[2]; >>>> >>>> >>>> if (before_fork) { >>>> transferred = vmsplice(fds[1], &iov, 1, 0); >>>> ... >>>> >>>> if (!before_fork) { >>>> transferred = vmsplice(fds[1], &iov, 1, 0); >>>> ... >>>> >>>> for (total = 0; total < transferred; total += cur) { >>>> ... >>>> >>>> >>>> And I don't see any jump label that could jump to code that would ve using transferred. >>>> >>>> What am I missing? >>> >>> Probably because both those conditional statements are not mutually >>> exclusive above with an if-else construct. Hence compiler flags it >>> rather as a false positive ? Initializing with 0 just works around >>> that false positive. >> >> This is something the compiler should clearly be able to verify. before_fork is never changed in that function. >> >> We should not work around wrong compilers. >> >> Which compiler are you using such that you run into this issue? > > gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 > gcc (GCC) 14.2.1 20250110 (Red Hat 14.2.1-7) Seems to be fine, just like all other compilers people used with this over the years. Maybe something about that compiler is shaky that was fixed in the meantime?
On 09.04.25 12:31, David Hildenbrand wrote: > On 09.04.25 12:25, Anshuman Khandual wrote: >> >> >> On 4/9/25 15:51, David Hildenbrand wrote: >>> On 09.04.25 12:09, Anshuman Khandual wrote: >>>> >>>> >>>> On 4/9/25 15:27, David Hildenbrand wrote: >>>>> On 09.04.25 11:50, Anshuman Khandual wrote: >>>>>> Following build warning comes up for cow test as 'transferred' variable has >>>>>> not been initialized. Fix the warning via zero init for the variable. >>>>>> >>>>>> CC cow >>>>>> cow.c: In function ‘do_test_vmsplice_in_parent’: >>>>>> cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] >>>>>> 365 | cur = read(fds[0], new + total, transferred - total); >>>>>> | ~~~~~~~~~~~~^~~~~~~ >>>>>> cow.c:296:29: note: ‘transferred’ was declared here >>>>>> 296 | ssize_t cur, total, transferred; >>>>>> | ^~~~~~~~~~~ >>>>>> CC compaction_test >>>>>> CC gup_longterm >>>>>> >>>>>> Cc: Andrew Morton <akpm@linux-foundation.org> >>>>>> Cc: Shuah Khan <shuah@kernel.org> >>>>>> Cc: linux-mm@kvack.org >>>>>> Cc: linux-kselftest@vger.kernel.org >>>>>> Cc: linux-kernel@vger.kernel.org >>>>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>>>>> --- >>>>>> tools/testing/selftests/mm/cow.c | 2 +- >>>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>>> >>>>>> diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c >>>>>> index f0cb14ea8608..b6cfe0a4b7df 100644 >>>>>> --- a/tools/testing/selftests/mm/cow.c >>>>>> +++ b/tools/testing/selftests/mm/cow.c >>>>>> @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, >>>>>> .iov_base = mem, >>>>>> .iov_len = size, >>>>>> }; >>>>>> - ssize_t cur, total, transferred; >>>>>> + ssize_t cur, total, transferred = 0; >>>>>> struct comm_pipes comm_pipes; >>>>>> char *old, *new; >>>>>> int ret, fds[2]; >>>>> >>>>> >>>>> if (before_fork) { >>>>> transferred = vmsplice(fds[1], &iov, 1, 0); >>>>> ... >>>>> >>>>> if (!before_fork) { >>>>> transferred = vmsplice(fds[1], &iov, 1, 0); >>>>> ... >>>>> >>>>> for (total = 0; total < transferred; total += cur) { >>>>> ... >>>>> >>>>> >>>>> And I don't see any jump label that could jump to code that would ve using transferred. >>>>> >>>>> What am I missing? >>>> >>>> Probably because both those conditional statements are not mutually >>>> exclusive above with an if-else construct. Hence compiler flags it >>>> rather as a false positive ? Initializing with 0 just works around >>>> that false positive. >>> >>> This is something the compiler should clearly be able to verify. before_fork is never changed in that function. >>> >>> We should not work around wrong compilers. >>> >>> Which compiler are you using such that you run into this issue? >> >> gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 >> > > gcc (GCC) 14.2.1 20250110 (Red Hat 14.2.1-7) > > Seems to be fine, just like all other compilers people used with this > over the years. > > Maybe something about that compiler is shaky that was fixed in the meantime? > Reading https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562#c29 "Note that sanitizers tend to increase the rate of false positive warnings, most notably those around -Wmaybe-uninitialized. We recommend against combining -Werror and [the use of] sanitizers." Is this maybe related to the use of sanitizers?
diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c index f0cb14ea8608..b6cfe0a4b7df 100644 --- a/tools/testing/selftests/mm/cow.c +++ b/tools/testing/selftests/mm/cow.c @@ -293,7 +293,7 @@ static void do_test_vmsplice_in_parent(char *mem, size_t size, .iov_base = mem, .iov_len = size, }; - ssize_t cur, total, transferred; + ssize_t cur, total, transferred = 0; struct comm_pipes comm_pipes; char *old, *new; int ret, fds[2];
Following build warning comes up for cow test as 'transferred' variable has not been initialized. Fix the warning via zero init for the variable. CC cow cow.c: In function ‘do_test_vmsplice_in_parent’: cow.c:365:61: warning: ‘transferred’ may be used uninitialized [-Wmaybe-uninitialized] 365 | cur = read(fds[0], new + total, transferred - total); | ~~~~~~~~~~~~^~~~~~~ cow.c:296:29: note: ‘transferred’ was declared here 296 | ssize_t cur, total, transferred; | ^~~~~~~~~~~ CC compaction_test CC gup_longterm Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Shuah Khan <shuah@kernel.org> Cc: linux-mm@kvack.org Cc: linux-kselftest@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> --- tools/testing/selftests/mm/cow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)