是否有任何工具可以验证特定C文件集中所有结构的对齐,并让我们知道不正确的打包结构,以便可以手动完成正确的打包(填充)是否有任何工具也会根据所需的对齐方式对结构进行必要的修改(填充),并给出结果文件?
该工具应确保编译器不会在结构中留下洞,从而使结构得到最佳打包(而不诉诸#pragma pack
或其他此类技巧),并将对结构中的项重新排序,以最小化此类洞。
请让我知道在Windows或Linux中是否存在这样的工具?
最佳答案
编写一个工具来完成这项工作是非常困难的,因为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编译器的很大一部分来处理所有这一切,这可能就是为什么能完成这项工作的工具如此之少的原因。如果你的数据结构很简单,你可以应用一些简单的启发式方法,并提出一个“足够好”的解决方案,但发生的事情的全部普遍性是不平凡的。