The OpenNET Project / Index page

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



" Выпуск генератора лексических анализаторов re2c 3.0"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. " Выпуск генератора лексических анализаторов re2c 3.0" +6 +/
Сообщение от Ordu (ok), 28-Янв-22, 14:24 
> Если вы применяете goto, значит скорее всего вы говнокодер. Оператор goto применяется 1 раз в тысячу лет.

Ядро linux с тобой не согласно. Там goto используется в хвост и в гриву, например, как замена RAII: чтобы подчищать ресурсы при аварийном выходе из функции. Необходимость завершиться с ошибкой может быть детектирована в любой момент, и структурно следить за тем, чтобы освободить те ресурсы, которые были уже выделены и не освобождать те ресурсы, которые ещё не были -- это жуть. Груды дублирования кода, рантайм проверок типа if(ptr) free(ptr); и в целом код превращается в болото, в котором любой неосторожный шаг приведёт либо к use-after-free, либо к memleak, либо к double-free, либо ещё к чему-нибудь поэкзотичнее.

Когда же у тебя в конце функции что-то типа:

...
return SUCCESS;

cleanup1:
   free(ptr);
cleanup2:
   close(fd);
cleanup3:
   do_something_else();
   return FAILURE;

А внутри:

fd = open(...);
if(fd < 0) {
    goto cleanup3;
}
ptr = malloc(...);
if(ptr == NULL) {
    goto cleanup2;
}
if(something_else_went_bad()) {
    goto cleanup1;
}
то всё видно, _структурированно_, няшно и управляемо. Ещё и коды ошибок можно прокидывать туда через переменную int ret, объявленную в начале функции.

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

Оглавление
Выпуск генератора лексических анализаторов re2c 3.0, opennews, 28-Янв-22, 09:19  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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