Проверка того, является ли используемая переменная инициализированной (назначенной) во время выполнения, общеизвестно трудна для C. Нет языковой поддержки для нее, и информации, доступной во время выполнения, просто недостаточно для идеального обнаружения неинициализированных значений. Инструменты динамического анализа, такие как Valgrind / Memcheck, проходят большую часть (например, отслеживают каждый байт памяти в адресном пространстве вашего процесса, а затем проверяют каждое хранилище, чтобы пометить байт как инициализированный), чтобы определить, инициализировано ли значение, используемое или нет, и все еще подвержены ложным срабатываниям.
Если вы просто пытаетесь свести к минимуму такие ошибки в своих программах, инструменты статического анализа, такие как lint, могут довольно хорошо проинформировать вас о том, используете ли вы неинициализированные переменные или нет. На самом деле, я полагаю, что большинство компиляторов сделают все возможное, чтобы сообщить вам, когда вы делаете это (хотя, конечно, они не идеальны).