Solaris(x64)、Sun Studio12環境でcutterを動かしてみたのでそのメモ。
インストはこちら。
cutterは、テストコードとテスト対象コードのオブジェクトを共有ライブラリに固めて、その共有ファイルを対象に試験する。
サンプルとしてこんなコードを用意。
テストコード(test/test_target.c)
#include "target.h" #include <cutter.h> void test_getString() { int ret; const char* in = "input-string"; char out[128]; ret = getString(in, out); cut_assert_equal_int( RETURN_VAL, ret, "return-value" ); cut_assert_equal_string( "input-string-out", out, "out" ); }
テスト対象コード
失敗するようにしてる
- src/target.c - #include <stdio.h> #include "target.h" int getString(const char* in, char* out) { return RETURN_VAL; } - src/target.h - #define RETURN_VAL 1 int getString(const char* in, char* out);
コンパイルと実行
64ビットで共有ライブラリにするので、コンパイルオプションに-Kpicと-G付けてる。
実行時は、共有ライブラリ置いてあるディレクトリを指定する。共有ライブラリのファイル名は何でもいいっぽい。共有ライブラリの中の、「test_」から始まる名前のメソッドをテストメソッドとして順次実行する模様。
bash-3.2$ export PATH=/opt/solarisstudio12.3/bin:/usr/local/bin:$PATH bash-3.2$ cc -c -m64 -Kpic -G -o obj/target.o -Isrc src/target.c bash-3.2$ cc -c -m64 -Kpic -G -o obj/test_target.o -Isrc -I/usr/local/include/cutter test/test_target.c bash-3.2$ cc -o lib/test_target.so obj/*.o -shared -m64 bash-3.2$ cutter lib F =============================================================================== Failure: test_getString <"input-string-out" == out> expected: <"input-string-out"> actual: <"dummy"> diff: ? "input-string-out" ? d mmy test/test_target.c:12: test_getString(): cut_assert_equal_string("input-string-out", out, "out-parameter") =============================================================================== Finished in 0.001421 seconds (total: 0.001021 seconds) 1 test(s), 1 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s) 0% passed bash-3.2$
こんな感じに、NGになったテストの行番号と、比較したデータが表示される。
diff:の後の"dummy"の中間2文字が消えてるのは、実際こんなふうに表示された。何回かやったけど同じ結果。
原因はよく分からない。
テスト通るように修正
bash-3.2$ cat src/target.c #include <stdio.h> #include "target.h" int getString(const char* in, char* out) { sprintf("%s-out", out, in); return RETURN_VAL; }
コンパイルと実行
bash-3.2$ cc -c -m64 -Kpic -G -o obj/target.o -Isrc src/target.c bash-3.2$ cc -o lib/test_target.so obj/*.o -shared -m64 bash-3.2$ cutter lib ! =============================================================================== Crash: test_getString =============================================================================== Finished in 1.005382 seconds (total: 1.004879 seconds) 1 test(s), 0 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s) 0% passed
うまくいくかと思いきや、Crash??
コード的にSEGVとか発生するようなプログラムではないし、Sun Studioとcutterの相性かなぁ。。
Sun Studio11でも試そうとしたら、テストコードのコンパイルが通らなかった。
bash-3.2$ /opt/SUNWspro/bin/cc -c -xtarget=generic64 -Kpic -G -o obj/test_target.o -Isrc -I/usr/local/include/cutter test/test_target.c "test/test_target.c", 6 行目: 未定義のシンボル: __FUNCTION__ "test/test_target.c", 6 行目: 警告: ポインタ/整数の組み合わせは不適切です: 5 番目の引数 "test/test_target.c", 17 行目: 未定義のシンボル: __FUNCTION__ "test/test_target.c", 17 行目: 警告: ポインタ/整数の組み合わせは不適切です: 5 番目の引数 "test/test_target.c", 18 行目: 未定義のシンボル: __FUNCTION__ "test/test_target.c", 18 行目: 警告: ポインタ/整数の組み合わせは不適切です: 5 番目の引数 cc: test/test_target.c に対して、acomp が失敗しました。
というわけで失敗。
gccでも試してみたが、同じ結果。
bash-3.2$ gcc -c -o obj_gcc/target.o -Isrc src/target.c -shared -fPIC -m64 bash-3.2$ gcc -c -o obj_gcc/test_target.o -Isrc -I/usr/local/include/cutter test/test_target.c -shared -fPIC -m64 bash-3.2$ gcc -shared -fPIC -o lib_gcc/test_target.so obj_gcc/*.o -m64 bash-3.2$ cutter lib_gcc ! =============================================================================== Crash: test_getString =============================================================================== Finished in 1.005654 seconds (total: 1.005090 seconds) 1 test(s), 0 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s) 0% passed bash-3.2$
コンパイラの問題じゃなくて、自分のインストール時の手順の問題のような気がしてきた。。
後で手順見なおそう。