summaryrefslogtreecommitdiff
path: root/src/base/sat_counter.hh
diff options
context:
space:
mode:
authorDaniel R. Carvalho <odanrc@yahoo.com.br>2019-12-15 16:24:15 +0100
committerDaniel Carvalho <odanrc@yahoo.com.br>2019-12-21 10:58:08 +0000
commit8ba0ba4871907aaa08c862534033f2922a3d2ba7 (patch)
tree84653473bf4039d0cba9065fbdefdca43ac45ac5 /src/base/sat_counter.hh
parentc3fecd4520555dfaf6a3836f791e638de1412e28 (diff)
downloadgem5-8ba0ba4871907aaa08c862534033f2922a3d2ba7.tar.xz
base: Fix negative op-assign of SatCounter
The value of the add and subtract assignment operations can be negative, and this was not being handled properly previously. Regarding shift assignment, the standard says it is undefined behaviour if a negative number is given, so add assertions for these cases. Change-Id: I2f1e4143c6385caa80fb25f84ca8edb0ca7e62b7 Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23664 Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/base/sat_counter.hh')
-rw-r--r--src/base/sat_counter.hh23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/base/sat_counter.hh b/src/base/sat_counter.hh
index 6aeca681d..946da4f26 100644
--- a/src/base/sat_counter.hh
+++ b/src/base/sat_counter.hh
@@ -44,6 +44,7 @@
#ifndef __BASE_SAT_COUNTER_HH__
#define __BASE_SAT_COUNTER_HH__
+#include <cassert>
#include <cstdint>
#include "base/logging.hh"
@@ -172,6 +173,7 @@ class SatCounter
SatCounter&
operator>>=(const int& shift)
{
+ assert(shift >= 0);
this->counter >>= shift;
return *this;
}
@@ -180,6 +182,7 @@ class SatCounter
SatCounter&
operator<<=(const int& shift)
{
+ assert(shift >= 0);
this->counter <<= shift;
if (this->counter > maxVal) {
this->counter = maxVal;
@@ -191,10 +194,14 @@ class SatCounter
SatCounter&
operator+=(const int& value)
{
- if (maxVal - this->counter >= value) {
- this->counter += value;
+ if (value >= 0) {
+ if (maxVal - this->counter >= value) {
+ this->counter += value;
+ } else {
+ this->counter = maxVal;
+ }
} else {
- this->counter = maxVal;
+ *this -= -value;
}
return *this;
}
@@ -203,10 +210,14 @@ class SatCounter
SatCounter&
operator-=(const int& value)
{
- if (this->counter > value) {
- this->counter -= value;
+ if (value >= 0) {
+ if (this->counter > value) {
+ this->counter -= value;
+ } else {
+ this->counter = 0;
+ }
} else {
- this->counter = 0;
+ *this += -value;
}
return *this;
}