Open1

テスト駆動開発による組み込みプログラミング―C言語とオブジェクト指向で学ぶアジャイルな設計 (O'Reilly Japan)を試してみる

桃芭蕉実🍑🍌桃芭蕉実🍑🍌

テスト駆動開発による組み込みプログラミング―C言語とオブジェクト指向で学ぶアジャイルな設計 O'Reilly Japan

2.7 練習問題

  • 「code ディレクトリで make -f MakefileCppUTest.mk を実行しよう。これで CppUTest を
    使った sprintf() のテストがビルドされる」
    下記のようにエラーになる
root@af4dfaf4b02d:/work/sample-code# make -f MakefileCppUTest.mk
compiling MockIOTest.cpp
compiling FakeMicroTimeTest.cpp
compiling FormatOutputSpyTest.cpp
compiling RuntimeErrorStub.c
compiling MockIO.c
compiling FakeMicroTime.c
compiling FormatOutputSpy.c
compiling LedDriverTest.cpp
compiling SprintfTest.cpp
compiling CircularBufferPrintTest.cpp
compiling CircularBufferTest.cpp
compiling FlashTest.cpp
compiling LegacyFlashTest.cpp
compiling RtcTimeTest.cpp
compiling FakeTimeServiceTest.cpp
compiling LightControllerSpyTest.cpp
compiling LightSchedulerTest.cpp
compiling FakeTimeService.c
tests/HomeAutomation/FakeTimeService.c: In function 'FakeTimeService_MinuteIsUp':
tests/HomeAutomation/FakeTimeService.c:48:5: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
   48 |     if (callback != NULL);
      |     ^~
tests/HomeAutomation/FakeTimeService.c:49:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   49 |         callback();
      |         ^~~~~~~~
cc1: all warnings being treated as errors
make: *** [/work/cpputest/build/MakefileWorker.mk:550: objs/tests/HomeAutomation/FakeTimeService.o] Error 1
root@af4dfaf4b02d:/work/sample-code#

上記のとおり、if (式) ;となって次の行にcallback();となっている部分が(C言語文法的には正しいが)gccではエラーとなる。エラーになってしまうと、テストコードが実行できなくなってしまうので、エラーとならないように(ワーニングになるように)、makeファイルを書き換える。
具体的には、MakefileCppUTest.mkの53行目

CPPUTEST_WARNINGFLAGS = -Wall -Wswitch-default -Werror 

にある、-Werrorを削除して、

CPPUTEST_WARNINGFLAGS = -Wall -Wswitch-default

にする。再度、makeを実行。


(略)

compiling FakeTimeService.c
tests/HomeAutomation/FakeTimeService.c: In function 'FakeTimeService_MinuteIsUp':
tests/HomeAutomation/FakeTimeService.c:48:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   48 |     if (callback != NULL);
      |     ^~
tests/HomeAutomation/FakeTimeService.c:49:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   49 |         callback();
      |

(略)

Running BookCode_CppUTest_tests
..................................................
..............................................!...
...........................
OK (127 tests, 126 ran, 525 checks, 1 ignored, 0 filtered out, 3 ms)

root@33d5e71585ec:/work/sample-code#

となり、途中、ワーニングが出ているが、実行された。