#概要
athrill(アスリル)の問題早期検出機能について解説します.
#問題早期検出機能
athrillはV850のCPU命令をシミュレーションしており,プリミティブなレベル(CPU/メモリ/デバイス)で,ソフトウェアの動きを監視できます.そのため,仮想環境の強みを活かした問題の早期検出ができると考えています.現状は,メモリ不正アクセス検出機能が数個ある程度ですが,機能拡張を実施予定です.
##警告通知機能
本機能は,athrillが異常があると思われるコードを実行した場合に警告表示する機能です.
###未初期化変数のREADアクセス
以下は,グローバル変数 gl_variable が未初期化のまま main関数で値参照しようとしたプログラムコードです.
static int gl_variable __attribute__ ((section(".bss_noclr")));
:
int main(void)
{
if (gl_variable == 0) {
timer_init();
}
:
}
これを,athrillが実行すると,以下の警告メッセージを出力します.
WARNING: Unitialized data read : variable=>gl_variable : main()@stack_data
###変数領域外のWRITEアクセス
以下は,グローバル変数 gl_variable が2バイトなのに,main関数で4バイト初期化しようとしたプログラムコードです.
static short gl_variable __attribute__ ((section(".bss_noclr")));
:
int main(void)
{
memset(&gl_variable, 0, 4);
:
}
これを,athrillが実行すると,以下の警告メッセージを出力します.
WARNING: Found invalid data write on not variable region(addr=0x6ff748a size=1) : memset(0xcfe)@stack_data
WARNING: Found invalid data write on not variable region(addr=0x6ff748b size=1) : memset(0xcfe)@stack_data
##エラー通知機能
本機能は,athrillが明らかな異常と判断したコードを実行した場合に,CPUを停止する機能です.
###ROM領域へのWRITEアクセス
以下は,ポインタの値が0x0(ROM領域)であるにもかかわらず,誤ってROM領域に値を書き込みしてしまったプログラムコードです.
static int *gl_pointer;
:
int main(void)
{
*gl_pointer = 10;
:
}
これを,athrillが実行すると,以下のエラーメッセージを出力し,強制停止ます.
mpu_put_data32:error: can not write data on ROM :addr=0x0 data=10
Exec Error code[0]=0x5f6a code[1]=0x1 type_id=0x6
CPU(pc=0xc34) Exception!!
###スタックオーバーフロー検出
以下は,main関数内で巨大なサイズのローカル変数を定義してしまっているプログラムコードです.
組込みエンジニアであれば簡単に気づけるコードですが,関数呼び出しが深いとなかなか気づきにくく,
問題が発生した場合,メモリ破壊が発生してしまいますので大変解析が難しいバグです.
int main(void)
{
int local_variable[1000];
:
}
これを,athrillが実行すると,以下のエラーメッセージを出力し,強制停止ます.
ERROR: Found invalid data write over stack(addr=0x6ff64e8 size=4000) : main(0xc24)@unknown_stack
ERROR: found stack overflow
Exec Error code[0]=0xef63 code[1]=0xfa1 type_id=0x6
CPU(pc=0xc24) Exception!!
athrillは,ストア命令を実行する場合,スタック用レジスタ(sp)を監視しています.
TOPPERS OSの場合,各タスクおよびカーネルのタスクはすべてグローバル変数(配列)化されていますので,スタック用レジスタ(sp)が領域外にいるかどうかは簡単に判断できるため,エラー検出機構として導入しました.
※TOPPERS OS実装が優れているために,こういう機構を簡単に導入できました.