return
文が複数ある関数を作ったら、静的解析で次の警告が出て、直すのに困ったことがある。
MISRA-C:2004 Rule 14.7
関数では、関数の最後に唯一の出口がなくてはならない。
実際のコードを簡略化したのが、次のコード。
return 1
のところを直そうとすると、その下のmoreFunction(arg2)
が邪魔になって、ややこしくなりそう...。goto
文も使いたくないし...。
// 例:return文が4つある関数
int function(int arg1, int arg2){
int var = -1;
if(arg1 == 1){
var = someFunction(arg2);
if(var == 1){
return 1; // return文 (1つ)
}else if(var == 2){
arg2 += 2;
}
moreFunction(arg2);
return 4; // return文 (2つ)
}else if(arg2 == 2){
return 2; // return文 (3つ)
}
return 0; // return文 (4つ)
}
次のコードのように、全体をdo~while()
で囲めば、break
で最後のreturn
にジャンプ出来るので、簡単に直せるのではと思ったけど、レビューで怒られそうな気がしてやらなかった。
// 例:return文が4つあった関数
int function(int arg1, int arg2){
int var = -1;
int ret = 0; // 追加
do{ // 追加
if(arg1 == 1){
var = someFunction(arg2);
if (var == 1) {
ret = 1; // 修正
break; // 追加
}else if(var == 2){
arg2 += 2;
}
moreFunction(arg2);
ret = 4; // 修正
break; // 追加
}else if(arg2 == 2){
ret = 2; // 修正
break; // 追加
}
}while(0); // 追加
return ret; // return文 (4つ→1つ)
}
...が、数年後、別の仕事で全体をdo~while()
で囲んだコードに出会った!
同じことを考える人がいるのかと思ったけど、自分が知らないだけで、有名な方法なのかも。