Инструмент для проверки оптимальной упаковки всех структур в C-программе - PullRequest
2 голосов
/ 04 февраля 2011

Существует ли какой-либо инструмент, который мог бы проверить выравнивание всех структур в конкретном наборе файлов C и сообщить нам неправильно упакованные структуры, чтобы надлежащая упаковка (заполнение) могла быть выполнена вручную?Существует ли какой-либо инструмент, который также сделал бы необходимую модификацию (заполнение) структур в соответствии с требуемым выравниванием и дал бы результирующие файлы?

Инструмент должен гарантировать, что компилятор не оставляет дыр в структуре, поэтомучто структуры оптимально упакованы (не прибегая к #pragma pack или другим подобным приемам), и будут переупорядочивать элементы в структуре, чтобы минимизировать такие дыры.

Пожалуйста, дайте мне знать, существует ли какой-либо такой инструмент в Windows илиLinux

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Очень сложно написать инструмент для этой работы, потому что 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, который генерируется препроцессором? Для обработки всего этого требуется значительная часть компилятора Си, поэтому, вероятно, так мало инструментов для этой работы.

Если ваши структуры данных просты, вы можете применить некоторую простую эвристику и придумать «достаточно хорошее» решение, но полная общность того, что происходит, нетривиальна.

0 голосов
/ 06 февраля 2011

Я не знаю инструмента для выполнения перестановки, но если вы используете GCC, вы можете скомпилировать с -Wpadded, чтобы он предупреждал вас, если он вставляет отступ в какие-либо структуры, так чтоХотя бы простой способ проверить наличие дополнительных отступов.

0 голосов
/ 05 февраля 2011

Насколько я понимаю, компиляторы автоматически выравнивают структуры по правильной границе. Поля внутри автоматически выровнены, и отступы вставляются между полями по мере необходимости для выравнивания.

Обычный вопрос здесь заключается в том, как устранить отступы или выравнивать объекты на границах символов при «случайных» выравниваниях.

Не является стандартным вариантом для упаковки структуры, хотя многие компиляторы предоставляют pragma для pack структур.

Для различных выравниваний должна быть выделена динамическая память и доступ к структуре через указатель на начало структуры.

Если вы говорите выравнивание текста, вы можете отредактировать свой вопрос, чтобы указать.

...