2012年6月10日日曜日

C言語のアンチパターン/ { } は必須

みなさん、こーゆうコーディングはマネしちゃだめですよ。 Part2

■C言語のアンチパターン/可変定数テーブルの作り方

ある日、デバッグ用プリント文をコメントアウトしていた時のお話。
不要なプリント文をコメントアウトしました。




■変更前
printf( "start\n" );
for( int i; i<10; i++)
    printf( "cnt[%d] ", i );
printf( "end\n" );
func( );

■変更後
//printf( "start\n" );
//for( int i; i<10; i++)
//    printf( "cnt[%d] ", i );
//printf( "end\n" );
func( );


で。
数日後、上記コードに修正が加えられていました。
この変更で、バグが発生したのです!!



■変更前
//printf( "start\n" );
//for( int i; i<10; i++)
//    printf( "cnt[%d] ", i );
//printf( "end\n" );
func( );

■変更後
//printf( "start\n" );
for( int i; i<10; i++)
//    printf( "cnt[%d] ", i );
//printf( "end\n" );
func( );


答え:「func( ) が10回コールされてしまう」

最初、理由が分からなくて、1時間近く悩んでしまった。
いくらデバッグ用プログラムだからって、せめて { } はつけましょう!と言いたい。
子一時間くらい説教したい。
せめてこうやって書いてくれれば、バグは未然に防げたはずなのに……。

printf( "start\n" );
for( int i; i<10; i++) {
    printf( "cnt[%d] ", i );

}
printf( "end\n" );
func( );


なんか、C言語の初歩のミスをしている様な気がする……。

0 件のコメント:

コメントを投稿