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因为cpu是64位的。

现在,当file_name_length有一个值0xFFFFFFFF(无效)时,则认为该数据包无效。

但是如果因为底层架构而size_t成为,那么对于相同的值,条件失败,因为值会回绕,并且数据包被认为是有效的。u_int32_tfile_name_length

我怎样才能使这个条件足够通用以在 32/64 位架构上工作?

谢谢!

4

1 回答 1

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
}
于 2017-07-04T04:30:43.250 回答