2011-08-15 5 views
2

lexパーサーが記述されたセグメンテーション障害の問題が発生しました。したがって、プログラムをビルドするときにデバッグスイッチ-dをMakefileに追加しました。 これは私がそれから得る出力です。自動的に私のハンドコードlexのファイルから生成されたCファイルである1324:私は、デバッグツールを介してこれを実行すると Lexパーサー:(バッファの終わりまたはNUL)segfault

--accepting rule at line 180 ("bxz") 
--accepting rule at line 61 (" ") 
--accepting rule at line 180 ("e") 
--accepting rule at line 68 (" 
") 
--accepting rule at line 180 ("0L") 
--accepting rule at line 193 ("!") 
--accepting rule at line 68 (" 
") 
--accepting rule at line 180 ("0x") 
--accepting rule at line 193 (""") 
--accepting rule at line 68 (" 
") 
--(end of buffer or a NUL) 
Segmentation fault 

は、私はエラーがlex.yy.cをでyy_get_next_buffer()で発生することがわかりました。この問題を解決するにはどうすればよいですか? ありがとうございます。

+2

バグがlexコード。したがって、バッファの終わりを書き留めたり、メモリを誤って乱用したりしているように見えます。 Valgrindはメモリエラーの発見に役立ちます。 –

+0

最後のトークンストリングの後に改行を入れてください。あなたのパーサーは、最後の記号の後にいくつかの終了文字を見つけようとしているかもしれません。 –

+1

おそらく、配列の末尾などを書き去って、Flexの内部バッファポインタを何らかの形で破損している可能性があります。クラッシュするレックスコードを見ると、不正なデータを持つデータ構造にデータブレークポイントを設定し、誰がそれを変更しているのかを把握できる場合があります –

答えて

0

(。。私はhowever it timed-out/aged away、 "再現性のない" として、このフラグを立てIt has been answered in the comments

@LokiAstariは書いた:

をバグがlexのコードであることはほとんどありません。したがって、バッファの終わりを書き留めたり、メモリを誤って乱用したりしているように見えます。 Valgrindのは、メモリエラーに

を見つけるのに役立つかもしれ@AKは書いた:

を最後tokenstring後に改行を入れてみてください。あなたのパーサーは、最後の記号の後にいくつかの終了文字を見つけようとしているかもしれません。

@ChrisDoddは書いた:

をあなたはおそらく配列またはそのようないくつかの終わりをオフに書き込むことで、何とかフレックスの内部バッファポインタを破損しました。クラッシュするレックスコードを見ると、不正なデータを持つデータ構造にデータブレークポイントを設定し、誰がそれを変更しているのかを把握できる可能性があります。

関連する問題