我有这段代码,目的是确定收到的数据包是否有效:

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可能是因为cpu是64位的。
现在当u_int64_t有一个值file_name_length时(该值无效),则该包被视为无效。
但是,如果由于底层架构而使0xFFFFFFFF变为size_t,那么对于相同的值u_int32_t,条件将失败,因为该值将被环绕,并且包被认为是有效的。
如何使此条件具有足够的通用性,以便同时在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
}

10-08 20:02