public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix bogus -Wstringop-overflow warning in Ada
@ 2022-08-16 13:56 Eric Botcazou
  2022-08-17 11:27 ` Richard Biener
  0 siblings, 1 reply; 8+ messages in thread
From: Eric Botcazou @ 2022-08-16 13:56 UTC (permalink / raw)
  To: gcc-patches

[-- 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;

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-08-19  7:30 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-16 13:56 [PATCH] Fix bogus -Wstringop-overflow warning in Ada Eric Botcazou
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

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).