LoginSignup
8
10

More than 5 years have passed since last update.

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

Posted at

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

ソース

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10