• <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 閱讀(2861) 評論(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++

            導航

            統(tǒng)計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品一区二区久久国产| 91久久香蕉国产熟女线看| 色综合久久夜色精品国产| 久久久久久久91精品免费观看| 中文字幕亚洲综合久久菠萝蜜| 久久午夜伦鲁片免费无码| 97久久精品人人做人人爽| 模特私拍国产精品久久| 国产成人精品久久一区二区三区| 精品久久久久中文字幕一区| 午夜精品久久久久久中宇| 超级碰久久免费公开视频| 国内精品久久久久久久久电影网| 国产Av激情久久无码天堂| 色综合久久夜色精品国产| 亚洲国产精品久久久久婷婷软件 | 久久se精品一区二区影院| 久久国产劲爆AV内射—百度| 狠狠人妻久久久久久综合| 久久人人爽人人爽人人片AV不 | 中文字幕精品久久久久人妻| 久久婷婷激情综合色综合俺也去| 中文字幕精品久久久久人妻| 国产精品伊人久久伊人电影| 久久ZYZ资源站无码中文动漫| 日本亚洲色大成网站WWW久久 | 欧美久久天天综合香蕉伊| 久久亚洲美女精品国产精品| 久久99这里只有精品国产| 久久九色综合九色99伊人| 日本精品久久久久中文字幕8 | 7777精品伊人久久久大香线蕉| 热久久国产精品| 久久亚洲国产中v天仙www| 精品国产福利久久久| 欧美777精品久久久久网| 国产V亚洲V天堂无码久久久| 97久久超碰国产精品旧版| 国内精品伊人久久久久| 日韩一区二区久久久久久| yellow中文字幕久久网|