Fix a bug in slices, where a zero-sized slice causes an invalid read
detected by valgrind
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* libgnat/s-bituti.ads (Small_Size): Do not include 0 in this
type.
* libgnat/s-bituti.adb (Copy_Bitfield): Do nothing for 0-bit
bitfields.
diff --git a/gcc/ada/libgnat/s-bituti.adb b/gcc/ada/libgnat/s-bituti.adb
--- a/gcc/ada/libgnat/s-bituti.adb
+++ b/gcc/ada/libgnat/s-bituti.adb
@@ -402,11 +402,22 @@ package body System.Bitfield_Utils is
pragma Assert (Al_Src_Address mod Val'Alignment = 0);
pragma Assert (Al_Dest_Address mod Val'Alignment = 0);
begin
+ -- Optimized small case
+
if Size in Small_Size then
Copy_Small_Bitfield
(Al_Src_Address, Al_Src_Offset,
Al_Dest_Address, Al_Dest_Offset,
Size);
+
+ -- Do nothing for zero size. This is necessary to avoid doing invalid
+ -- reads, which are detected by valgrind.
+
+ elsif Size = 0 then
+ null;
+
+ -- Large case
+
else
Copy_Large_Bitfield
(Al_Src_Address, Al_Src_Offset,
diff --git a/gcc/ada/libgnat/s-bituti.ads b/gcc/ada/libgnat/s-bituti.ads
--- a/gcc/ada/libgnat/s-bituti.ads
+++ b/gcc/ada/libgnat/s-bituti.ads
@@ -98,9 +98,9 @@ package System.Bitfield_Utils is
pragma Assert (Val_Array'Component_Size = Val'Size);
subtype Bit_Size is Natural; -- Size in bits of a bit field
- subtype Small_Size is Bit_Size range 0 .. Val'Size;
+ subtype Small_Size is Bit_Size range 1 .. Val'Size;
-- Size of a small one
- subtype Bit_Offset is Small_Size range 0 .. Val'Size - 1;
+ subtype Bit_Offset is Small_Size'Base range 0 .. Val'Size - 1;
-- Starting offset
subtype Bit_Offset_In_Byte is Bit_Offset range 0 .. Storage_Unit - 1;