установить значение по умолчанию для всех неинициализированных переменных - PullRequest
0 голосов
/ 25 марта 2020

У меня есть унаследованный код , где есть неинициализированный миллион

предупреждение C4100:: формальный параметр без ссылки

или потенциально неинициализированный:

предупреждение C4701: потенциально неинициализированная локальная переменная использовала

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

  • макросы предварительной обработки
  • параметры компилятора
  • Параметры CMake

Например, рассмотрим этот фиктивный код:

#include <stdio.h>

int main() {

   int a;

   printf("%d\n",a);

   return 0;
}

Я хочу использовать любую из указанных выше опций, чтобы установить все случаи, например a, на NULL или, возможно, в этом случае 0, если NULL невозможно.

PS Здесь я использую MSV C, чтобы перехватить возможные проблемы, но в конце я хочу, чтобы мое решение было кросс-платформенным и независимо от компилятора c. Таким образом, решения, определяемые компилятором c (например, G CC, Clang ...), в любом случае высоко ценятся.

1 Ответ

4 голосов
/ 25 марта 2020

Это предварено моими главными комментариями.

Я клонировал ваш репозиторий для разработки.

В конце концов я смог сделать make -i. Вывод составил около 500 строк [ошибок].

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

И некоторые из ошибок должны быть проверены на наличие ошибок logi c, в частности -Wmaybe-unitialized, что вас и беспокоит. Теперь самое время определить, можно ли просто изменить: int foobar; на int foobar = 0;. Если так, то я так и сделаю. (т.е.) Если код, основанный на иерархии if, никогда на самом деле не использует значение, когда оно не инициализировано, добавление int foobar = 0; просто сообщает компилятору STFU о проблемах.

Но это может на самом деле быть ошибкой. Если , код пути, на который жалуется предупреждение, - . Возможно, путь к коду не обнаружен на практике, но с другими входными данными [в будущем] выполняется код . Это будет [скрытая] ошибка.

Как минимум, простая инициализация с = 0; изменит непредсказуемые случайные побочные эффекты на предсказуемые побочные эффекты. Если функция дает сбой, она теперь будет работать непротиворечивым / предсказуемым образом (вместо того, чтобы полагаться на случайное значение, которое она получает в [неинициализированном] фрейме стека).

Но это было бы хорошее время для регистрации проверьте код на наличие [скрытых] ошибок. Вы получите больше атакующих; -)

Количество ошибок: -Wunused-parameter. Обычно я добавляю -Wno-unused-parameter к CFLAGS, если код известен для работы. IMO, это действительно даже не ошибка [реальная, мнимая или теоретическая] в большинстве случаев - это не ошибка до не использование параметра, просто предупреждение для новички пишут новый код. Если у вас есть сигнатура функции, у которой есть дополнительный параметр, который вы должны сохранить для обратной совместимости, но функция замены не нуждается в этом, вы получите здесь ложное срабатывание.

Для -Wunused-but-set-variable, Я бы удалил объявление и присвоение ему. Triage против int result = important_function_that_changes_globals();. Там сохраняют вызов функции. Заменить на: important_function_that_changes_globals();. Или, если вы должны [и лично я никогда не сделать это]: (void) important_function_that_changes_globals();

Но есть другие, которые указывают на ошибки (например) -Wstringop-truncation, что указывает на [ возможные] переполнение буфера.

База кода в подкаталоге src составляет [только] 30 000 строк. Опять же, всего около 500 строк сообщений об ошибках.

Исходя из моего опыта, ошибки могут быть обработаны за 1-3 дня [и максимум за одну неделю].

Но, как jarmod отметил, что могут быть более серьезные ошибки [которые только обнаруживаются при отладке во время выполнения].

...