From: Eric Botcazou <botcazou@adacore.com>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH] Fix bogus -Wstringop-overflow warning in Ada
Date: Tue, 16 Aug 2022 15:56:16 +0200 [thread overview]
Message-ID: <3184807.aeNJFYEL58@arcturus> (raw)
[-- Attachment #1: Type: text/plain, Size: 1109 bytes --]
Hi,
the following bogus warning:
In function 'lto26',
inlined from 'main' at /home/eric/gnat/bugs/V721-018/b~lto26.adb:237:7:
lto26.adb:11:13: warning: writing 1 byte into a region of size 0 [-Wstringop-
overflow=]
11 | Set (R, (7, 0, 84, Stream_Element (I), 0, 0, 0), 1);
| ^
lto26.adb: In function 'main':
lto26.adb:11:50: note: at offset -9223372036854775808 into destination object
'A.0' of size 7
11 | Set (R, (7, 0, 84, Stream_Element (I), 0, 0, 0), 1);
| ^
comes from a discrepancy between get_offset_range, which uses a signed type,
and handle_array_ref, which uses an unsigned one, to do offset computations.
Tested on x86-64/Linux, OK for the mainline?
2022-08-16 Eric Botcazou <ebotcazou@adacore.com>
* pointer-query.cc (handle_array_ref): Fix handling of low bound.
2022-08-16 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/lto26.adb: New test.
* gnat.dg/lto26_pkg1.ads, gnat.dg/lto26_pkg1.adb: New helper.
* gnat.dg/lto26_pkg2.ads, gnat.dg/lto26_pkg2.adb: Likewise.
--
Eric Botcazou
[-- Attachment #2: p.diff --]
[-- Type: text/x-patch, Size: 1272 bytes --]
diff --git a/gcc/pointer-query.cc b/gcc/pointer-query.cc
index ae561731216..0f0100233c1 100644
--- a/gcc/pointer-query.cc
+++ b/gcc/pointer-query.cc
@@ -1796,14 +1796,19 @@ handle_array_ref (tree aref, gimple *stmt, bool addr, int ostype,
orng[0] = -orng[1] - 1;
}
- /* Convert the array index range determined above to a byte
- offset. */
+ /* Convert the array index range determined above to a byte offset. */
tree lowbnd = array_ref_low_bound (aref);
- if (!integer_zerop (lowbnd) && tree_fits_uhwi_p (lowbnd))
- {
- /* Adjust the index by the low bound of the array domain
- (normally zero but 1 in Fortran). */
- unsigned HOST_WIDE_INT lb = tree_to_uhwi (lowbnd);
+ if (TREE_CODE (lowbnd) == INTEGER_CST && !integer_zerop (lowbnd))
+ {
+ /* Adjust the index by the low bound of the array domain (0 in C/C++,
+ 1 in Fortran and anything in Ada) by applying the same processing
+ as in get_offset_range. */
+ const wide_int wlb = wi::to_wide (lowbnd);
+ signop sgn = SIGNED;
+ if (TYPE_UNSIGNED (TREE_TYPE (lowbnd))
+ && wlb.get_precision () < TYPE_PRECISION (sizetype))
+ sgn = UNSIGNED;
+ const offset_int lb = offset_int::from (wlb, sgn);
orng[0] -= lb;
orng[1] -= lb;
}
[-- Attachment #3: lto26_pkg1.adb --]
[-- Type: text/x-adasrc, Size: 223 bytes --]
with Lto26_Pkg2; use Lto26_Pkg2;
package body Lto26_Pkg1 is
procedure Set (R : Rec; A : Stream_Element_Array; C :Unsigned_8) is
procedure My_Build is new Build;
begin
My_Build (A, C);
end;
end Lto26_Pkg1;
[-- Attachment #4: lto26_pkg1.ads --]
[-- Type: text/x-adasrc, Size: 274 bytes --]
with Ada.Finalization;
with Ada.Streams; use Ada.Streams;
with Interfaces; use Interfaces;
package Lto26_Pkg1 is
type Rec is new Ada.Finalization.Limited_Controlled with null record;
procedure Set (R : Rec; A : Stream_Element_Array; C :Unsigned_8);
end Lto26_Pkg1;
[-- Attachment #5: lto26_pkg2.ads --]
[-- Type: text/x-adasrc, Size: 181 bytes --]
with Ada.Streams; use Ada.Streams;
with Interfaces; use Interfaces;
package Lto26_Pkg2 is
generic
procedure Build (A : Stream_Element_Array; C : Unsigned_8);
end Lto26_Pkg2;
[-- Attachment #6: lto26_pkg2.adb --]
[-- Type: text/x-adasrc, Size: 391 bytes --]
package body Lto26_Pkg2 is
procedure Build (A : Stream_Element_Array; C : Unsigned_8) is
Start : Stream_Element_Offset := A'First;
Next : Stream_Element_Offset;
Length : Unsigned_8;
begin
for I in 1 .. C loop
Length := Unsigned_8 (A (A'First));
Next := Start + Stream_Element_Offset (Length);
Start := Next;
end loop;
end;
end Lto26_Pkg2;
[-- Attachment #7: lto26.adb --]
[-- Type: text/x-adasrc, Size: 266 bytes --]
-- { dg-do run }
-- { dg-options "-O2 -flto" { target lto } }
with Ada.Streams; use Ada.Streams;
with Lto26_Pkg1; use Lto26_Pkg1;
procedure Lto26 is
R : Rec;
begin
for I in 1 .. 10 loop
Set (R, (7, 0, 84, Stream_Element (I), 0, 0, 0), 1);
end loop;
end;
next reply other threads:[~2022-08-16 13:56 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-16 13:56 Eric Botcazou [this message]
2022-08-17 11:27 ` Richard Biener
2022-08-17 13:38 ` Eric Botcazou
2022-08-18 7:30 ` Richard Biener
2022-08-18 7:55 ` Eric Botcazou
2022-08-18 9:22 ` Richard Biener
2022-08-18 14:47 ` Eric Botcazou
2022-08-19 7:30 ` Richard Biener
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3184807.aeNJFYEL58@arcturus \
--to=botcazou@adacore.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).