base: Prevent undefined behavior in not interleaved AddrRanges.

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>
This commit is contained in:
Isaac Sánchez Barrera
2020-11-16 16:22:44 +01:00
parent 2f8b5acba1
commit caf6a507cb

View 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++) {