检测明显的endian问题

时间:2018-03-20 16:06:33

标签: c gcc clang endianness portability

请考虑以下代码:

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变得越来越过时,许多人似乎不再关心它,所以我经常要修复很多很多的端点在大端系统上使用为小端编写的组件时出现问题。

我知道编译器几乎不可能检测到所有的endian问题,但我认为有些问题,如上面显示的问题,可以被检测到,这就是为什么我想知道是否有任何警告可以帮助我检测端序问题。或者也许我可以使用其他一些工具来检测这些问题?

1 个答案:

答案 0 :(得分:1)

尽管理论上可行,但编译器实现此功能可能不切实际。如果您正在寻找一种自动检查字节序问题的方法,那么您将不得不诉诸using a static analyzer,但即使他们可能也不会达到您想要的水平。