public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
@ 2023-02-01 5:09 michael at scivision dot dev
2023-02-01 8:10 ` [Bug fortran/108621] " rguenth at gcc dot gnu.org
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: michael at scivision dot dev @ 2023-02-01 5:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
Bug ID: 108621
Summary: [12 regression]: bind(c) pointer array spurious
maybe-uninitialized warning
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: michael at scivision dot dev
Target Milestone: ---
GCC 12 introduced a new regression--spurious Wmaybe-initialized warnings from
example code compiled with:
gfortran -Wall -c main.f90
```
program demo
use, intrinsic :: iso_c_binding, only : c_int
implicit none
interface
subroutine fun(f_p) bind(c)
import c_int
integer(c_int), pointer, intent(out) :: f_p(:)
end subroutine
end interface
integer(c_int), pointer :: f(:)
nullify(f)
call fun(f)
end program
```
emits spurious warnings not seen in GCC < 12:
```
18 | call fcpoint(f)
| ^
Warning: 'f.dim[idx.1_32].lbound' may be used uninitialized
[-Wmaybe-uninitialized]
14 | integer(c_int), pointer :: f(:)
| ^
note: 'f' declared here
18 | call fcpoint(f)
| ^
Warning: 'f.dim[idx.1_32].ubound' may be used uninitialized
[-Wmaybe-uninitialized]
14 | integer(c_int), pointer :: f(:)
| ^
note: 'f' declared here
18 | call fcpoint(f)
| ^
Warning: 'f.dim[idx.1_32].lbound' may be used uninitialized
[-Wmaybe-uninitialized]
14 | integer(c_int), pointer :: f(:)
| ^
note: 'f' declared here
18 | call fcpoint(f)
| ^
Warning: 'f.dim[idx.1_32].stride' may be used uninitialized
[-Wmaybe-uninitialized]
14 | integer(c_int), pointer :: f(:)
| ^
note: 'f' declared her
```
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
@ 2023-02-01 8:10 ` rguenth at gcc dot gnu.org
2023-02-01 18:13 ` kargl at gcc dot gnu.org
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-02-01 8:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|--- |12.3
Priority|P3 |P4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
2023-02-01 8:10 ` [Bug fortran/108621] " rguenth at gcc dot gnu.org
@ 2023-02-01 18:13 ` kargl at gcc dot gnu.org
2023-02-01 18:17 ` sgk at troutmask dot apl.washington.edu
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-02-01 18:13 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
kargl at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2023-02-01
CC| |kargl at gcc dot gnu.org
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
--- Comment #1 from kargl at gcc dot gnu.org ---
This appears to be related to Sandra and Tobias's work on CFI. In particular,
trans-expr.cc(gfc_conv_gfc_desc_to_cfi_desc) appear to not handle an
intent(out) deferred entity. gfortran eventually gets to line 5818 and
following where the `tree gfx` and `tree idx` are getting manipulated, but
`fsym->as` shows
(gdb) b trans-expr.cc:5818
Breakpoint 1 at 0x9c6412: file ../../gccx/gcc/fortran/trans-expr.cc, line 5818.
(gdb) run -Wall a.f90
Breakpoint 1, gfc_conv_gfc_desc_to_cfi_desc (parmse=0x7fffffffdba0,
e=0x203c24fc0, fsym=0x203c54900) at ../../gccx/gcc/fortran/trans-expr.cc:5818
5818 if (fsym->attr.pointer || fsym->attr.allocatable)
(gdb) p *fsym->as
$1 = {rank = 1, corank = 0, type = AS_DEFERRED, cotype = 0, lower = {0x0
<repeats 15 times>}, upper = {
0x0 <repeats 15 times>}, cray_pointee = false, cp_was_assumed = false,
resolved = true}
(gdb)
Here, lower == NULL and upper == NULL, and I suspect the gfc is not set up
correctly.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
2023-02-01 8:10 ` [Bug fortran/108621] " rguenth at gcc dot gnu.org
2023-02-01 18:13 ` kargl at gcc dot gnu.org
@ 2023-02-01 18:17 ` sgk at troutmask dot apl.washington.edu
2023-02-02 2:35 ` jvdelisle at gcc dot gnu.org
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2023-02-01 18:17 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
--- Comment #2 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Wed, Feb 01, 2023 at 06:13:33PM +0000, kargl at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
>
> This appears to be related to Sandra and Tobias's work on CFI. In particular,
> trans-expr.cc(gfc_conv_gfc_desc_to_cfi_desc) appear to not handle an
> intent(out) deferred entity. gfortran eventually gets to line 5818 and
> following where the `tree gfx` and `tree idx` are getting manipulated, but
> `fsym->as` shows
>
It seems that bugzilla does not recognize the email address
that Tobias's uses in ChangeLong. Try to cc him here to see
if he gets added to the audit trail.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
` (2 preceding siblings ...)
2023-02-01 18:17 ` sgk at troutmask dot apl.washington.edu
@ 2023-02-02 2:35 ` jvdelisle at gcc dot gnu.org
2023-02-02 7:39 ` burnus at gcc dot gnu.org
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jvdelisle at gcc dot gnu.org @ 2023-02-02 2:35 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
--- Comment #3 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
(In reply to Steve Kargl from comment #2)
> On Wed, Feb 01, 2023 at 06:13:33PM +0000, kargl at gcc dot gnu.org wrote:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
> >
> > This appears to be related to Sandra and Tobias's work on CFI. In particular,
> > trans-expr.cc(gfc_conv_gfc_desc_to_cfi_desc) appear to not handle an
> > intent(out) deferred entity. gfortran eventually gets to line 5818 and
> > following where the `tree gfx` and `tree idx` are getting manipulated, but
> > `fsym->as` shows
> >
>
> It seems that bugzilla does not recognize the email address
> that Tobias's uses in ChangeLong. Try to cc him here to see
> if he gets added to the audit trail.
Got it
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
` (3 preceding siblings ...)
2023-02-02 2:35 ` jvdelisle at gcc dot gnu.org
@ 2023-02-02 7:39 ` burnus at gcc dot gnu.org
2023-02-23 17:37 ` [Bug fortran/108621] [12/13 " burnus at gcc dot gnu.org
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: burnus at gcc dot gnu.org @ 2023-02-02 7:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> ---
(In reply to Steve Kargl from comment #2)
> It seems that bugzilla does not recognize the email address
> that Tobias's uses in ChangeLong. Try to cc him here to see
> if he gets added to the audit trail.
That's pretty common - but if you type the name in the CC field and wait a
while, it suggests emails matching this pattern. Using the @gcc.gnu.org name
makes most sense, if it exists. (Caveat: if someone has an odd user name and
does not provide a full name, it might be more difficult.)
> $1 = {rank = 1, corank = 0, type = AS_DEFERRED, cotype = 0, lower = {0x0 <repeats 15 times>}, upper = { 0x0
that looks fine. For a deferred shape, there is no lower/upper bound except in
the array descriptor.
* * *
Regarding the bug, it looks as if
* some 'if (cfi->base_addr == NULL)' or 'if(gfc->base_addr == NULL)'
check is missing, either at the beginning (gfc->cfi)
and/or at the end (cfi->gfc).
* Possibly, some 'intent == OUT' check might be missing as well
maybe only for 'pointer'.
* Additionally, for variables not used in the procedure, we do not do anything
here, except for 'allocatable, intent(out)' - implying an early return.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12/13 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
` (4 preceding siblings ...)
2023-02-02 7:39 ` burnus at gcc dot gnu.org
@ 2023-02-23 17:37 ` burnus at gcc dot gnu.org
2023-02-25 10:56 ` cvs-commit at gcc dot gnu.org
2023-02-27 10:31 ` burnus at gcc dot gnu.org
7 siblings, 0 replies; 9+ messages in thread
From: burnus at gcc dot gnu.org @ 2023-02-23 17:37 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> ---
The warning itself is bogus (false positive in the middle end).
I get:
Warning: ‘f.dim[idx.1_32].lbound’ may be used uninitialized
[-Wmaybe-uninitialized]
If I now look at the 021t.ssa dump, I see:
f.data = 0B;
...
_1 = f.data;
cfi.0.base_addr = _1;
...
_2 = cfi.0.base_addr;
if (_2 != 0B)
goto <bb 3>; [INV]
else
goto <bb 6>; [INV]
...
<bb 4> :
_3 = f.dim[idx.1_32].lbound;
...
<bb 6> :
fun (&cfi.0);
The basic block <bb 4> is the only place where idx.1_32 gets used - but as
f.data == NULL, we directly jump to <bb 6>. Seemingly, the range/value
propagation from f.data to cfi.0.base_addr did not work. — Thus and probably
unsurprisingly, the warning is gone once optimization has been turned on (-Og,
-Os or -O1 are sufficient).
→ This is now tracked in the new PR middle-end/108906
* * *
Still, we can do better in the FE by producing less code when we know that the
dummy argument is 'intent(out)'. That's what the lightly tested patch below
does.
(Note: It fixes the testcase of comment 0, but when changing the intent, e.g.,
to 'intent(inout)' the bogus warning will re-appear.)
TODO: I think something similar needs to be done for allocatable +
'intent(out)', except that we still need to handle the DEALLOCATE in the
caller.
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -5675,3 +5675,3 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr
*e, gfc_symbol *fsym)
- if (e->rank == 0)
+ if (e->rank == 0 && (!fsym->attr.pointer || fsym->attr.intent !=
INTENT_OUT))
{
@@ -5680,3 +5680,3 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr
*e, gfc_symbol *fsym)
}
- else
+ else if (!fsym->attr.pointer || fsym->attr.intent != INTENT_OUT)
{
@@ -5697,2 +5697,5 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr
*e, gfc_symbol *fsym)
+ if (fsym->attr.pointer && fsym->attr.intent == INTENT_OUT)
+ goto done;
+
/* When allocatable + intent out, free the cfi descriptor. */
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12/13 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
` (5 preceding siblings ...)
2023-02-23 17:37 ` [Bug fortran/108621] [12/13 " burnus at gcc dot gnu.org
@ 2023-02-25 10:56 ` cvs-commit at gcc dot gnu.org
2023-02-27 10:31 ` burnus at gcc dot gnu.org
7 siblings, 0 replies; 9+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-02-25 10:56 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tobias Burnus <burnus@gcc.gnu.org>:
https://gcc.gnu.org/g:d3e427f684b0cd7cedbe7b93a06f455e562c5901
commit r13-6341-gd3e427f684b0cd7cedbe7b93a06f455e562c5901
Author: Tobias Burnus <tobias@codesourcery.com>
Date: Sat Feb 25 11:55:08 2023 +0100
Fortran: Skip bound conv in gfc_conv_gfc_desc_to_cfi_desc with intent(out)
ptr [PR108621]
When the dummy argument of the bind(C) proc is 'pointer, intent(out)', the
conversion
of the GFC to the CFI bounds can be skipped: it is not needed and avoids
issues with
noninit memory.
Note that the 'cfi->base_addr = gfc->addr' assignment is kept as the C code
of a user
might assume that a nullified pointer arrives as NULL (or even a specific
value).
For instance, gfortran.dg/c-interop/section-{1,2}.f90 assumes the value
NULL.
Note 2: The PR is about a may-be-uninitialized warning with intent(out). In
the PR's
testcase, the pointer was nullified and should not have produced that
warning.
That is a diagnostic issue, now tracked as PR middle-end/108906 as the
issue in principle
still exists (e.g. with 'intent(inout)'). [But no longer for intent(out).]
Note 3: With undefined pointers and no 'intent', accessing uninit memory is
unavoidable
on the caller side as the compiler cannot know what the C function does
(but this usage
determines whether the pointer is permitted be undefined or whether the
bounds must be
gfc-to-cfi converted).
gcc/fortran/ChangeLog:
PR fortran/108621
* trans-expr.cc (gfc_conv_gfc_desc_to_cfi_desc): Skip setting of
bounds of CFI desc for 'pointer,intent(out)'.
gcc/testsuite/ChangeLog:
PR fortran/108621
* gfortran.dg/c-interop/fc-descriptor-pr108621.f90: New test.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/108621] [12/13 regression]: bind(c) pointer array spurious maybe-uninitialized warning
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
` (6 preceding siblings ...)
2023-02-25 10:56 ` cvs-commit at gcc dot gnu.org
@ 2023-02-27 10:31 ` burnus at gcc dot gnu.org
7 siblings, 0 replies; 9+ messages in thread
From: burnus at gcc dot gnu.org @ 2023-02-27 10:31 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108621
Tobias Burnus <burnus at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|NEW |RESOLVED
--- Comment #7 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Close as FIXED - and thanks to Michael for the report!
On GCC 13 (mainline), only:
* For intent(out), the pointless code is no longer produced
and, thus, also the warning is gone.
→ No backport to GCC 12 planned as this was only a bogus warning
that ignored the "nullify()" - contrary to the generated code.
* PR middle-end/108906 – tracks the bogus warning with -O0 (gone with
optimization). Note: this message contains "may", i.e. the message
is correct (even if the "may" never occurs).
The issue still occurs with any intent but 'intent(out)'
* The generated code is/was fine – except possibly for the following,
but we cannot do anything about this with the current descriptors:
– For undefined pointers, which is valid* if no 'intent' is known
at the caller side (and the pointer is not read in the called proc):
Unless the pointer happens to point to NULL, the code will access unit
memory and might even overflowing integer arithmetic.
→ Should be usually still fine as long nothing is trapping or overflows
are checked for with -fsanitize=undefined. (And cannot be avoided.)
[(*) it is also valid with 'intent(out)' but since the just committed patch,
GCC 13 no longer generates affected code.]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-02-27 10:31 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-01 5:09 [Bug fortran/108621] New: [12 regression]: bind(c) pointer array spurious maybe-uninitialized warning michael at scivision dot dev
2023-02-01 8:10 ` [Bug fortran/108621] " rguenth at gcc dot gnu.org
2023-02-01 18:13 ` kargl at gcc dot gnu.org
2023-02-01 18:17 ` sgk at troutmask dot apl.washington.edu
2023-02-02 2:35 ` jvdelisle at gcc dot gnu.org
2023-02-02 7:39 ` burnus at gcc dot gnu.org
2023-02-23 17:37 ` [Bug fortran/108621] [12/13 " burnus at gcc dot gnu.org
2023-02-25 10:56 ` cvs-commit at gcc dot gnu.org
2023-02-27 10:31 ` burnus at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).