有没有什么工具可以验证一组特定的C文件中所有结构的对齐,并让我们知道不正确的打包结构,以便可以手动完成正确的打包(填充)?是否有工具可以根据所需的对齐方式对结构进行必要的修改(填充),并生成相应的文件?
该工具应该确保编译器不会在结构中留下空洞,以便对结构进行最佳打包(而不是求助于#pragma pack或其他类似技巧),并对结构中的项进行重新排序,以最小化此类空洞。
请让我知道在Windows或Linux中是否存在这样的工具?
发布于 2011-02-06 08:15:25
很难写一个工具来完成这项工作,因为C语言是一种不受控制的语言,它的预处理器会把一切都搞砸。您需要分析预处理后的代码,并将其与源代码相关联。简单的部分是计算出基本类型的对齐规则。您可以使用一系列结构,例如:
struct a_double { char byte; double d; };类型所需的对齐方式为offsetof(struct a_double, d)。
然后,您需要解析源代码结构,计算出每个成员的对齐。但是,您还必须准备好处理以下问题:
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;
};这绝对不是微不足道的。但您还必须记住,在源代码中,它可能是这样的:
struct something
{
TYPE1 a;
TYPE2 d[12];
TYPE3 e;
};TYPEn类型可以是typedefs,或者宏,或者标识typedefs的宏,或者一些其他对正规性的扭曲。在这种情况下,工具该怎么做呢?它是否需要计算源码中编写的struct something和预处理器生成的struct something之间的映射?它需要很大一部分C编译器来处理这一切,这可能就是为什么能做这项工作的工具如此之少。
如果你的数据结构很简单,你可以应用一些简单的启发式方法,并提出一个“足够好”的解决方案,但所发生的事情的全部普遍性并不是微不足道的。
发布于 2011-02-05 05:05:36
我的理解是编译器会自动将结构与正确的边界对齐。其中的字段会自动对齐,并根据需要在字段之间插入填充以进行对齐。
这里通常的问题是如何消除字符边界上的填充或以“随机”对齐方式对齐对象。
虽然许多编译器为packing结构提供了pragma,但并不是打包结构的标准选项。
对于不同的对齐,必须分配动态内存,并通过指向结构开始处的指针访问结构。
如果您正在谈论对齐文本,您可能希望编辑您的问题以指定。
发布于 2011-02-06 09:20:21
我不知道有什么工具可以帮你重新排列,但如果你使用的是GCC,你可以用-Wpadded编译,如果它在任何结构中插入填充,它就会警告你,所以这至少应该是一种检查添加填充的简单方法。
https://stackoverflow.com/questions/4901132
复制相似问题