• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            Why the inline function can not be covered?


            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!

            posted on 2012-09-21 17:45 codejie 閱讀(2846) 評論(2)  編輯 收藏 引用 所屬分類: C++隨筆而已

            評論

            # re: Why the inline function can not be coveraged? 2012-09-26 19:35 smagle

            gcov原理分析詳細可參考:http://sdet.org/?p=212  回復  更多評論   

            # re: Why the inline function can not be coveraged?[未登錄] 2012-09-26 22:16 codejie

            @smagle
            very great article. thanks!  回復  更多評論   

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产99久久久香蕉| 久久这里只有精品18| 色综合久久久久| 久久e热在这里只有国产中文精品99| 99久久99久久精品国产| 成人午夜精品久久久久久久小说| 久久精品国产黑森林| 亚洲愉拍99热成人精品热久久| 无码精品久久久天天影视| 99国产精品久久| 久久影院亚洲一区| 久久精品国产精品亚洲毛片| 久久久久久综合一区中文字幕 | 欧美久久久久久午夜精品| 亚洲精品视频久久久| 69久久精品无码一区二区| 亚洲午夜精品久久久久久浪潮 | 久久精品九九亚洲精品| 伊人久久大香线蕉精品| 99精品久久久久久久婷婷| 国产精品久久久99| 欧美精品一本久久男人的天堂| 久久久国产打桩机| 久久五月精品中文字幕| 99久久中文字幕| 亚洲中文字幕无码久久综合网| 一级做a爰片久久毛片看看 | 国内精品伊人久久久久妇| 国产一区二区精品久久凹凸| 国产亚洲美女精品久久久久狼| 麻豆AV一区二区三区久久 | 国产精品久久一区二区三区| 国产精品成人久久久| 日本精品一区二区久久久| 国产女人aaa级久久久级| 久久99国产精一区二区三区| 久久久精品人妻一区二区三区蜜桃| 国产毛片欧美毛片久久久| 波多野结衣AV无码久久一区| 久久久亚洲精品蜜桃臀| 老色鬼久久亚洲AV综合|