阅读下列C 程序,回答问题1至问题3,将解答填入答题纸的对应栏内。
【C程序】
long long yajl_integer(const unsigned char *number,size_t length){ //1
long long ret=0;
long sign=1;
const unsigned char *pos=number;
if(*pos=='-'){ //2
pos++;sign=-1; //3
}
if(*pos=='+'){ //4
pos++; //5
}
while(pos<number+length){ //6
if(ret>MAX_VALUE_TO_MULTIPLY){ //7
errno=ERANGE;
return sign==1?LLONG_MAX:LLONG_MIN; //8
}
ret*=10;
if(LLONG_MAX-ret<(*pos-'0')){ //9
errno=ERANGE;
return sign==1?LLONG_MAX:LLONG_MIN; //10
}
if(*pos<'0'||*pos>'9'){ //11、12
errno=ERANGE;
return sign==1?LLONG_MAX:LLONG_MIN; //13
}
ret+=(*pos++-'0'); //14
}
return sign *ret; //15;
} //16
【问题1】
*pos == '_'
*pos != '_'
*pos == '+'
*pos != '+'
pos < number + length
pos >= number + length
ret > MAX_VALUE_TO_MULTIPLY
ret =< MAX_VALUE_TO_MULTIPLY
LLONG_MAX – ret < (*pos - '0')
LLONG_MAX – ret >= (*pos - '0')
*pos < '0' || *pos > '9'
*pos >= '0' && *pos<= '9'
【问题2】
V(g)=8
【问题3】
1:1、2、3、4、5、6、15、16
2:1、2、4、5、6、15、16
3:1、2、4、6、15、16
4:1、2、4、6、7、8、16
5:1、2、4、6、7、9、10、16
6:1、2、4、6、7、9、11、13、16
7:1、2、4、6、7、9、11、12、13、16
8:1、2、4、6、7、9、11、12、14、6、......
(或者与之等效的线性无关路径的组合)
【问题1】
判定测试:使得程序中的每个判定语句的取值都要被经历到。在本题中一共有6个判定:if(*pos == '_')
if(*pos == '+')
while(pos < number + length)
if(ret > MAX_VALUE_TO_MULTIPLY)
if(LLONG_MAX – ret < (*pos - '0'))
if(*pos < '0' || *pos > '9')
满足100%判定测试覆盖要求,需要使上述判定的结果为真、为假都至少出现1次。
由于RETURN语句已经返回了,其?表达式不列入考虑范围。
【问题2】
控制流图是描述程序控制流的一种图示方式,由节点(圈)和边(箭头)构成。控制流图的节点代表一个基本块,边代表控制流的方向。
控制流分析方法是通过生存程序的有向控制流图来对代码进行分析。
V(g)=边的数量-节点数量+2
V(g)=判断节点数+1
V(g)=封闭区域数+1
【问题3】
线性无关路径是指包含一组以前没有处理的语句或条件的路径。从控制流程图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。
在本题中线性无关路径组合不止一种组合,只有符合要求的路径组合即可。
1:1、2、3、4、5、6、15、16
2:1、2、4、5、6、15、16
3:1、2、4、6、15、16
4:1、2、4、6、7、8、16
5:1、2、4、6、7、9、10、16
6:1、2、4、6、7、9、11、13、16
7:1、2、4、6、7、9、11、12、13、16
8:1、2、4、6、7、9、11、12、14、6、......