diff options
author | Andreas Sandberg <andreas@sandberg.pp.se> | 2013-09-18 17:08:35 +0200 |
---|---|---|
committer | Andreas Sandberg <andreas@sandberg.pp.se> | 2013-09-18 17:08:35 +0200 |
commit | 4dbf25adc379d589c2aad9e62527d47a2ba62553 (patch) | |
tree | 4beb057314511609ee55eb76776fd59a5594c06f /src | |
parent | 9aa939891f9d8250dde552638bb03d3f3b6ba268 (diff) | |
download | gem5-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.cc | 6 |
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 |