【问题标题】:Detecting obvious endian issues检测明显的字节序问题
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多