и если не писать unsafe не будет никакого уб как в том же С++, у меня вопрос, что произойдет если я передам в binary_search_by коллекции компаратор не соблюдающий частичный порядок, значит не соблюдён инвариант алгоритма, хотя он заявлен, при этом не будет никакой ошибки так как это невозможно определить никакими способами известными науке, это получается УБ?
UB - состояние программы, которое приводит к неопределенному (читай - неизвестному) поведению исполняемой программы. Если функция может произвести UB она помечена как unsafe. Если помечена как safe она не должна вызывать UB (есть недобросовестные разработчики которые это правило не соблюдают, но таким надо давать по шапке и таких мало).
я спрашиваю про конкретную функцию, она safe с точки зрения стандартной библиотеки раста?
Если не помечена как unsafe - она safe.
https://doc.rust-lang.org/reference/behavior-considered-undefined.html
что я там узнаю?
Он новичок в расте а ты ему тычешь плохо описанный кусок недо-референса. Не надо так.
да. логические ошибки по определению раста безопасны
что конкретно считается UB
В котором, помимо всего прочего, описано меньше половины возможных UB
Там список далеко не exhaustive
А вот это уже интереснее
но представление о том, что это такое, дает
Результат будет unspecified, как в любой разумной реализации
я из С++ знаю что такое уб
Почитай статьи "undefined behavior vs unspecified behaviour"
но тогда у алгоритма нет никакого инварианта, он может выдать что угодно всегда, если не гарантирует результат
Алгоритм гарантирует результат при соблюдении входных инвариантов. При несоблюдении требований же он выдает бесполезные данные. Все верно, так везде и всегда.
а чем это отличается от "не обращайтесь по nullptr"?
Будет то же самое, что и если применить бинарный поиск к несортированным данным — логическая ошибка, вернется какой-то элемент или, возможно, будет паника (implementation defined). Функция при этом все равно safe: она не вернет ссылку на невалидную память, не запишет ничего за пределы массива и проч.
В случае конкретно этой функции если у тебя неправильный компаратор, то тебе могут вернуть "странный" результат. Условно рандомный элемент. Это safe. Некорректный ввод и некорректный вывод. Чего не будет, так это порчи памяти и ли результата из рандомного участка памяти. Ну если твой компаратор safe.
значит ли это что сама функция ничего не гарантирует?
порядок не гарантирует
Софистика Сформулируйте инвариант, который вы оспорить пытаетесь (2)
Косячная реализация, которую алгоритм намеренно не учитывает: бессмысленный, но детерминированный в пределах фиксированной версии стандартной библиотеки результат. Разыменование нулл поинтера: возможно что угодно. Любое поведение, в любой момент исполнения работы программы (иной раз и за пределами), которое способно непредсказуемо меняться.
Обсуждают сегодня