[Ada] Avoid uninitialized variable in bounded containers
In function Copy in Ada.Containers.Bounded_Ordered_Sets and other bounded containers packages, remove a possible use of an uninitialized variable. This was not a bug, because the uninitialized variable could be used only if checks are suppressed, and the checks would have failed, leading to erroneous execution. However, it seems more robust this way, and is probably equally efficient, and avoids a warning that is given if checks are suppressed, and the -Wall switch is given, and optimization is turned on. 2019-09-18 Bob Duff <duff@adacore.com> gcc/ada/ * libgnat/a-cbhama.adb, libgnat/a-cbhase.adb, libgnat/a-cbmutr.adb, libgnat/a-cborma.adb, libgnat/a-cborse.adb, libgnat/a-cobove.adb (Copy): Avoid reading the uninitialized variable C in the Checks = False case. Change variable to be a constant. gcc/testsuite/ * gnat.dg/containers1.adb, gnat.dg/containers1.ads: New testcase. From-SVN: r275839
This commit is contained in:
parent
2b6cd96251
commit
5ce1c7733b
|
@ -1,3 +1,11 @@
|
|||
2019-09-18 Bob Duff <duff@adacore.com>
|
||||
|
||||
* libgnat/a-cbhama.adb, libgnat/a-cbhase.adb,
|
||||
libgnat/a-cbmutr.adb, libgnat/a-cborma.adb,
|
||||
libgnat/a-cborse.adb, libgnat/a-cobove.adb (Copy): Avoid reading
|
||||
the uninitialized variable C in the Checks = False case. Change
|
||||
variable to be a constant.
|
||||
|
||||
2019-09-18 Claire Dross <dross@adacore.com>
|
||||
|
||||
* libgnat/a-cofuma.adb (Remove, Elements_Equal_Except,
|
||||
|
|
|
@ -262,18 +262,14 @@ package body Ada.Containers.Bounded_Hashed_Maps is
|
|||
Capacity : Count_Type := 0;
|
||||
Modulus : Hash_Type := 0) return Map
|
||||
is
|
||||
C : Count_Type;
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Length
|
||||
else Capacity);
|
||||
M : Hash_Type;
|
||||
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Length;
|
||||
|
||||
elsif Capacity >= Source.Length then
|
||||
C := Capacity;
|
||||
|
||||
elsif Checks then
|
||||
raise Capacity_Error with "Capacity value too small";
|
||||
if Checks and then C < Source.Length then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
if Modulus = 0 then
|
||||
|
|
|
@ -254,16 +254,14 @@ package body Ada.Containers.Bounded_Hashed_Sets is
|
|||
Capacity : Count_Type := 0;
|
||||
Modulus : Hash_Type := 0) return Set
|
||||
is
|
||||
C : Count_Type;
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Length
|
||||
else Capacity);
|
||||
M : Hash_Type;
|
||||
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Length;
|
||||
elsif Capacity >= Source.Length then
|
||||
C := Capacity;
|
||||
elsif Checks then
|
||||
raise Capacity_Error with "Capacity value too small";
|
||||
if Checks and then C < Source.Length then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
if Modulus = 0 then
|
||||
|
|
|
@ -625,15 +625,12 @@ package body Ada.Containers.Bounded_Multiway_Trees is
|
|||
(Source : Tree;
|
||||
Capacity : Count_Type := 0) return Tree
|
||||
is
|
||||
C : Count_Type;
|
||||
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Count
|
||||
else Capacity);
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Count;
|
||||
elsif Capacity >= Source.Count then
|
||||
C := Capacity;
|
||||
elsif Checks then
|
||||
raise Capacity_Error with "Capacity value too small";
|
||||
if Checks and then C < Source.Count then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
return Target : Tree (Capacity => C) do
|
||||
|
|
|
@ -464,17 +464,12 @@ package body Ada.Containers.Bounded_Ordered_Maps is
|
|||
----------
|
||||
|
||||
function Copy (Source : Map; Capacity : Count_Type := 0) return Map is
|
||||
C : Count_Type;
|
||||
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Length
|
||||
else Capacity);
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Length;
|
||||
|
||||
elsif Capacity >= Source.Length then
|
||||
C := Capacity;
|
||||
|
||||
elsif Checks then
|
||||
raise Capacity_Error with "Capacity value too small";
|
||||
if Checks and then C < Source.Length then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
return Target : Map (Capacity => C) do
|
||||
|
|
|
@ -442,15 +442,12 @@ package body Ada.Containers.Bounded_Ordered_Sets is
|
|||
----------
|
||||
|
||||
function Copy (Source : Set; Capacity : Count_Type := 0) return Set is
|
||||
C : Count_Type;
|
||||
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Length
|
||||
else Capacity);
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Length;
|
||||
elsif Capacity >= Source.Length then
|
||||
C := Capacity;
|
||||
elsif Checks then
|
||||
raise Capacity_Error with "Capacity value too small";
|
||||
if Checks and then C < Source.Length then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
return Target : Set (Capacity => C) do
|
||||
|
|
|
@ -451,18 +451,12 @@ package body Ada.Containers.Bounded_Vectors is
|
|||
(Source : Vector;
|
||||
Capacity : Count_Type := 0) return Vector
|
||||
is
|
||||
C : Count_Type;
|
||||
|
||||
C : constant Count_Type :=
|
||||
(if Capacity = 0 then Source.Length
|
||||
else Capacity);
|
||||
begin
|
||||
if Capacity = 0 then
|
||||
C := Source.Length;
|
||||
|
||||
elsif Capacity >= Source.Length then
|
||||
C := Capacity;
|
||||
|
||||
elsif Checks then
|
||||
raise Capacity_Error
|
||||
with "Requested capacity is less than Source length";
|
||||
if Checks and then C < Source.Length then
|
||||
raise Capacity_Error with "Capacity too small";
|
||||
end if;
|
||||
|
||||
return Target : Vector (C) do
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-09-18 Bob Duff <duff@adacore.com>
|
||||
|
||||
* gnat.dg/containers1.adb, gnat.dg/containers1.ads: New
|
||||
testcase.
|
||||
|
||||
2019-09-18 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* gcc.target/i386/pr82361-1.c (f1, f2, f3, f4, f5, f6): Force
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
-- { dg-do compile }
|
||||
-- { dg-options "-Wall -O2" }
|
||||
package body Containers1 is
|
||||
procedure Dummy is null;
|
||||
end Containers1;
|
|
@ -0,0 +1,6 @@
|
|||
with Ada.Containers.Bounded_Ordered_Sets; use Ada.Containers;
|
||||
package Containers1 is
|
||||
pragma Suppress (All_Checks);
|
||||
package Sets is new Bounded_Ordered_Sets (Boolean);
|
||||
procedure Dummy;
|
||||
end Containers1;
|
Loading…
Reference in New Issue