检测明显的字节序问题
Detecting obvious endian issues
考虑以下代码:
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 变得越来越过时以来,许多人似乎不再关心它,所以我经常不得不修复很多很多在大端系统上使用为小端编写的组件时的字节序问题。
我知道编译器几乎不可能检测到所有端序问题,但我认为可以检测到一些问题,例如上面显示的问题,所以我想知道是否有任何警告可以帮助我检测字节序问题。或者我可以使用其他一些工具来检测这些问题?
尽管理论上可行,但编译器实现此功能可能是不切实际的。如果您正在寻找某种方法来自动检查字节顺序问题,您将不得不求助于 using a static analyzer,但即使他们可能不会达到您想要的水平。
考虑以下代码:
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 变得越来越过时以来,许多人似乎不再关心它,所以我经常不得不修复很多很多在大端系统上使用为小端编写的组件时的字节序问题。
我知道编译器几乎不可能检测到所有端序问题,但我认为可以检测到一些问题,例如上面显示的问题,所以我想知道是否有任何警告可以帮助我检测字节序问题。或者我可以使用其他一些工具来检测这些问题?
尽管理论上可行,但编译器实现此功能可能是不切实际的。如果您正在寻找某种方法来自动检查字节顺序问题,您将不得不求助于 using a static analyzer,但即使他们可能不会达到您想要的水平。