架构无关代码
Architecture agnostic code
我有这段代码,目的是确定收到的数据包是否有效:
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
可能是因为 cpu 是 64 位的。
现在当file_name_length
有一个值0xFFFFFFFF
(无效)时,数据包被视为无效。
但是,如果 size_t
由于底层架构而变为 u_int32_t
,那么对于 file_name_length
的相同值,条件将失败,因为该值会回绕,并且数据包是视为有效。
如何使此条件足够通用以适用于 32/64 位架构?
谢谢!
诀窍是只使用减法,并且只有在验证减法不会回绕后才减法。像这样:
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
}
我有这段代码,目的是确定收到的数据包是否有效:
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
可能是因为 cpu 是 64 位的。
现在当file_name_length
有一个值0xFFFFFFFF
(无效)时,数据包被视为无效。
但是,如果 size_t
由于底层架构而变为 u_int32_t
,那么对于 file_name_length
的相同值,条件将失败,因为该值会回绕,并且数据包是视为有效。
如何使此条件足够通用以适用于 32/64 位架构?
谢谢!
诀窍是只使用减法,并且只有在验证减法不会回绕后才减法。像这样:
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
}