Вы определяете функцию следующим образом:
int function(struct thing *arg) {
if (arg->data == NULL) {
// abort here
return 1;
} else {
// use the value here
return 0;
}
}
Здесь Вальгринд прав, когда жалуется, потому что невозможно достичь предполагаемого поведения для function()
. Если arg->data
не инициализируется явно, его значение является неопределенным, и оператор if
может выполнить любую из двух ветвей в зависимости от того, какое случайное значение он читает из arg->data
.
В общем случае функция не может работать правильно, потому что:
- Если проверка
arg->data == NULL
не пройдена, остальная часть кода будет предполагать, что arg->data
не NULL
и поэтому используйте недопустимое значение, что, скорее всего, вызовет cra sh или другие проблемы. - Если проверка
arg->data == NULL
пройдена, остальная часть кода ошибочно предположит, что data
известно, что является недействительным , и делает любые другие вещи, предполагая, что data
должен был быть NULL
, например, вызывает некоторый код очистки в неподходящее время.
Кроме этого, если вы действительно хотите быть педантичным c, чтение неинициализированных переменных на самом деле неопределенное поведение в C.
Правильный выбор в вашем случае либо используйте calloc()
вместо malloc()
или для ручной установки x->data = NULL
сразу после malloc()
.