首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C程序中验证所有结构的最优包装的工具

在C程序中验证所有结构的最优包装的工具
EN

Stack Overflow用户
提问于 2011-02-05 01:39:48
回答 3查看 841关注 0票数 2

有没有什么工具可以验证一组特定的C文件中所有结构的对齐,并让我们知道不正确的打包结构,以便可以手动完成正确的打包(填充)?是否有工具可以根据所需的对齐方式对结构进行必要的修改(填充),并生成相应的文件?

该工具应该确保编译器不会在结构中留下空洞,以便对结构进行最佳打包(而不是求助于#pragma pack或其他类似技巧),并对结构中的项进行重新排序,以最小化此类空洞。

请让我知道在Windows或Linux中是否存在这样的工具?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-06 08:15:25

很难写一个工具来完成这项工作,因为C语言是一种不受控制的语言,它的预处理器会把一切都搞砸。您需要分析预处理后的代码,并将其与源代码相关联。简单的部分是计算出基本类型的对齐规则。您可以使用一系列结构,例如:

代码语言:javascript
复制
struct a_double { char byte; double d; };

类型所需的对齐方式为offsetof(struct a_double, d)

然后,您需要解析源代码结构,计算出每个成员的对齐。但是,您还必须准备好处理以下问题:

代码语言:javascript
复制
struct something
{
    int a;
    struct x
    {
        char b;
        double c;
        short s;
    } d[12];
    union y
    {
        void (*function)(void);
        struct z
        {
            char f[23];
            int  g;
        } p;
        void *vp;
    } e;
};

这绝对不是微不足道的。但您还必须记住,在源代码中,它可能是这样的:

代码语言:javascript
复制
struct something
{
     TYPE1 a;
     TYPE2 d[12];
     TYPE3 e;
};

TYPEn类型可以是typedefs,或者宏,或者标识typedefs的宏,或者一些其他对正规性的扭曲。在这种情况下,工具该怎么做呢?它是否需要计算源码中编写的struct something和预处理器生成的struct something之间的映射?它需要很大一部分C编译器来处理这一切,这可能就是为什么能做这项工作的工具如此之少。

如果你的数据结构很简单,你可以应用一些简单的启发式方法,并提出一个“足够好”的解决方案,但所发生的事情的全部普遍性并不是微不足道的。

票数 2
EN

Stack Overflow用户

发布于 2011-02-05 05:05:36

我的理解是编译器会自动将结构与正确的边界对齐。其中的字段会自动对齐,并根据需要在字段之间插入填充以进行对齐。

这里通常的问题是如何消除字符边界上的填充或以“随机”对齐方式对齐对象。

虽然许多编译器为packing结构提供了pragma,但并不是打包结构的标准选项。

对于不同的对齐,必须分配动态内存,并通过指向结构开始处的指针访问结构。

如果您正在谈论对齐文本,您可能希望编辑您的问题以指定。

票数 0
EN

Stack Overflow用户

发布于 2011-02-06 09:20:21

我不知道有什么工具可以帮你重新排列,但如果你使用的是GCC,你可以用-Wpadded编译,如果它在任何结构中插入填充,它就会警告你,所以这至少应该是一种检查添加填充的简单方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4901132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档