about summary refs log tree commit diff stats
path: root/cpp/020run
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-04-22 22:34:34 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-04-22 22:40:46 -0700
commitf1e953d0cf7f5669a55b1337a87e646c1262d139 (patch)
tree4202cb6dc09fee952ca0085fae95ebd78c876084 /cpp/020run
parent547ec78bf27e37e7a1552d99185200fef460bb38 (diff)
downloadmu-f1e953d0cf7f5669a55b1337a87e646c1262d139.tar.gz
1146 - yet another out-of-bounds access
There's a test in this commit, but it doesn't actually fail, because by
some accident the memory at index 2 of recipe 'f' has data at the
is_label offset and breaks out of the loop. Graah. How did I ever
misplace that "Reading One Instruction" waypoint? I could swear I was
concerned about this possibility when I implemented calls.

Today has been tough on my confidence. STL helps avoid memory leaks but
doesn't help with buffer overflows nearly as much as I thought.

Oh brilliant, valgrind caught the problem! And there weren't any others.
I feel much better.
Diffstat (limited to 'cpp/020run')
-rw-r--r--cpp/020run5
1 files changed, 4 insertions, 1 deletions
diff --git a/cpp/020run b/cpp/020run
index 3dad12bf..456d578a 100644
--- a/cpp/020run
+++ b/cpp/020run
@@ -47,11 +47,13 @@ void run(recipe_number r) {
 void run(routine rr) {
   Current_routine = &rr;
   while (!done(rr)) {
+    // Running One Instruction.
     vector<instruction>& instructions = steps(rr);
     size_t& pc = running_at(rr);
-    // Running one instruction.
+//?     trace("foo") << "2: " << pc << " " << &pc; //? 1
     if (instructions[pc].is_label) { ++pc; continue; }
 //?     cout << "AAA " << Trace_stream << " ^" << Trace_stream->dump_layer << "$\n"; //? 1
+//?     trace("foo") << "2.5: " << pc << " " << &pc; //? 1
     trace("run") << "instruction " << recipe_name(rr) << '/' << pc;
 //?     cout << "operation " << instructions[pc].operation << '\n'; //? 3
 //?     if (!instructions[pc].products.empty()) trace("foo") << "AAA product 0 is " << instructions[pc].products[0].to_string(); //? 1
@@ -68,6 +70,7 @@ void run(routine rr) {
         cout << "not a primitive op: " << instructions[pc].operation << '\n';
       }
     }
+//?     trace("foo") << "3: " << pc << " " << &pc; //? 1
     ++pc;
   }
   Current_routine = NULL;