了解gcov文件中的块

问题描述 投票:0回答:1

我正在尝试理解gcov工具的输出。使用-a选项运行它是有道理的,并且想要了解块覆盖选项。不幸的是,很难理解块的作用以及它们不被采用的原因。以下是输出。

我在计算器程序中运行了一次添加功能。我不知道它为什么显示block0。

        -:    0:Source:calculator.c
        -:    0:Graph:calculator.gcno
        -:    0:Data:calculator.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include "calculator.h"
        -:    2:#include <stdio.h>
        -:    3:#include <stdlib.h>
        -:    4:
        1:    5:int main(int argc, char *argv[])
        1:    5-block  0
        -:    6:{
        -:    7:    int a,b, result;
        -:    8:    char opr;
        -:    9:
        1:   10:    if(argc!=4)
        1:   10-block  0
        -:   11:    {
    #####:   12:        printf("Invalid arguments...\n");
    $$$$$:   12-block  0
    #####:   13:        return -1;
        -:   14:    }
        -:   15:
        -:   16:    //get values
        1:   17:    a = atoi(argv[1]);
        1:   18:    b = atoi(argv[3]);
        -:   19:
        -:   20:    //get operator
        1:   21:    opr=argv[2][0];
        -:   22:
        -:   23:    //calculate according to operator
        1:   24:    switch(opr)
        1:   24-block  0
        -:   25:    {
        1:   26:        case '+':
        1:   27:            result = add_(a, b);
        1:   27-block  0
        -:   28:
        1:   29:            break;
    #####:   30:        case '-':
    #####:   31:            result=sub_(a,b);
    $$$$$:   31-block  0
    #####:   32:            break;
    #####:   33:        case '_':
    #####:   34:            result=multiply_(a,b);
    $$$$$:   34-block  0
    #####:   35:            break;
    #####:   36:        case '/':
    #####:   37:            result = div_(a,b);
    $$$$$:   37-block  0
    #####:   38:        default:
    #####:   39:            result=0;
    #####:   40:            break;
    $$$$$:   40-block  0
        -:   41:    }
        -:   42:
        1:   43:    if(opr=='+' || opr=='-' || opr=='_'|| opr== '/')
        1:   43-block  0
    $$$$$:   43-block  1
    $$$$$:   43-block  2
    $$$$$:   43-block  3
        1:   44:        printf("Result: %d %c %d = %d\n",a,opr,b,result);
        1:   44-block  0
        -:   45:    else
    #####:   46:        printf("Undefined Operator...\n");
    $$$$$:   46-block  0
        -:   47:
        1:   48:    return 0;
        1:   48-block  0
        -:   49:}
        -:   50:
        -:   51:/**
        -:   52: * Function to add two numbers
        -:   53: */
        1:   54:float add_(float num1, float num2)
        1:   54-block  0
        -:   55:{
        1:   56:    return num1 + num2;
        1:   56-block  0
        -:   57:}
        -:   58:
        -:   59:/**
        -:   60: * Function to subtract two numbers
        -:   61: */
    #####:   62:float sub_(float num1, float num2)
    $$$$$:   62-block  0
        -:   63:{
    #####:   64:    return num1 - num2;
    $$$$$:   64-block  0
        -:   65:}
        -:   66:
        -:   67:/**
        -:   68: * Function to multiply two numbers
        -:   69: */
    #####:   70:float multiply_(float num1, float num2)
    $$$$$:   70-block  0
        -:   71:{
    #####:   72:    return num1 * num2;
    $$$$$:   72-block  0
        -:   73:}
        -:   74:
        -:   75:/**
        -:   76: * Function to divide two numbers
        -:   77: */
    #####:   78:float div_(float num1, float num2)
    $$$$$:   78-block  0
        -:   79:{
    #####:   80:    return num1 / num2;
    $$$$$:   80-block  0
        -:   81:}

如果有人知道如何破译块信息,特别是第5,12,13,43,64行,或者知道任何有关这一切的详细文档,我会很感激帮助。

gcc code-coverage gcov lcov
1个回答
0
投票

每个块都由一行标记,该行具有与块的最后一行相同的行号以及块中的分支和调用的数量。使用一对花括号({})创建一个块。第5行标记主程序段的开头...然后正如我提到的每个分支或函数调用程序段号都被提到...现在你的if语句有四个条件,这意味着将有4个额外的块被标记为0,1 ,2,3。所有未执行的块都标记为$$$$$,这里为真,因为你必须通过'+'作为参数,所以程序永远不会采用其他运算符的路径,因此块1 ,2,3被标记为$$$$$。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.