4

ANSI C でコマンド ライン プログラムを作成して、Quake 2 マップ ファイルを解析し、使用されているエンティティとテクスチャの数を報告しています。私の開発マシンは MacBook です。OS X Snow Leopard (32 ビット)、Windows XP (32 ビット) と Vista (64 ビット)、および Ubuntu 9.10 (32 ビット) でテストしています。

Vista でクラッシュしたバグがあり、プログラムが特定のマップ ファイルでハングしました。それがプログラムではなく、マップ ファイル自体であることがわかるまでにしばらく時間がかかりました。テキスト ファイルに異常はありませんでした。マップ ファイルを再度開いて保存すると、その問題が修正されました。

私のコードは、マップ ファイル全体をメモリに読み込み、strtok() を使用して「\n」を使用して行を区切り、各行を解析して、処理のためにデータを単一リンク リストに読み込みます。マップ (テキスト) ファイルが破損しているかどうかを検出する方法はありますか?

プログラミング以外の最も簡単な解決策は、問題と解決策を記載した FAQ ファイルを追加することです。

4

3 に答える 3

2

各行を読みながら解析して、それが有効かどうかを判断します。メソッドが失敗した場合は、データが破損していることをユーザーに通知するだけで済みますが、それでも正常に終了できます。

于 2010-02-24T06:24:29.603 に答える
0

パーサー生成ツールを使用すると、構文エラーを簡単に検出できます。

ただし、構文に問題がなくても、コンテンツに問題がある可能性があることを常に想定する必要があります。

たとえば、ファイル形式が次の場合:

  • n : エントリ数
  • エントリー1
  • エントリ 2
  • ...
  • 終了条件

コードは n サイズの配列を割り当てて、終了条件までエントリを配列に読み込むだけではいけません。代わりに、n 個のエントリが実際に読み取られたことを確認する必要があります (この場合、オーバーフローを避けるために n 個を超えるエントリを読み取らないでください)。

したがって、入力を盲目的に信頼しないようにコードを設計してください。

于 2010-02-24T07:32:12.827 に答える
0

バグを修正したと思います。そこにたどり着くまでにいくつかの手順を踏んだところ、テストはうまくいきました。

  • -Wconversion を GCC のデバッグ ミックスに追加しました。これにより、いくつかの有用な警告が報告されましたが、あまり有用ではない警告が報告されました。ほとんどの場合、unsigned を変数型に追加し、いくつかのマイナー (int) キャストを追加します。
  • 私のデータ構造は正しい型 (つまり unsigned long int) を持っていましたが、すべてを足し合わせた出力変数は間違った型 (つまり int) でした。すべての変数タイプを再チェックして、それらがすべて一致していることを確認しました。
  • エラーでプログラムを停止するために、ファイルのバイト サイズがゼロまたは負の場合のチェックを追加しました。
  • ファイルに使用可能なデータがないというメッセージを表示してプログラムを停止するために、データ リストにゼロ ノードがある場合 (つまり、解析で有効な一致が返されない場合) のチェックが追加されました。

今のところ、解析関数はそのままにしておきます。破損または壊れたマップ ファイルに有効な一致がある場合、その「データ」は最終的に出力されます。ガベージ イン/ガベージ アウト (GIGO) は依然として要因です。後で再訪するもの。私のプログラムのリリース版はここにあります。

于 2010-02-25T04:43:56.723 に答える