-1

予期しない動作に苦しんでいます。問題の定義は次のとおりです。

UDP プロトコルを介して LAN 上で通信するアプリケーションがあります。テキスト ファイルから IP アドレスとポート番号を読み取っています。最初は IP アドレスとポート番号は正常に機能していますが、しばらくすると、char 配列に格納されている IP アドレスが破損し、ガベージ値が取得されます。また、ファイルの書き込みもこれに影響されます。つまり、IP 配列にある値は、同じアプリケーションによって書き込まれるテキスト ファイルにも書き込まれます。何が問題なのか理解できません - 助けてもらえますか?

4

4 に答える 4

7

これはほぼ確実に、バッファ オーバーフローが発生していることを意味します。スタック オーバーフローの可能性さえあります。おそらく、小さすぎるバイト配列に読み込んでいるバイト数が多すぎて、割り当てられたスペースの最後を超えて実行され、他のデータ (IP アドレスなど) が踏みにじられている可能性があります。

Linux を使用している場合は、valgrindを使用して問題を診断することを検討してください。

于 2010-06-08T06:51:27.927 に答える
7

これはおそらく、一部の配列の境界外にアクセスしたことが原因です。初期化されていないポインターの問題である可能性もあります。

Linux を使用している場合は、プログラムをvalgrindで実行してみてください。すべての配列が十分な大きさであることを確認してください。assert()s を追加して、配列インデックスが問題ないことを確認することを検討してください。

于 2010-06-08T06:51:37.990 に答える
0

memcpy() を使用してデータをコピーしている場合は、正しいサイズ パラメータを使用しているかどうかを確認するか、strcpy() を使用している場合は、null で終了する文字列を strcpy() に渡していることを確認してください。 memcpy のサイズが正しくないか、null を含まない文字列strcpy() に渡される最後の char は、これらの関数が目的のバッファの意図された境界を超えて書き込み、メモリの破損を引き起こします。終了条件が正しくないループなど、他の原因が考えられます。確認できるように、ここにコードを貼り付けてください。

于 2010-06-08T08:08:47.063 に答える
0

他の誰もがここで言及したように、Linux/UNIX でデバッガーも同時に使用している場合は、valgrind を使用してください。次のコマンドで実行してみてください:

valgrind --db-attach=yes --db-command=</path/to/gdb -nw %f %p>

エラーが最初に発生すると、valgrind が停止し、デバッガーをアタッチするように求められます。

通常の容疑者のカップル:

  1. 固定サイズの配列を使用しているかどうかを確認してください。char buf[128]; のようなもの。かわいく見えるかもしれませんが、リスのぬいぐるみよりも悪いです
  2. gets() および puts() システム コールは使用しないでください。

STL 文字列またはクロップを使用してみてください。

于 2010-06-08T09:04:14.580 に答える