почему предупреждение о неинициализированной переменной подавляется, когда ядро компилируется с включенной конфигурацией оптимизации размера?

#linux #linux-kernel #linux-device-driver #embedded-linux

#linux #linux-ядро #linux-device-driver #встроенный-linux

Вопрос:

пытаясь оптимизировать время загрузки ядра, я отключил CONFIG_CC_OPTIMIZE_FOR_SIZE флаг в конфигурации. Это привело к большому may-be uninitialized количеству предупреждений (которые рассматривались как ошибка).

Пытаясь отладить это, я обнаружил, что в Makefile:

 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS    = -Os $(call cc-disable-warning,maybe-uninitialized,)
else
KBUILD_CFLAGS    = -O2
endif
  

Я не понимаю причины отключения предупреждения для неинициализированной переменной, когда ядро оптимизировано по размеру, а не по-другому. Какая мысль стоит за этим, и если я добавлю флаг для игнорирования неинициализированных переменных в более позднем случае «не оптимизировано по размеру», с какими проблемами я могу столкнуться, если таковые имеются.

Любая помощь приветствуется.

Спасибо

Ответ №1:

Самые последние ядра (5.1 и более поздние — еще не выпущены на момент написания — см. Фиксацию b303c6df80c9kbuild: вычисление ложноположительных -Wmaybe-неинициализированных случаев в Kconfig«)) есть отдельная опция конфигурации CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED , чтобы отключить предупреждение. Эти ядра определяют параметр по умолчанию для GCC версии 4.7 (которая представила предупреждение) и GCC версии 4.8, но параметр можно настроить вручную.

Для вашей версии ядра и компилятора должно быть безопасно изменять Makefile для добавления $(call cc-disable-warning,maybe-uninitialized,) глобально. В качестве альтернативы вы могли бы рассмотреть возможность использования GCC 4.9 или более поздней версии.