mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

cutterを使ってみた(けど動かなかった) (Solaris(x64)、Sun Studio12)

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$

コンパイラの問題じゃなくて、自分のインストール時の手順の問題のような気がしてきた。。
後で手順見なおそう。