Ping: [PATCH] Fix PR112419 (was: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541])
> From: Hans-Peter Nilsson > Date: Thu, 16 Nov 2023 05:24:06 +0100 > > > From: Martin Uecker > > Date: Tue, 07 Nov 2023 06:56:25 +0100 > > > Am Montag, dem 06.11.2023 um 21:01 -0700 schrieb Jeff Law: > > > > > > On 11/6/23 20:58, Hans-Peter Nilsson wrote: > > > > This patch caused a testsuite regression: there's now an > > > > "excess error" failure for gcc.dg/Wnonnull-4.c for 32-bit > > > > targets (and 64-bit targets testing with a "-m32" option) > > > > after your r14-5115-g6e9ee44d96e5. It's logged as PR112419. > > > It caused failures for just about every target ;( Presumably it worked > > > on x86_64... > > > > I do not think this is a true regression > > just a problem with the test on 32-bit which somehow surfaced > > due to the change. > > > > The excess error is: > > > > FAIL: gcc.dg/Wnonnull-4.c (test for excess errors) > > Excess errors: > > /home/tcwg-buildslave/workspace/tcwg_gnu_6/abe/snapshots/gcc.git~master/gcc/testsuite/gcc.dg/Wnonnull-4.c:144:3: > > warning: 'fda_n_5' specified size 4294967256 exceeds maximum object size > > 2147483647 [-Wstringop-overflow=] > > > > I think the warning was suppressed before due to the other (nonnull) > > warning which I removed in this case. > > > > I think the simple fix might be to to turn off -Wstringop-overflow. > > No, that trigs many of the dg-warnings that are tested. > > (I didn't pay attention to the actual warning messages and > tried to pursue that at first.) > > Maybe think it's best to actually expect the warning, like > so. > > Maintainers of 16-bit targets will have to address their > concerns separately. For example, they may choose to not > run the test at all. > > Ok to commit? > > Subject: [PATCH] gcc.dg/Wnonnull-4.c: Handle new overflow warning for 32-bit > targets [PR112419] > > PR testsuite/112419 > * gcc.dg/Wnonnull-4.c (test_fda_n_5): Expect warning for exceeding > maximum object size for 32-bit targets. > --- > gcc/testsuite/gcc.dg/Wnonnull-4.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/gcc/testsuite/gcc.dg/Wnonnull-4.c > b/gcc/testsuite/gcc.dg/Wnonnull-4.c > index 1f14fbba45df..d63e76da70a2 100644 > --- a/gcc/testsuite/gcc.dg/Wnonnull-4.c > +++ b/gcc/testsuite/gcc.dg/Wnonnull-4.c > @@ -142,6 +142,7 @@ void test_fda_n_5 (int r_m1) >T ( 1); // { dg-bogus "argument 2 of variable length array > 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is > 1" } >T ( 9); // { dg-bogus "argument 2 of variable length array > 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is > 9" } >T (max); // { dg-bogus "argument 2 of variable length array > 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is > \\d+" } > +// { dg-warning "size 4294967256 exceeds maximum object size" "" { target > ilp32 } .-1 } > } > > > -- > 2.30.2 >
Re: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
> From: Martin Uecker > Date: Tue, 07 Nov 2023 06:56:25 +0100 > Am Montag, dem 06.11.2023 um 21:01 -0700 schrieb Jeff Law: > > > > On 11/6/23 20:58, Hans-Peter Nilsson wrote: > > > This patch caused a testsuite regression: there's now an > > > "excess error" failure for gcc.dg/Wnonnull-4.c for 32-bit > > > targets (and 64-bit targets testing with a "-m32" option) > > > after your r14-5115-g6e9ee44d96e5. It's logged as PR112419. > > It caused failures for just about every target ;( Presumably it worked > > on x86_64... > > I do not think this is a true regression > just a problem with the test on 32-bit which somehow surfaced > due to the change. > > The excess error is: > > FAIL: gcc.dg/Wnonnull-4.c (test for excess errors) > Excess errors: > /home/tcwg-buildslave/workspace/tcwg_gnu_6/abe/snapshots/gcc.git~master/gcc/testsuite/gcc.dg/Wnonnull-4.c:144:3: > warning: 'fda_n_5' specified size 4294967256 exceeds maximum object size > 2147483647 [-Wstringop-overflow=] > > I think the warning was suppressed before due to the other (nonnull) > warning which I removed in this case. > > I think the simple fix might be to to turn off -Wstringop-overflow. No, that trigs many of the dg-warnings that are tested. (I didn't pay attention to the actual warning messages and tried to pursue that at first.) Maybe think it's best to actually expect the warning, like so. Maintainers of 16-bit targets will have to address their concerns separately. For example, they may choose to not run the test at all. Ok to commit? Subject: [PATCH] gcc.dg/Wnonnull-4.c: Handle new overflow warning for 32-bit targets [PR112419] PR testsuite/112419 * gcc.dg/Wnonnull-4.c (test_fda_n_5): Expect warning for exceeding maximum object size for 32-bit targets. --- gcc/testsuite/gcc.dg/Wnonnull-4.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gcc/testsuite/gcc.dg/Wnonnull-4.c b/gcc/testsuite/gcc.dg/Wnonnull-4.c index 1f14fbba45df..d63e76da70a2 100644 --- a/gcc/testsuite/gcc.dg/Wnonnull-4.c +++ b/gcc/testsuite/gcc.dg/Wnonnull-4.c @@ -142,6 +142,7 @@ void test_fda_n_5 (int r_m1) T ( 1); // { dg-bogus "argument 2 of variable length array 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is 1" } T ( 9); // { dg-bogus "argument 2 of variable length array 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is 9" } T (max); // { dg-bogus "argument 2 of variable length array 'double\\\[n]\\\[5]' is null but the corresponding bound argument 1 value is \\d+" } +// { dg-warning "size 4294967256 exceeds maximum object size" "" { target ilp32 } .-1 } } -- 2.30.2
Re: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
Am Montag, dem 06.11.2023 um 21:01 -0700 schrieb Jeff Law: > > On 11/6/23 20:58, Hans-Peter Nilsson wrote: > > > From: Martin Uecker > > > Date: Tue, 31 Oct 2023 20:05:09 +0100 > > > > > Reduce false positives for -Wnonnull for VLA parameters [PR98541] > > > > > > This patch limits the warning about NULL arguments to VLA > > > parameters declared [static n]. > > > > > > PR c/98541 > > > > > > gcc/ > > > * gimple-ssa-warn-access.cc > > > (pass_waccess::maybe_check_access_sizes): For VLA bounds > > > in parameters, only warn about null pointers with 'static'. > > > > > > gcc/testsuite: > > > * gcc.dg/Wnonnull-4: Adapt test. > > > * gcc.dg/Wstringop-overflow-40.c: Adapt test. > > > > This patch caused a testsuite regression: there's now an > > "excess error" failure for gcc.dg/Wnonnull-4.c for 32-bit > > targets (and 64-bit targets testing with a "-m32" option) > > after your r14-5115-g6e9ee44d96e5. It's logged as PR112419. > It caused failures for just about every target ;( Presumably it worked > on x86_64... I do not think this is a true regression just a problem with the test on 32-bit which somehow surfaced due to the change. The excess error is: FAIL: gcc.dg/Wnonnull-4.c (test for excess errors) Excess errors: /home/tcwg-buildslave/workspace/tcwg_gnu_6/abe/snapshots/gcc.git~master/gcc/testsuite/gcc.dg/Wnonnull-4.c:144:3: warning: 'fda_n_5' specified size 4294967256 exceeds maximum object size 2147483647 [-Wstringop-overflow=] I think the warning was suppressed before due to the other (nonnull) warning which I removed in this case. I think the simple fix might be to to turn off -Wstringop-overflow. Link to the change: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=6e9ee44d96e5bda8808dd9d8ccf58d2525383f6b Martin > > jeff
Re: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
On 11/6/23 20:58, Hans-Peter Nilsson wrote: From: Martin Uecker Date: Tue, 31 Oct 2023 20:05:09 +0100 Reduce false positives for -Wnonnull for VLA parameters [PR98541] This patch limits the warning about NULL arguments to VLA parameters declared [static n]. PR c/98541 gcc/ * gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes): For VLA bounds in parameters, only warn about null pointers with 'static'. gcc/testsuite: * gcc.dg/Wnonnull-4: Adapt test. * gcc.dg/Wstringop-overflow-40.c: Adapt test. This patch caused a testsuite regression: there's now an "excess error" failure for gcc.dg/Wnonnull-4.c for 32-bit targets (and 64-bit targets testing with a "-m32" option) after your r14-5115-g6e9ee44d96e5. It's logged as PR112419. It caused failures for just about every target ;( Presumably it worked on x86_64... jeff
Re: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
> From: Martin Uecker > Date: Tue, 31 Oct 2023 20:05:09 +0100 > Reduce false positives for -Wnonnull for VLA parameters [PR98541] > > This patch limits the warning about NULL arguments to VLA > parameters declared [static n]. > > PR c/98541 > > gcc/ > * gimple-ssa-warn-access.cc > (pass_waccess::maybe_check_access_sizes): For VLA bounds > in parameters, only warn about null pointers with 'static'. > > gcc/testsuite: > * gcc.dg/Wnonnull-4: Adapt test. > * gcc.dg/Wstringop-overflow-40.c: Adapt test. This patch caused a testsuite regression: there's now an "excess error" failure for gcc.dg/Wnonnull-4.c for 32-bit targets (and 64-bit targets testing with a "-m32" option) after your r14-5115-g6e9ee44d96e5. It's logged as PR112419. brgds, H-P
Re: [PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
On Tue, Oct 31, 2023 at 8:05 PM Martin Uecker wrote: > > > This is a revised part of previously posted patch which > I split up. C FE changes which another false positive > were already merged, but I still need approval for this > middle-end change. It would be nice to get this in, > because it fixes some rather annoying (for me atleast) > false positive warnings with no easy workaround. > > In the following example, > > int foo(int n, float matrix[n], float opt[n]); > foo(n, matrix, NULL); > > GCC warns about NULL iff n > 0. This is problematic for > several reasons: > 1. It causes false positives (and I turn off -Wnonnull > in one of my projects for this reason) > 2. It is inconsistent with regular arrays where there is no > warning in this case. > 3. The size parameter is sometimes shared (as in this example) > so passing zero to avoid the warning is only possible by > making the code more complex. > 4. Passing zero as a workaround is technically UB. > > > (The original author of the warning code, Martin S seemed to > agree with this change according to this discussion in Bugzilla.) OK. > > > Reduce false positives for -Wnonnull for VLA parameters [PR98541] > > This patch limits the warning about NULL arguments to VLA > parameters declared [static n]. > > PR c/98541 > > gcc/ > * gimple-ssa-warn-access.cc > (pass_waccess::maybe_check_access_sizes): For VLA bounds > in parameters, only warn about null pointers with 'static'. > > gcc/testsuite: > * gcc.dg/Wnonnull-4: Adapt test. > * gcc.dg/Wstringop-overflow-40.c: Adapt test. > > diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc > index e439d1b9b68..8b734295f09 100644 > --- a/gcc/gimple-ssa-warn-access.cc > +++ b/gcc/gimple-ssa-warn-access.cc > @@ -3477,27 +3477,14 @@ pass_waccess::maybe_check_access_sizes (rdwr_map > *rwm, tree fndecl, tree fntype, > >if (integer_zerop (ptr)) > { > - if (sizidx >= 0 && tree_int_cst_sgn (sizrng[0]) > 0) > + if (!access.second.internal_p > + && sizidx >= 0 && tree_int_cst_sgn (sizrng[0]) > 0) > { > /* Warn about null pointers with positive sizes. This is > different from also declaring the pointer argument with > attribute nonnull when the function accepts null pointers > only when the corresponding size is zero. */ > - if (access.second.internal_p) > - { > - const std::string argtypestr > - = access.second.array_as_string (ptrtype); > - > - if (warning_at (loc, OPT_Wnonnull, > - "argument %i of variable length " > - "array %s is null but " > - "the corresponding bound argument " > - "%i value is %s", > - ptridx + 1, argtypestr.c_str (), > - sizidx + 1, sizstr)) > - arg_warned = OPT_Wnonnull; > - } > - else if (warning_at (loc, OPT_Wnonnull, > + if (warning_at (loc, OPT_Wnonnull, >"argument %i is null but " >"the corresponding size argument " >"%i value is %s", > diff --git a/gcc/testsuite/gcc.dg/Wnonnull-4.c > b/gcc/testsuite/gcc.dg/Wnonnull-4.c > index 2c1c45a9856..1f14fbba45d 100644 > --- a/gcc/testsuite/gcc.dg/Wnonnull-4.c > +++ b/gcc/testsuite/gcc.dg/Wnonnull-4.c > @@ -27,9 +27,9 @@ void test_fca_n (int r_m1) >T ( 0); > >// Verify positive bounds. > - T ( 1); // { dg-warning "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is 1" } > - T ( 9); // { dg-warning "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is 9" } > - T (max); // { dg-warning "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is \\d+" } > + T ( 1); // { dg-bogus "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is 1" } > + T ( 9); // { dg-bogus "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is 9" } > + T (max); // { dg-bogus "argument 2 of variable length array > 'char\\\[n]' is null but the corresponding bound argument 1 value is \\d+" } > } > > > @@ -55,9 +55,9 @@ void test_fsa_x_n (int r_m1) >T ( 0); > >// Verify positive bounds. > - T ( 1); // { dg-warning "argument 2 of variable length array > 'short int\\\[]\\\[n]' is null but the corresponding bound argument 1 value > is 1" } > - T ( 9); // { d
[PATCH] Reduce false positives for -Wnonnull for VLA parameters [PR98541]
This is a revised part of previously posted patch which I split up. C FE changes which another false positive were already merged, but I still need approval for this middle-end change. It would be nice to get this in, because it fixes some rather annoying (for me atleast) false positive warnings with no easy workaround. In the following example, int foo(int n, float matrix[n], float opt[n]); foo(n, matrix, NULL); GCC warns about NULL iff n > 0. This is problematic for several reasons: 1. It causes false positives (and I turn off -Wnonnull in one of my projects for this reason) 2. It is inconsistent with regular arrays where there is no warning in this case. 3. The size parameter is sometimes shared (as in this example) so passing zero to avoid the warning is only possible by making the code more complex. 4. Passing zero as a workaround is technically UB. (The original author of the warning code, Martin S seemed to agree with this change according to this discussion in Bugzilla.) Reduce false positives for -Wnonnull for VLA parameters [PR98541] This patch limits the warning about NULL arguments to VLA parameters declared [static n]. PR c/98541 gcc/ * gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes): For VLA bounds in parameters, only warn about null pointers with 'static'. gcc/testsuite: * gcc.dg/Wnonnull-4: Adapt test. * gcc.dg/Wstringop-overflow-40.c: Adapt test. diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index e439d1b9b68..8b734295f09 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -3477,27 +3477,14 @@ pass_waccess::maybe_check_access_sizes (rdwr_map *rwm, tree fndecl, tree fntype, if (integer_zerop (ptr)) { - if (sizidx >= 0 && tree_int_cst_sgn (sizrng[0]) > 0) + if (!access.second.internal_p + && sizidx >= 0 && tree_int_cst_sgn (sizrng[0]) > 0) { /* Warn about null pointers with positive sizes. This is different from also declaring the pointer argument with attribute nonnull when the function accepts null pointers only when the corresponding size is zero. */ - if (access.second.internal_p) - { - const std::string argtypestr - = access.second.array_as_string (ptrtype); - - if (warning_at (loc, OPT_Wnonnull, - "argument %i of variable length " - "array %s is null but " - "the corresponding bound argument " - "%i value is %s", - ptridx + 1, argtypestr.c_str (), - sizidx + 1, sizstr)) - arg_warned = OPT_Wnonnull; - } - else if (warning_at (loc, OPT_Wnonnull, + if (warning_at (loc, OPT_Wnonnull, "argument %i is null but " "the corresponding size argument " "%i value is %s", diff --git a/gcc/testsuite/gcc.dg/Wnonnull-4.c b/gcc/testsuite/gcc.dg/Wnonnull-4.c index 2c1c45a9856..1f14fbba45d 100644 --- a/gcc/testsuite/gcc.dg/Wnonnull-4.c +++ b/gcc/testsuite/gcc.dg/Wnonnull-4.c @@ -27,9 +27,9 @@ void test_fca_n (int r_m1) T ( 0); // Verify positive bounds. - T ( 1); // { dg-warning "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is 1" } - T ( 9); // { dg-warning "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is 9" } - T (max); // { dg-warning "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is \\d+" } + T ( 1); // { dg-bogus "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is 1" } + T ( 9); // { dg-bogus "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is 9" } + T (max); // { dg-bogus "argument 2 of variable length array 'char\\\[n]' is null but the corresponding bound argument 1 value is \\d+" } } @@ -55,9 +55,9 @@ void test_fsa_x_n (int r_m1) T ( 0); // Verify positive bounds. - T ( 1); // { dg-warning "argument 2 of variable length array 'short int\\\[]\\\[n]' is null but the corresponding bound argument 1 value is 1" } - T ( 9); // { dg-warning "argument 2 of variable length array 'short int\\\[]\\\[n]' is null but the corresponding bound argument 1 value is 9" } - T (max); // { dg-warning "argument 2 of variable length array 'short int\\\[]\\\[n]' is null