Во время отладки сбоя я столкнулся с этой проблемой в каком-то коде:
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)
может привести к сбою.
Я ожидаю/надеюсь, что это будет обрабатываться так же, как в C++, где компилятор не позволяет переходить через инициализацию.
Мой вопрос: разрешен ли переход через инициализацию стандартом или это ошибка в реализации gcc c99?
if(p1=malloc(...)){if(p2=malloc(...)){ return use(p1,p2);} else { free(p1); } } return -1;
Не все в одной строке, конечно. - person nategoose   schedule 13.05.2010goto
по своей сути хорошо или плохо, или даже способ обработки ошибок или нет. Иногда это лучшее средство, иногда худшее, а иногда лучшее, но используемое очень плохо. - person nategoose   schedule 13.05.2010