The OpenNET Project / Index page

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

03.06.2018 23:50  Разработчики OpenBSD представили криптографическую библиотеку libcsi

В основной состав OpenBSD принят код библиотеки libcsi (Crypto Simplified Interface), которая предоставляет упрощённый API для выполнения криптографических операций среднего уровня, востребованных в приложениях. В частности предоставляются функции обмена ключами c использованием протокола Диффи — Хеллмана. Libcsi дополняет ранее добавленную библиотеку libtls с реализацией упрощённого интерфейса для использования TLS в клиентских и серверных приложениях.

  1. Главная ссылка к новости (http://undeadly.org/cgi?action...)
  2. OpenNews: Проект HardenedBSD возвращается с LibreSSL на OpenSSL
  3. OpenNews: Выпуск LibreSSL 2.7.0
  4. OpenNews: Альфа-выпуск OpenSSL 1.1.1 с поддержкой TLS 1.3
  5. OpenNews: Разработчики OpenBSD развивают новый метод защиты стека
  6. OpenNews: Выпуск OpenBSD 6.3
Лицензия: CC-BY
Тип: Программы
Ключевые слова: openbsd, libcsi, crypt
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение Ajax/Линейный | Раскрыть все сообщения | RSS
 
  • 1.1, ляликс (?), 00:18, 04/06/2018 [ответить] [показать ветку] [···]    [к модератору]
  • –5 +/
    goto... фу.
     
     
  • 2.2, Аноним (-), 00:24, 04/06/2018 [^] [ответить]    [к модератору]
  • –1 +/
    Пруф или не было.
     
  • 2.3, Vitto74 (ok), 00:53, 04/06/2018 [^] [ответить]    [к модератору]
  • +21 +/
    Плотно всеже засело правило - не использовать goto. Хотя смысл правила в том, чтобы этот самый goto не использовать там, где это может запутать код. Специально посмотрел исходник - никакой запутанности: goto используется только для упрощения кода. Например - что проще, такой код без goto

    static int
    csi_err_vset(struct csi_err *err, u_int code, int errnum, const char *fmt, va_list ap)
    {
    char *errmsg = NULL;
    int rv = -1;
    bool isError = false;

    csi_err_clear(err);

    err->code = code;
    err->errnum = errnum;

    if (vasprintf(&errmsg, fmt, ap) == -1) {
    errmsg = NULL;
    isError = true;
    }

    if ((errnum == -1) and (!isError)) {
    err->msg = errmsg;
    return (0);
    }

    if ((asprintf(&err->msg, "%s: %s", errmsg, strerror(errnum)) == -1) and (!isError)) {
    err->msg = NULL;
    isError = true;
    }
    if (!isError){
    rv = 0;
    }

    free(errmsg);

    return (rv);
    }

    или то, что мы видим в проекте?

    static int
    csi_err_vset(struct csi_err *err, u_int code, int errnum, const char *fmt, va_list ap)
    {
    char *errmsg = NULL;
    int rv = -1;

    csi_err_clear(err);

    err->code = code;
    err->errnum = errnum;

    if (vasprintf(&errmsg, fmt, ap) == -1) {
    errmsg = NULL;
    goto err;
    }

    if (errnum == -1) {
    err->msg = errmsg;
    return (0);
    }

    if (asprintf(&err->msg, "%s: %s", errmsg, strerror(errnum)) == -1) {
    err->msg = NULL;
    goto err;
    }
    rv = 0;

    err:
    free(errmsg);

    return (rv);
    }

    В libcsi код с goto явно менее запутан, чем получился бы без него. Поэтому говорить фу, на всё без исключения goto, есть крайность как и его необдуманное использование, а крайности как известно - плохо.

     
     
  • 3.4, PereresusNeVlezaetBuggy (ok), 01:33, 04/06/2018 [^] [ответить]    [к модератору]
  • +1 +/
    Именно так.

    Важно помнить, что у каждого языка свои особенности, которые сказываются на «правилах хорошего тона», характерных для данного языка. В C, в отличие от большинства языков, у объектов нет автоматически вызываемых деструкторов, да и вообще объектов, с точки зрения ООП, нет. Поэтому если в высокоуровневом языке мы просто объявляем локальные переменные какого-нибудь типа string, или берём блокировку чем-то типа ReadLock lock(myMutex), то в C такого попросту нет. Это, фактически, обязывает явно выносить весь подчищающий код и код обработки ошибок в одно место — обычно это подвал функции.

    Так что если бы это был C++, то — да, фу-фу-фу. Но это C, здесь другие правила.

     
     
  • 4.7, bOOster (ok), 07:45, 04/06/2018 [^] [ответить]    [к модератору]
  • –1 +/
    О чем пост то? Каким образом goto коррелирует к ООП?
    Семантика циклов для C/C++/JAVA - одинакова.
    if/break, while/break, for/break - в этом случае выход из цикла в одной точке. И все логика алгоритма линейно просматривается.
    А если у тебя в цикле по условиям goto напиханы - например один выходит на инициализацию/начало цикла, второй где-то внутри цикла переходит, третий/четвертый выходит из цикла куда захочет - вот тут начинается бардак и катастрофа.
    Так же из бардака - это переход по goto части кода, вперед, а потом по какому-то условию возврат в пропущенную часть.
    И этот бардак справедлив как для С так и для C++
     
     
  • 5.8, PereresusNeVlezaetBuggy (ok), 09:10, 04/06/2018 [^] [ответить]     [к модератору]  
  • +2 +/
    Таким, что в ООП-языках сама потребность в goto крайне низкая Навскидку, в посл... весь текст скрыт [показать]
     
  • 4.9, nobody (??), 11:19, 04/06/2018 [^] [ответить]    [к модератору]  
  • +/
    > В C, в отличие от большинства языков, у объектов нет автоматически вызываемых деструкторов

    Эт в каких промышленных языках они есть кроме C++? Явовские убогие и неюзабельные финалайзеры к деструкторам не приплетать!

     
     
  • 5.10, Аноним (-), 12:02, 04/06/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    В PHP, детка.

    {
    function __destruct() {blablabla}
    }

     
     
  • 6.11, nobody (??), 12:35, 04/06/2018 [^] [ответить]    [к модератору]  
  • +/
    Ну тогда действительно "большинство", раз PHP. Ещё есть примеры?
    (И это точно деструктор с детерминированной точкой вызова в коде программы, а не тот же финалайзер который "когда-нибудь" при сборке мусора. Вопрос без подвоха, просто интересно знать)
     
     
  • 7.13, PereresusNeVlezaetBuggy (ok), 14:36, 04/06/2018 [^] [ответить]    [к модератору]  
  • +/
    > Ну тогда действительно "большинство", раз PHP. Ещё есть примеры?

    Есть. Ada, Perl, Rust, с некоторой натяжкой D... дальше сами найдёте?

    > (И это точно деструктор с детерминированной точкой вызова в коде программы, а
    > не тот же финалайзер который "когда-нибудь" при сборке мусора. Вопрос без
    > подвоха, просто интересно знать)

    Да.

     
  • 5.15, Crazy Alex (ok), 08:11, 05/06/2018 [^] [ответить]    [к модератору]  
  • +/
    Если не буквоедствовать - в джаве есть finally и GC, выполняющие примерно ту же функцию. Суть в том, что в C всё управление ресурсами приходится делать явным образом (нет средств автоматической уборки по выходу из скопа), и уход с помощью goto в конец функции, где это и происходит - чуть ли не единственное разумное решение.
     
  • 3.6, Аноним (-), 03:51, 04/06/2018 [^] [ответить]     [к модератору]  
  • –1 +/
    Всегда использовать goto сколько угодно обильно и не запутывать код Но в опреде... весь текст скрыт [показать]
     
  • 2.12, proninyaroslav (ok), 13:26, 04/06/2018 [^] [ответить]    [к модератору]  
  • +2 +/
    Достаточно посмотреть Linux kernel coding style, там отлично описано когда надо и когда не надо применять goto.
     
     
  • 3.16, Аноним (-), 09:32, 09/06/2018 [^] [ответить]    [к модератору]  
  • +/
    >Достаточно посмотреть Linux kernel coding style, там отлично описано когда надо и когда не надо применять goto.

    И статью в русской Википедии про goto.

     
  • 1.14, Андрей (??), 04:46, 05/06/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    > код библиотеки libcsi

    Не отдельным репозиторием. Неудобно.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:


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