架构无关代码

问题描述:

我有这样一段代码,其目的是,以确定是否接收到的分组是有效或不是:架构无关代码

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位体系结构上工作?

谢谢!

+0

值0xFFFFFFFF是最大32位无符号整数 - 并且不会产生64位值break break。因此,如果'size_t'是32位的,它将起到相同的作用。也许你错误地输入了“0xFFFFFFFFFFFFFFFF”作为64位值。你是否考虑过来自''和''的固定尺寸类型?当尺寸固定时,这些常用于现代代码中。 (有多种不兼容的选择。)从技术上讲,它们是可选的 - 某些平台可能不支持'uint16_t',在这种情况下,不会有'uint16_t'类型。不过,总是有'uint_least16_t'类型。 –

+1

“*现在,当file_name_length的值为0xFFFFFFFF(无效)时,*”那么为什么不只是做一个简单的'if(file_name_length> = 0xffffffff){//无效的数据包}'? – alk

+0

@alk:您的建议是有效的,我们并入它。谢谢! – Maddy

诀窍是只使用减法,并且只有在确认减法不会换行后才减去。类似这样的:

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