Очень сложно написать инструмент для этой работы, потому что 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, или макросами, или макросами, идентифицирующими typedef, или некоторым другим искажением нормальности. В таком случае, что это за инструмент? Должно ли оно работать с отображением между struct something
, записанным в источнике, и struct something
, который генерируется препроцессором? Для обработки всего этого требуется значительная часть компилятора Си, поэтому, вероятно, так мало инструментов для этой работы.
Если ваши структуры данных просты, вы можете применить некоторую простую эвристику и придумать «достаточно хорошее» решение, но полная общность того, что происходит, нетривиальна.