base: Prevent undefined behavior in not interleaved `AddrRange`s.
authorIsaac Sánchez Barrera <isaac.sanchez@bsc.es>
Mon, 16 Nov 2020 15:22:44 +0000 (16:22 +0100)
committerIsaac Sánchez Barrera <isaac.sanchez@bsc.es>
Tue, 17 Nov 2020 10:46:30 +0000 (10:46 +0000)
If an `AddrRange` is not interleaved, return the input address in
`removeIntlvBits` and `addIntlvBits` to prevent undefined behavior.  It
allows to use these methods in all cases without having to check
manually whether the range is interleaved.

Change-Id: Ic6ac8c4e52b09417bc41aa9380a24319c34e0b35
Signed-off-by: Isaac Sánchez Barrera <isaac.sanchez@bsc.es>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/37617
Maintainer: Bobby R. Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
src/base/addr_range.hh

index 8a811d495ae62d583c7168c7d3ed2fa00ad83eab..7572d9790ae893776365063d11ee2c69d8c7da9a 100644 (file)
@@ -473,12 +473,18 @@ class AddrRange
      * ---------------------------------
      *
      * @param a the input address
-     * @return the new address
+     * @return the new address, or the input address if not interleaved
      *
      * @ingroup api_addr_range
      */
     inline Addr removeIntlvBits(Addr a) const
     {
+        // Directly return the address if the range is not interleaved
+        // to prevent undefined behavior.
+        if (!interleaved()) {
+            return a;
+        }
+
         // Get the LSB set from each mask
         int masks_lsb[masks.size()];
         for (int i = 0; i < masks.size(); i++) {
@@ -511,6 +517,12 @@ class AddrRange
      */
     inline Addr addIntlvBits(Addr a) const
     {
+        // Directly return the address if the range is not interleaved
+        // to prevent undefined behavior.
+        if (!interleaved()) {
+            return a;
+        }
+
         // Get the LSB set from each mask
         int masks_lsb[masks.size()];
         for (int i = 0; i < masks.size(); i++) {