架构无关代码
问题描述:
我有这样一段代码,其目的是,以确定是否接收到的分组是有效或不是:架构无关代码
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
}
+0
工作。谢谢! – Maddy
值0xFFFFFFFF是最大32位无符号整数 - 并且不会产生64位值break break。因此,如果'size_t'是32位的,它将起到相同的作用。也许你错误地输入了“0xFFFFFFFFFFFFFFFF”作为64位值。你是否考虑过来自''和''的固定尺寸类型?当尺寸固定时,这些常用于现代代码中。 (有多种不兼容的选择。)从技术上讲,它们是可选的 - 某些平台可能不支持'uint16_t',在这种情况下,不会有'uint16_t'类型。不过,总是有'uint_least16_t'类型。 –
“*现在,当file_name_length的值为0xFFFFFFFF(无效)时,*”那么为什么不只是做一个简单的'if(file_name_length> = 0xffffffff){//无效的数据包}'? – alk
@alk:您的建议是有效的,我们并入它。谢谢! – Maddy