sim: Fix undefined behavior in the pseudo-inst interface
authorAndreas Sandberg <andreas@sandberg.pp.se>
Wed, 18 Sep 2013 15:08:35 +0000 (17:08 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Wed, 18 Sep 2013 15:08:35 +0000 (17:08 +0200)
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

src/sim/pseudo_inst.cc

index 0dcf5c32b28985deabc4bb28324ad9cdd11d0c82..f4666a0cd3366d484cd8bf6f8a9d469b623be759 100644 (file)
@@ -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