The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Критическая уязвимость в GnuTLS. Разработчик OpenLDAP рекоме..., opennews (??), 05-Мрт-14, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


79. "Критическая уязвимость в GnuTLS, существенно влияющая на без..."  +1 +/
Сообщение от www2 (??), 05-Мрт-14, 17:33 
> нормальный программист легко обойдется без goto, на что не способен выросший на
> васике

Сравните два варианта кода:

if (error1)
{
  free(ptr1);
  free(ptr2);
  free_structure(stru);
  return ERROR;
}

... /* Много кода */

if (error2)
{
  free(ptr1);
  free(ptr2);
  free_structure(stru);
  return ERROR;
}

Или

if (error1)
  goto error;

... /* Много кода */

if (error2)
  goto error;

error:
  free(ptr1);
  free(ptr2);
  free_structure(stru);
  return ERROR;

Теперь нужно добавить ещё одну структуру, которую нужно очищать при выходе. Какова вероятность, что добавив освобождение этой структуры в условный блок error1 вы не забудете про условный блок error2 в первом случае? И какова вероятность того, что вы забудете это сделать во втором случае и не обнаружите этого?

Нормальный программист обойдётся. Только выбор не всегда очевиден, как это представляется на первый взгляд.

Ответить | Правка | К родителю #65 | Наверх | Cообщить модератору

121. "Критическая уязвимость в GnuTLS, существенно влияющая на без..."  –1 +/
Сообщение от Михаил (??), 06-Мрт-14, 08:59 
нормальный в таком случае функцию error() сделает и будет ее вызывать.
Ответить | Правка | Наверх | Cообщить модератору

134. "Критическая уязвимость в GnuTLS, существенно влияющая на без..."  +1 +/
Сообщение от тоже Анонимemail (ok), 06-Мрт-14, 20:54 
Это С, напоминаю. Чтобы обработать локальные ptr1, ptr2, ..., их нужно будет в эту функцию передать. В результате вместо этого кода в столбик получаем практически то же самое в списке параметров. Забыть добавить что-то в обоих случаях сразу, конечно, будет сложнее.
Но логика получается в значительной степени неестественная.
Другое дело, что никто не мешает вынести этот блок в конец метода и все перед ним заключить в условия if(!error_happened) после первой же возможности ошибки. А поскольку выделенную память все равно нужно освободить, то и функцию желательно привести к единому выходу, перед которым это освобождение будет естественным образом происходить. Goto здесь разве что экономит память, которую придется потратить на флаги ошибок. Ну, и несколько лишних проверок тех флагов потребуются. Острой необходимости в goto нет.
Вообще if(condition) goto mark; ... mark: совершенно равнозначно if(!condition) { ... }
Ответить | Правка | Наверх | Cообщить модератору

152. "Критическая уязвимость в GnuTLS, существенно влияющая на без..."  +/
Сообщение от www2 (??), 07-Мрт-14, 18:26 
> нормальный в таком случае функцию error() сделает и будет ее вызывать.

Ага, на каждую функцию по функции error. error для error'а потом ещё написать.

Ответить | Правка | К родителю #121 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру