ソースからコメントを削除する3
こんな簡単なプログラムでもバグがあったので修正。
- バグ内容:C形式のコメント「/* */」で、終わりに「**/」と、アスタが複数続いた場合に、コメントが終了したとみなされない。
- バグ原因:C形式のコメントの中に「*」が連続して出て来た時に、「次でコメント終了するかも」ステータスから、「まだコメントの中だよ」ステータスに遷移していた。正しくは、引き続き「次でコメント終了するかも」ステータスに遷移しなければならない。
- 類似バグ調査/今後の対策:状態遷移表を作成して、全ステータス、全イベントの調査が必要
そんなわけで、「次でコメント終了するかも」ステータスにおける処理を修正しました。といっても、この処理の関数版をこのブログに載せるのはこれが初めてですね。
static int cmt_semi_end(int char0, FILE* p_out){
int next_state = ST_ERROR;if(char0 == EOF){
return next_state;
}switch(char0){
case '/':
next_state = NON_CMT;
break;
case '*':
next_state = CMT_SEMI_END;
break;
default:
next_state = C_CMT;
break;
}return next_state;
}
追記:この関数に限ったことではありませんが、文字列や文字として「/」があった場合の処理が抜けています。バグです。設計面での改善として、状態遷移表を作成した方がよさそうです。実装面での改善として、状態遷移表を落とし込んだテーブル駆動形式にしようと思います。
状態遷移表のイメージ。縦軸-状態。横軸-入力文字。各項目-(入力文字を出力|'/'+入力文字を出力|出力しない)
| 固定リンク
この記事へのコメントは終了しました。


コメント