Frama-C でお気軽に ruby 1.9 の string.c の callee を調べる
まず configure して、./.ext/include/arch-name にヘッダファイルを作る。
なぜか Frama-C は、マクロ TRUE と FALSE がわからんというので、./.ext/include/arch-name/ruby/define.h に次の行を追加(以下 arch-name は適当に読み替えること):
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
つぎに、解析コマンドを起動する:
% frama-c -cpp-command 'gcc -E -I. -Iinclude -I./.ext/include/arch-name' \
-users -main sym_encoding encoding.c re.c regenc.c string.c 【前略】 [users] ====== DISPLAYING USERS ====== rb_enc_get_index: rb_id2str enc_table_expand: realloc memset enc_register_at: st_insert st_strcasecmp ruby_strdup ruby_xmalloc strlen rb_enc_init: st_init_strcasetable st_insert st_strcasecmp ruby_strdup ruby_xmalloc realloc memset strlen enc_table_expand enc_register_at rb_enc_from_index: st_init_strcasetable st_insert st_strcasecmp ruby_strdup rb_enc_init ruby_xmalloc realloc memset strlen enc_table_expand enc_register_at rb_enc_get: st_init_strcasetable st_insert st_strcasecmp ruby_strdup rb_enc_init ruby_xmalloc realloc memset strlen rb_id2str rb_enc_get_index rb_enc_from_index enc_table_expand enc_register_at rb_obj_encoding: st_init_strcasetable st_insert st_strcasecmp ruby_strdup rb_enc_init ruby_xmalloc realloc memset strlen rb_id2str rb_raise rb_enc_get_index rb_enc_get rb_enc_from_index enc_table_expand enc_register_at sym_encoding: st_init_strcasetable st_insert st_strcasecmp ruby_strdup rb_enc_init ruby_xmalloc realloc memset strlen rb_id2str rb_raise rb_enc_get_index rb_enc_get rb_obj_encoding rb_enc_from_index enc_table_expand enc_register_at ====== END OF USERS ==========
これで、メソッド encoding こと sym_encoding が呼んでいる関数がすべて(?)列挙される。これで嬉しい人いますかね?
Frama-C は compile.c の解析で内部エラーを起こすので、すべての C コードを渡すことができなかった。この問題の回避方法を探すのが次の課題。