M. *_*ley 30 c++ testing endianness
如何测试或检查C++代码是否具有字节序独立性?它已经实现了,我想验证它是否适用于小端和大端平台.
我可以编写单元测试并在目标平台上运行它们,但我没有硬件.也许是模拟器?
是否可以进行编译时间检查?
Pau*_*l R 15
如果您可以访问基于x86的Mac,那么您可以利用Mac OS X内置的PowerPC仿真以及x86(小端)和PowerPC(大端)的开发人员工具支持这一事实.这使您可以在同一平台上编译和运行大端和小端可执行文件,例如
$ gcc -arch i386 foo.c -o foo_x86 # build little endian x86 executable
$ gcc -arch ppc foo.c -o foo_ppc # build big endian PowerPC executable
Run Code Online (Sandbox Code Playgroud)
构建了big endian和little endian可执行文件之后,您可以运行任何可用的单元测试,这将捕获一些与字节序相关的问题,并且您还可以比较可执行文件生成的任何数据(文件,网络数据包,无论如何) - 这显然应该匹配.
我读了一篇故事,用Flint(Flexible Lint)来诊断这种错误.
不再了解具体细节,但让我回顾一下这个故事:
http://www.datacenterworks.com/stories/flint.html
示例:诊断字节顺序错误
在最近的一次参与中,我们将代码从旧的Sequent移植到SPARC,在我们在Thud和Blunder的故事中讨论的特定指针问题之后,我们需要查找其他空指针问题以及endian-ness错误.
我建议采用一种可以避免问题的编码技术。
首先,您必须了解在哪种情况下会出现字节序问题。然后要么找到一种与字节序无关的方式来编写它,要么隔离代码。
例如,可能发生字节序问题的典型问题是当您使用内存访问或联合来挑选较大值的部分时。具体来说,避免:
long x;
...
char second_byte = *(((char *)&x) + 1);
Run Code Online (Sandbox Code Playgroud)
相反,写:
long x;
...
char second_byte = (char)(x >> 8)
Run Code Online (Sandbox Code Playgroud)
连接,这是我的最爱之一,因为很多人倾向于认为你只能使用奇怪的技巧来做到这一点。不要这样做:
union uu
{
long x;
unsigned short s[2];
};
union uu u;
u.s[0] = low;
u.s[1] = high;
long res = u.x;
Run Code Online (Sandbox Code Playgroud)
而是写:
long res = (((unsigned long)high) << 16) | low
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2270 次 |
最近记录: |