//を使用した行コメントに\を入れると発生するバグ
S9fES完成後にいろいろ動かしていたのですが
s9fes> (newline)を実行すると改行されず、
pとだけ出力されるバグに遭遇しました。他の文字もランダムにまったく別な文字に置き換わってしまいます。
読み込み部か出力部に問題がありそうだったのですが、コードに間違いは見つからずどうしようかと思ってたところある個所に入れた行コメントの\(バックスラッシュ)が右のほうに移動していたので(emacsの自動インデントによる)なんか気持ち悪くて消したら前述のバグが直りました。
問題の部分のコードはこんな感じ。
int print_char ( int n ) { // 文字を出力
char b [2];
int c ;
if (Car[n] != S_char) return 0; // 型チェック
if (!Displaying) pr( "#\\" ); // #\
c = cadr(n); // c:文字の値
if (!Displaying && c == ' ' ) {
pr( "space" ); // 空白
}
else if (!Displaying && c == '\n' ) {
pr( "newline" ); // 改行
}
else {
b[1] = 0; // null文字
b[0] = c; // 文字の値
pr(b); // 出力
}
return -1;
}
それで、
if
(!Displaying) pr( "#\\"
); //
#\
の //
#\
を削除してみたらバグが直ったわけです。行コメント内の\の扱い
通常\(バックスラッシュ)をC言語のプログラム中に書き込むと継続行となり、\の後に改行して書いたコードが\を入れた行のコードと1行でつながっているとみなされます。
この機能が行コメント内でも発揮されていたわけです。つまり
if
(!Displaying) pr( "#\\"
); //
#\
に続く、c = cadr(n); //
c:文字の値
がコンパイル時に丸ごとコメントアウトされてました。実際、
c = cadr(n); //
c:文字の値
をコメントアウトするとバグを再現できます。コメントの中って何を書いてもいいと思ってましたがこんなバグが出るとは、、
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)
新品価格
¥2,700 から
(2017/3/7 23:27時点)
新品価格
¥2,376 から
(2017/3/7 23:28時点)
【このカテゴリーの最新記事】