C言語のスタブ生成ツールを作ってみた

More than 5 years have passed since last update.

C言語のレガシーコードに対してテストを追加するときに、大量のスタブを作るのが面倒だったので、自動生成するツールを作ってみました。


インストール

$ gem install cstub


使い方

例として次のようなコードのスタブを作ります。


my_dependency.h

typedef int MY_INT;

typedef enum {
ERROR_NONE,
ERROR_PARAMETER,
} ERROR_CODE;

extern int depend_function(int);
extern MY_INT depend_function2(volatile unsigned int a, int b, int c);
extern ERROR_CODE depend_function3(int);



my_product_code.c

#include "my_dependency.h"


ERROR_CODE hello(int a)
{
int b = depend_function(a);
MY_INT c = depend_function2(b, 1, 2);
return depend_function3(c);
}

my_product_code.cのリンクが通るようにするには、depend_function()depend_function2()depend_function3()のスタブが必要です。

これを確かめるには一旦コンパイル&リンクしてnmで確かめるのが早いでしょう。

$ arm-none-eabi-gcc -c my_product_code.c -o my_product_code.o

$ arm-none-eabi-nm -u my_product_code.o > filter.txt
$ cat filter.txt
U depend_function
U depend_function2
U depend_function3

my_product_code.cfilter.txtを元にスタブを生成することができます。

$ cstub my_product_code.c --filter filter.txt --cpp "arm-none-eabi-gcc -P -E" -D__extension__

int depend_function(int par0)
{
return 0;
}
MY_INT depend_function2(volatile unsigned int a, int b, int c)
{
return 0;
}
ERROR_CODE depend_function3(int par0)
{
return ERROR_NONE;
}


注意点

コンパイラの拡張でparseが失敗することがあるので、その場合は拡張を無効にするようなマクロを定義してやってください。上の例だと"-D__extension__"がそれに当たります。


その他

C言語のモックフレームワークはいろいろありますが、単に空処理の関数が欲しい時は、こういうので十分かと思いました。


ソース

https://github.com/kunigaku/cstub