e276.c
回らないwhileループ




修正前
while(1) {
ret = func1() ;
if( ret != OK ) {
break ;
}
ret = func2() ;
if( ret != OK ) {
break ;
}
~
~
ret = func10() ;
if( ret != OK ) {
break ;
}
break ;
}
if( ret != OK ) {
エラー処理 ;
return NG ;
}
正常処理 ;
return OK ;
修正案1 (資源を獲得していない時)
ret = func1() ;
if( ret != OK ) {
return ret ;
}
ret = func2() ;
if( ret != OK ) {
return ret ;
}
~
~
ret = func10() ;
if( ret != OK ) {
return ret ;
}
return OK ; /* 最後に正常処理の出口1つ */
修正案2 (資源を獲得している時)
p1 = malloc( 100 ) ;
if( p1 == NULL ) {
goto err ;
}
p2 = malloc( 200 ) ;
if( p2 == NULL ) {
goto err ;
}
p3 = malloc( 300 ) ;
if( p3 == NULL ) {
goto err ;
}
~
~
p10 = malloc( 1000 ) ;
if( p1 == NULL ) {
goto err ;
}
正常処理 ;
return OK ;
err : /* 資源解放処理 */
if( p1 ) free( p1 ) ;
if( p2 ) free( p2 ) ;
if( p3 ) free( p3 ) ;
~
~
if( p10 ) free( p10 ) ;
return NG ;