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

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产精品波多野结衣AV | 久久国产成人精品麻豆| 久久久精品国产| 久久丫精品国产亚洲av不卡| 狠狠88综合久久久久综合网| 国产69精品久久久久99尤物| 久久毛片一区二区| 嫩草影院久久国产精品| 亚洲一区精品伊人久久伊人| 99久久精品费精品国产一区二区| 51久久夜色精品国产| 久久人人爽人人人人爽AV| 9191精品国产免费久久| 国产成人无码精品久久久性色| 青青青青久久精品国产| 日本久久久久亚洲中字幕| 国内精品久久久久久中文字幕| 五月丁香综合激情六月久久| 久久se精品一区精品二区国产| 久久久久亚洲av无码专区导航 | 综合久久一区二区三区 | 久久久久九国产精品| 99精品久久久久久久婷婷| 久久夜色精品国产www| 精品久久久久久久无码| 亚洲va久久久噜噜噜久久男同| 精品国产乱码久久久久久浪潮 | 国产成人精品综合久久久| 亚洲午夜无码久久久久| 婷婷综合久久中文字幕蜜桃三电影| 久久精品国产欧美日韩| 亚洲国产精品一区二区久久| 国产欧美久久久精品| 久久免费线看线看| 久久国产乱子精品免费女| 一本久久a久久精品综合夜夜| 久久精品人人做人人爽电影蜜月| 亚洲综合伊人久久大杳蕉| 狠狠色综合网站久久久久久久高清| 色综合久久夜色精品国产| 久久播电影网|