2017-07-04 3 views
1

私は目的は、受信したパケットが有効であるかどうかを決定するためのコードのこの部分を持っている: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両方のアーキテクチャーで動作させるのに十分なものにすることができますか?

ありがとうございます!

+0

値0xFFFFFFFFは最大32ビットの符号なし整数で、64ビット値のブレークは発生しません。したがって、 'size_t 'が32ビットであれば、同じように動作します。おそらく、あなたは64ビット値のために '0xFFFFFFFFFFFFFFFF'を間違って入力したでしょう。あなたは固定サイズのタイプを ''と ''と考えましたか?これらは、サイズが固定されている場合、現代のコードでよく使用されます。 (技術的には、オプションである - いくつかのプラットフォームは 'uint16_t 'をサポートしていないかもしれず、その場合' uint16_t'型はないでしょう。しかし、常に 'uint_least16_t'型があります。 –

+1

"* file_name_lengthの値が0xFFFFFFFFのとき(無効)、"なぜ単純な 'if(file_name_length> = 0xffffffff){//無効なパケット}'を実行するのですか? – alk

+0

@alk:あなたの提案は有効であり、私たちはそれを取り入れました。ありがとうございました! – Maddy

答えて

1

トリックは減算のみを使用し、減算がラップしないことを確認した後で減算することです。

if (offset_to_a > packet_length || packet_length - offset_to_a < file_name_length) { 
    // invalid packet 
} 
size_t remain = packet_length - offset_to_a; 
if (offset_to_b > remain || remain - offset_to_b < file_name_length) { 
    // invalid packet 
} 
+0

それはうまくいった。ありがとうございました! – Maddy

関連する問題