了解 gcov 文件中的块

Understanding blocks in gcov files

我正在尝试了解 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 行,或者知道有关其含义的任何详细文档,我将不胜感激。

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

希望对您有所帮助。