Современные компиляторы способны создавать такое предупреждение ... в gcc, оно включено с инициализаторами -Wmissing-field-инициализаторами (который предупреждает об инициализаторах, которые существуют, но не инициализируют всех членов, но не о структурах без инициализатора выражение, которое по крайней мере иногда можно поймать, включив -Wuninitialized, который предупредит вас, если он увидит, что вы читаете потенциально неинициализированное значение, по крайней мере, если вы читаете его в той же функции, в которую была объявлена переменная).
Если ваш очень старый компилятор, возможно, предоставит такое предупреждение, вы можете, конечно, включить его, но это маловероятно из вашего описания.
Ваш лучший вариант, я думаю, если вы хотите сделать исчерпывающий поиск для них, было бы посмотреть, можете ли вы получить код для компиляции с некоторой версией gcc - его не нужно было бы компилировать достаточно хорошо для фактического запуска на вашей целевой платформе, чтобы получить предупреждения. Я не могу гарантировать, что он сможет скомпилировать ваш код перед ANSI C, особенно если он широко использует расширения для компилятора, но я могу хотя бы сказать, что поддержка устаревшего синтаксиса K & R по-прежнему присутствует в современных C, поэтому я не удивлюсь, если ваш код будет компилироваться лучше, чем вы думаете.
Если это работает, то для последовательного создания предупреждений в вашей среде IDE вы можете изменить сценарий сборки так, чтобы он как скомпилировал, так и связал код с реальным компилятором, на который вы нацеливаетесь, а также скомпилирует его (но не обязательно связывает его) с gcc, чтобы генерировать дополнительные предупреждения, которые могут быть отображены и отображены в среде IDE.
Другой вариант заключается в том, чтобы увидеть, можно ли найти совместимый статический анализатор, который может выполнять такую проверку; Я работаю над инструментом под названием EnSoft Atlas, который строит график потока данных, который вместе с простым скриптом может быть использован для принудительной инициализации более тщательно, чем позволяют предупреждения gcc, путем проверки того, происходит ли поток неинициализированных значений в поля структур.
Однако наша поддержка C по-прежнему находится в стадии бета-тестирования. Atlas требует, чтобы Eclipse CDT (или JDT для Java) мог анализировать ваш код, а текущая C-бета полностью поддерживает современные сильно типизированные инициализаторы структуры (т.е. struct foo f = (struct foo) {...}
имеет полностью подключенный поток данных, но поддерживает более старый синтаксис списка инициализаторов struct foo f = {...}
не был реализован на нашем первом проходе), поэтому я не уверен, что он сможет удовлетворить ваши потребности в это время.
Любой, кто имеет какие-либо советы таким образом? – user2448122