summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas@sandberg.pp.se>2013-09-18 17:08:35 +0200
committerAndreas Sandberg <andreas@sandberg.pp.se>2013-09-18 17:08:35 +0200
commit4dbf25adc379d589c2aad9e62527d47a2ba62553 (patch)
tree4beb057314511609ee55eb76776fd59a5594c06f /src
parent9aa939891f9d8250dde552638bb03d3f3b6ba268 (diff)
downloadgem5-4dbf25adc379d589c2aad9e62527d47a2ba62553.tar.xz
sim: Fix undefined behavior in the pseudo-inst interface
The order between updating and using arg_num in PseudoInst::pseudoInst() is currently undefined. This changeset explicitly updates arg_num after it has been used to extract an argument. --HG-- extra : rebase_source : 67c46dc3333d16ce56687ee8aea41ce6c6d133bb
Diffstat (limited to 'src')
-rw-r--r--src/sim/pseudo_inst.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/sim/pseudo_inst.cc b/src/sim/pseudo_inst.cc
index 0dcf5c32b..f4666a0cd 100644
--- a/src/sim/pseudo_inst.cc
+++ b/src/sim/pseudo_inst.cc
@@ -98,8 +98,10 @@ pseudoInst(ThreadContext *tc, uint8_t func, uint8_t subfunc)
// used the Argument class, but due to the possible side effects
// from getArgument, it'd most likely break.
int arg_num(0);
- for (int i = 0; i < sizeof(args) / sizeof(*args); ++i)
- args[arg_num++] = getArgument(tc, arg_num, sizeof(uint64_t), false);
+ for (int i = 0; i < sizeof(args) / sizeof(*args); ++i) {
+ args[arg_num] = getArgument(tc, arg_num, sizeof(uint64_t), false);
+ ++arg_num;
+ }
switch (func) {
case 0x00: // arm_func