私は最近、カスタム シリアル通信プロトコルのコードを書いていました。私がしたことは、受信データの一部 (8/16 ビット) を使用して、フレーム サイズの大きさを示すことでした。このデータに基づいて、次のデータはないと予想しています。Crc を使用してフレームを承認または拒否します。しかし、受信側では、フレームを処理する前に、予想されるデータ量を知る必要があるため、Crc にフレーム長データを含めることはできません。
私が直面した問題は、このフレーム長のデータが破損し、受信側の配列サイズがそれよりもはるかに小さいのに対し、受信側がそのバイト数を受信するようにだますことです。これにより、連続したメモリ位置に存在する多くの重要なシステム変数が破損します。
バッファ オーバーフローが発生しないようにするにはどうすればよいですか? これに関する私の考え 1) フレーム長データが特定の値を超えた場合は拒否します。2) 最大数を制限するデータ型を使用します。配列インデックスの範囲を 256 のメモリ ロケーションに制限する short を使用するように、280 バイトのバッファを作成します。3) メモリを別の場所に割り当てて、重要なシステム変数に影響を与えないようにします。
受信ループに陥るのを防ぐために使用したことの 1 つは、タイムアウトを使用することです。しかし、私はこの問題のこの側面を見落としていました。コードはより大きなシステムコードの一部であり、私はここの専門家ではないため、問題を確認して再現する時間があれば、私にはよく見えます。
一般的に、この種の問題を安全に処理するにはどうすればよいですか?
また、オーバーフローを防ぐために、配列を使用する際に従うべき一般的な考慮事項または標準的な慣行は何ですか?