架构无关代码

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_tu_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
}