Please have a look the following codes, they include two source files (source.h, source.c), one test file (test_source.c) and one makefile file.
//source.h
1 #ifndef __SOURCE_H__
2 #define __SOURCE_H__
3
4 #include <stdio.h>
5
6 inline void inline_test()
7 {
8 printf("\nthis is the inline function.");
9 }
10
11 void normal_test();
12
13 #endif
//source.c
1 #include "source.h"
2
3 void normal_test()
4 {
5 printf("\nThis is a normal function.");
6 }
//test_source.c
1 #include "source.h"
2
3 void test_inline()
4 {
5 inline_test();
6 }
7
8 void test_normal()
9 {
10 normal_test();
11 }
12
13 int main()
14 {
15 test_inline();
16 test_normal();
17
18 return 0;
19 }
//makefile
1 TEST = test_source.o
2
3 TARGET = a.exe
4
5 all: $(TARGET)
6
7 $(TARGET):$(SOURCE) $(TEST)
8 gcc -Xlinker --allow-multiple-definition $^ -fprofile-arcs -ftest-coverage -o $(TARGET)
9
10 $(SOURCE): %.o:%.c
11 gcc -MM -MF $(subst .o,.d,$@) -MT "$@ $(subst .o,.d,$@)" $<
12 gcc -c $< -o $@ -fprofile-arcs -ftest-coverage
13
14 $(TEST): %.o:%.c
15 gcc -MM -MF $(subst .o,.d,$@) -MT "$@ $(subst .o,.d,$@)" $<
16 gcc -c $< -o $@
17
18 clean:
19 -rm -rf $(DIR_COVERAGE)
22 -rm -rf *.d *.o *.gcda *.gcno $(TARGET)
...
My purpose is that get the UT line coverage report of source files by running the test file. I guess I should get the below report of line coverage, because I have called every functions of source file in test file, include the inline function and the normal function.
But after run test file, I got the report is just 50%, the inline function has not been covered. Why? Why it is not be covered? I am sure it is called in test file.
OK, Calming down. If it is not covered, there are two reason, one is that the inline function is not be called, of course it is impossible, because we did it. So the root cause must be the second one that gcov/lcov tools do not process those lines of inline function. Have any idea? gcov/lcov tools process all files with compilation parameters '-fprofile-arcs -ftest-coverage', so let's check makefile file again.
Look here, source files have the compilation paraments, but why normal function has been coverage, but inline function not?
$(SOURCE): %.o:%.c
gcc -MM -MF $(subst .o,.d,$@) -MT "$@ $(subst .o,.d,$@)" $<
gcc -c $< -o $@ -fprofile-arcs -ftest-coverage
Thinking again, as we knew, the difference between inline function and normal function is just that inline function will be inserted source code while compiling period. Yes, the answer is here! While compiling, the inline function is put into test file, but the test file has not '-fprofile-arcs -ftest-coverage' paramenter. So, so it was not covered.
$(TEST): %.o:%.c
gcc -MM -MF $(subst .o,.d,$@) -MT "$@ $(subst .o,.d,$@)" $<
gcc -c $< -o $@
To fix it, just add the parameter to test file while compiling. OK, let's update the makefile file like the below line.
$(TEST): %.o:%.c
gcc -MM -MF $(subst .o,.d,$@) -MT "$@ $(subst .o,.d,$@)" $<
gcc -c $< -o $@ -fprofile-arcs -ftest-coverage
Done, enjoy it!