【发布时间】:2018-08-29 13:13:04
【问题描述】:
考虑以下代码:
int main(int argc, char *argv[])
{
unsigned int a = 0xdeadbeef;
unsigned char *b = (unsigned char *) &a;
printf("%x %x %x %x\n", b[0], b[1], b[2], b[3]);
return 0;
}
是否有我可以启用的 gcc/clang(或任何其他编译器!)警告会告诉我此代码在大端和小端系统上的行为会有所不同?我用 gcc 尝试了-Wall,但它没有警告。
当然,实现这样的警告将涉及更深入的代码分析,因为为了警告编译器必须意识到b 被设置为a 的指针,然后访问其各个字节。但鉴于现代编译器强大的代码分析和优化技能,我希望这样的事情是可能的。
FWIW,我知道如何编写字节序中性代码,但显然由于大字节序 CPU 变得越来越过时,许多人似乎不再关心它,所以我经常不得不修复很多字节序在大端系统上使用为小端编写的组件时会出现问题。
我知道编译器几乎不可能检测到所有字节序问题,但我认为有些问题,如上面显示的问题,可以被检测到,所以我想知道是否有任何警告可以帮助我检测字节序问题。或者也许还有其他一些工具可以用来检测这些问题?
【问题讨论】:
-
不,没有这样的警告。然后它会警告几乎每一个 C 程序......:D
-
让我们记住一些 CPU 可以是 Big Endian 或 Little Endian。在任何情况下,程序员都有责任了解他们正在编写的内容。帮助确保正确访问变量字节的一种方法是在整数和字符数组之间使用
union
标签: c gcc clang endianness portability