Как гарантировать, что структуры полностью инициализированы (по имени) в GCC?

Как обеспечить, чтобы каждое поле моих структур инициализировалось в GCC при использовании назначенных инициализаторов? (Мне особенно интересны указатели на функции.) (Я использую C not С++.)

Вот пример:

typedef struct {
    int a;
    int b;
} foo_t;

typedef struct {
    void (*Start)(void);
    void (*Stop)(void);
} bar_t;

foo_t fooo = { 
        5 
    };

foo_t food = { 
        .b=4 
    };

bar_t baro = {
        NULL
    };

bar_t bard = { 
        .Start = NULL
    };

-Индикаторы поля ввода ничего не помогают. Он работает только для fooo только в GCC (mingw 4.7.3, 4.8.1), а clang работает только немного лучше (никаких предупреждений для еды и барда).

Я уверен, что есть причина не создавать предупреждения для назначенного инициализатора (даже если я их явно прошу), но я хочу/нуждаюсь в них. Я не хочу инициализировать структуры на основе порядка/позиции, потому что это больше подвержено ошибкам (например, замена Start и Stop даже не дает предупреждения). И ни gcc, ни clang не будут предупреждать, что я не смог явно инициализировать поле (при инициализации по имени). Я также не хочу засорять мой код с if (x.y == NULL) строк по нескольким причинам, один из которых - это необходимость компиляции предупреждений времени, а не ошибок времени выполнения.

Как минимум splint предоставит мне предупреждения по всем 4 случаям, но, к сожалению, я не могу использовать splint все время (он задыхается на некотором коде (не удается разобрать некоторые расширения C99, GCC)).

Примечание. Если я использую реальную функцию вместо NULL GCC, также будет отображаться предупреждение для бара (но не барда).

Я искал google и переполнение стека, но только нашел связанные вопросы и не нашел ответа для этой конкретной проблемы. Лучшее совпадение, которое я нашел, - "Убедитесь, что все элементы в структуре инициализированы" Убедитесь, что все элементы в структуре инициализированы Что задает почти тот же вопрос, но не имеет удовлетворительного ответа.

Есть ли лучший способ справиться с этим, о котором я не упомянул? (Может быть, другой инструмент анализа кода? Предпочтительно что-то (бесплатное), которое может быть интегрировано в Eclipse или Visual Studio...)

Ответ 1

Если я не ошибаюсь, стандарты C указывают, что другие поля автоматически инициализируются 0.

Итак, то, о чем вы просите - ошибка компиляции, когда поля не инициализированы, - не соответствует спецификации C (modern?).

Стандарт C99, стр. 127 в: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

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

gcc -Wmissing-field-initializers документируется, чтобы не предупреждать назначенные инициализаторы. Существует запрос на повышение -Wmissing-field-initializers=2, которое затем предупредило бы также: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39589

Поэтому я предлагаю вам добавить свое желание в этот отчет об ошибке или даже предоставить патч. Из моего опыта использования программного обеспечения с открытым исходным кодом лучше всего добавить патч.

Ответ 2

Четыре способа, которыми вы показали, все инициализируют остальную часть структуры. Он инициализируется значением 0 (или эквивалентом типа).