低级别C程序字节序可移植性的静态分析
1. 引言
在计算机内存中,多字节标量值的表示方式并没有达成共识。有些系统将最低有效字节存储在最低地址,这种被称为小端字节序(little - endian);而另一些系统则相反,将最高有效字节存储在最低地址,即大端字节序(big - endian)。涉及字节序的系统包括处理器架构、网络协议和数据存储格式等。例如,Intel处理器采用小端字节序,而互联网协议和一些传统处理器(如SPARC)则采用大端字节序。
这就导致依赖标量类型编码假设的程序,在不同字节序的平台上运行时可能会表现出不同的行为,这种情况在诸如设备驱动程序或嵌入式软件等低级C软件中尤为常见。因为C标准部分未明确规定标量类型的编码,具体的类型表示在特定实现的应用二进制接口(ABI)中进行了标准化。虽然可以编写完全可移植、与ABI无关的C代码,但绝大多数C程序都依赖于平台ABI的假设,如字节序。
当将低级C程序移植到字节序相反的新平台时,典型的做法是消除大部分依赖字节序的代码,并将剩余代码(如果有的话)包装在条件包含指令中,从而产生同一程序的两个语法相近但特定于字节序的变体。我们将程序在小端和大端平台上使用相同输入运行时计算出相同输出的特性称为字节序可移植性。
本文描述了一种静态分析方法,旨在推断大型现实世界低级C程序的字节序可移植性。
示例
以下是一个读取网络输入的代码片段示例:
read_from_network((uint8_t *)&x, sizeof(x));
# if __BYTE_ORDER == __LITTLE_ENDIAN
超级会员免费看
订阅专栏 解锁全文
61万+

被折叠的 条评论
为什么被折叠?



