私は目的は、受信したパケットが有効であるかどうかを決定するためのコードのこの部分を持っている:CPUは64ビットの1つであるためアーキテクチャ依存しないコード
size_t offset_to_a, offset_to_b;
u_int32_t file_name_length;
u_int32_t packet_length;
if ((offset_to_a + offset_to_b + file_name_length) > packet_length) {
// Invalid packet
}
size_t
は、おそらくu_int64_t
あります。 file_name_length
は(無効)値0xFFFFFFFF
を有する場合
次に、パケットは無効とみなされます。
しかしsize_t
が原因で基盤となるアーキテクチャのu_int32_t
になった場合、その後、file_name_length
の同じ値のため、条件値はラップアラウンドしまうので失敗し、パケットが有効であると考えられます。
どのようにしてこの条件を32/64-bit両方のアーキテクチャーで動作させるのに十分なものにすることができますか?
ありがとうございます!
値0xFFFFFFFFは最大32ビットの符号なし整数で、64ビット値のブレークは発生しません。したがって、 'size_t 'が32ビットであれば、同じように動作します。おそらく、あなたは64ビット値のために '0xFFFFFFFFFFFFFFFF'を間違って入力したでしょう。あなたは固定サイズのタイプを ''と ''と考えましたか?これらは、サイズが固定されている場合、現代のコードでよく使用されます。 (技術的には、オプションである - いくつかのプラットフォームは 'uint16_t 'をサポートしていないかもしれず、その場合' uint16_t'型はないでしょう。しかし、常に 'uint_least16_t'型があります。 –
"* file_name_lengthの値が0xFFFFFFFFのとき(無効)、"なぜ単純な 'if(file_name_length> = 0xffffffff){//無効なパケット}'を実行するのですか? – alk
@alk:あなたの提案は有効であり、私たちはそれを取り入れました。ありがとうございました! – Maddy