cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
ある簡単なCのプログラムを実行したときに表示されたエラーである。
サーチしても全然情報がなくて、試行錯誤の結果原因はわかった。恥ずかしいことだが、openしていないファイルに書き込もうとしたことが原因である。
しかし、私は釈然としない。たしかに私の初歩的なミスではあるが、その時にどうして上記のようなエラーが表示されるのか、と。何がprobably corrupted stackだよ、と。
作ったプログラムは、あるファイルを分割するものである。
分割条件は、">>"で始まり、"<<"で終わる。
ファイルを読んで、">>"が現れたら出力ファイルを開き、"<<"が現れるまで読み込んだ行を出力ファイルに書き込む。
そして、"<<"が現れたらファイルを閉じる、というループである。
私は、">>"が現れない場合を考慮していず、その場合は読み飛ばさなけれならないのにopenしていないファイルに出力していた。
とりあえず、出力ファイルのopen/close時にフラグをオン・オフして、フラグがONの時のみ書き込むようにした。
最初、フラグの名前を"WRITE"にしたらエラーが出た。予約語だなと思って"write_flg"としたら、またエラーが出た。これも予約語なのかなと"www"にしたらようやくコンパイルが通った。
もうひとつ懸案事項がある。
このプログラムでは、ある条件で現れるログ内の行の文字列をファイル名としている。その文字列の長さは不定であり、その文字列に拡張子".log"を連結している。
strncpy(s2,buf+3,strlen(buf)-4); s2[strlen(buf)-4]='\0'; printf("%s\n",s2); sprintf(s, "%s%s", s2, EXT); outputfile = fopen(s, "w");
このとき、strncpyで文字列をコピーしているのだが、開始位置が3で、文字列長は3+1=4である。この+1とは、改行コードのLFである。
">> ABC-1.2"+(LF)
という文字列から、
"ABC-1.2.log"
という文字列を作りたいのである。
一応これでうまくいっているのだが、改行コードがCR+LFになると、だめだ。そのときは、-5にしないといけない。これをどちらでも対応できるように、つまりCR+LFなら5,LFなら4とする方法はあるのか?