ISSでインタラクティブにいろいろデバッグをすることができるようになってきたので、タイプミスによりLuaのコマンドを打ち間違えたときにセグって落ちてしまうのが気になってきた。
よく見てみたら、引数の処理をするのにLuaのスタックにどの程度引数が入っているのかを考慮せずに、引数取り出しをやっていた。 引数の数が2であることを想定する関数なら、最初にそれをチェックして、セグって落ちてしまうことを防ごう。
引数の数の取得の場合は、Luaの場合はスタックの数で判定する。
if (lua_gettop(L) != 1) { std::cerr << "Failed to make_core ()\n"; std::cerr << "Usage : make_core (arch_name)\n"; return 0; }
ついでに、コアオブジェクトに作り間違えがあったときの対応を入れておこう。 ISSでは、まずCPUオブジェクトを作成し、それに対して処理を実行するという手順を踏むが、CPUオブジェクトを作成しなかったり、不正なCPUオブジェクトを指定すると、失敗あるいはセグって落ちてしまう。
-- 正しい動作 core = make_core("mips") run (core) -- 不正な変数 core = 1 run (core) -- CPUオブジェクトを作成しない run (core)
これも、static_cast()で変換できるかどうかにかかっているので、この判定処理も追加しておいた。
#ifdef ARCH_MIPS MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1)); @@ -150,6 +161,10 @@ int Lua_SetPC (lua_State *L) RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1)); #endif // ARCH_RISCV #endif // ARCH_MIPS if (env == NULL) { std::cerr << "Unknown core\n"; return 0; }
これで、ISSが途中でセグって落ちること無くなったかな。