The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Критическая уязвимость в криптографической библиотеке Libgcr..."
Отправлено Ordu, 30-Янв-21 23:55 
> А void* примерно как unsafe в расте.

Нет. unsafe в расте позволяет лишь две особые вещи: вызов unsafe функции и разадресацию raw-указателя. Собственно для этого и используется. void* же в C используется для полиморфизма, потому что система типов иначе не умеет. То есть вещи, которые вообще-то не являются небезопасными делаются программистом небезопасными, потому что иначе никак.

Например, в libc есть функция qsort:

       void qsort(void *base, size_t nmemb, size_t size,
                  int (*compar)(const void *, const void *));

Программист вызывающий функцию должен сам всё чётко проверить, чтобы если base имеет тип T*, то compar был бы типа int (*)(const T*, const T*). Он должен проверить, чтобы nmemb был бы равен количеству элементов в массиве. Чтобы size был бы равен sizeof(T). Эти проверки вполне возможно выполнить, но когда эти проверки надо выполнять на каждом шагу, то некоторые неизбежно выполняются ошибочно. Или они станут ошибочными после каких-то изменений.

Хотя параметрическая типизация легко спасает от этого, в гипотетическом C с темплитами это могло бы выглядеть так:

template<T> void qsort(T* base, size_t nmemb, int (*compar)(T*, T*));

Видишь? Теперь единственный способ ошибиться -- это передать кривой nmemb. Накосячить с типами невозможно, потому что когда ты присунешь в вызов функции указатели на массив и на функцию, компилятор проверит, чтобы их типы соотносились бы определённым образом. А если ещё добавить идею слайса (нисколько не динамического массива, но "знающего" свой размер), как структурки вида {T* base; size_t nmemb}, и заменить ими C'шные массивы, то тогда ещё проще, и компилятор выполнит все проверки:

template<T> void qsort(T base[], int (*compar)(T*, T*));

И теперь уже совершить ошибку невозможно. Ошибка может быть зарыта в qsort, который может, например, выходить за границы переданного слайса, но это вряд ли. И надо будет исхитряться, чтобы такой qsort заставить сделать что-нибудь плохое: надо как-то создать кривой слайс base, но если создание слайсов и подслайсов выполняется операциями известными компилятору, который может проверить во время компиляции, что подслайс целиком содержится в слайсе, то придётся реально исхитрятся чтобы создать кривой слайс. Это легко сделать злоумышленно, но случайно скорее всего не выйдет.

И, заметь, это даже без деления кода на safe/unsafe, просто изменена система типов: в неё добавлены параметризованные типы и слайсы. void* в C нужен как костыль для полурабочей системы типов, потому как без него она не юзабельна.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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