了解 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 标记为 $$$$$。
希望对您有所帮助。
我正在尝试了解 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 标记为 $$$$$。
希望对您有所帮助。