При отладке аварии я столкнулся с этой проблемой в некотором коде:
int func()
{
char *p1 = malloc(...);
if (p1 == NULL)
goto err_exit;
char *p2 = malloc(...);
if (p2 == NULL)
goto err_exit;
...
err_exit:
free(p2);
free(p1);
return -1;
}
Проблема возникает, когда первый malloc выходит из строя. Поскольку мы перескакиваем через инициализацию p2
, он содержит случайные данные, и вызов free(p2)
может выходить из строя.
Я ожидал бы/надеюсь, что это будет рассматриваться так же, как в С++, где компилятор не позволяет переходу перейти к инициализации.
Мой вопрос: прыгает через инициализацию, разрешенную стандартом, или это ошибка в gcc-реализации c99?