Если в ансейф блоках нету сложных зависимостей, то это скорее всего тривиальные обёртки на си библиотекой. Проблемы у вас будут со сложными случаями, а там синтаксический мусор вроде unsafe_unchecked и ужасная эрогономика сырых указателей только мешают. Недавно слышал историю что пришлось ансейф код с раста переписать на си, чтобы его можно было удобно прочесть и отладить. Потом исправленную реализацию запихнуили обратно в раст.
Эти два пункта вообще не связаны, кок и мири это два разных подхода.
И тем не менее:
и тем не менее в тех директориях гита просто кодоген который гоняет код из одной репрезентации в другую. Каким образом он что то верифицирует?
Каким образом Miri заимствован из C++
зачем вы пытаетесь передергивать? И ежу очевидно что мой комментарий был про все остальные сантайзеры из вашего пункта (3). По miri это был пункт (1). Но рад что вы согласились что мири это санитайзер а не формальная верификация.
Кстати модель ссылок StackedBorrows в нем формально верифицирована.
Речь о проверке кода, при чём тут верификация какой-то модели? Вы сели в лужу со своим предыдущим тезисом и теперь пытаетесь приплести слово верификация хоть куда-то.
Если вы хотите вернуть разные ренжи в зависимости от рантайм значения, то задача требует динамического диспатча. Смысла в этом мало, если вы уже передаёте pred, то что мешает передать сразу консьюмера результирующего ренжа? В отличии от динамеческих языков в С++ нам не нужно стирать тип, информация о всём пайплайне трансформаций сохранятеся и может быть использована.
Это не годится. У вас на каждую случай свое имя как в си. Так я не могу написать обобщенный алгоритм который принимает как конечный так и бесконечный интервал.
Во-первых неудобно, везде в других языках просто пишем iota(5, 10) или iota(5) не говоря уже про языки где есть именованные аргументы. Во-вторых у вас на тайплевеле потерялась информация о том закрытый ренж или открытый
miri это никакая не "формальная верификация" это санитайзер
coq уже больше похоже на правду, но реально им никто не пользуется
наличие санитайзеров для раст подтверждает что нифига формально не верифицировано и по факту для отлова уб используются утилиты заимствованные из С++. Только интеграция с раст там хуже.
Потму что ваши методы не должны принимать контейнеры, а должны принимать ренжи. Если код использующий контейнеры дженерик, то надо через algorithm работать
auto min(auto&& a, auto&& b) -> std::remove_reference_t<decltype(a)>
requires std::is_rvalue_reference_v<decltype(a)> || std::is_rvalue_reference_v<decltype(b)> {
static_assert(std::is_same_v<std::remove_reference_t<decltype(a)>, std::remove_reference_t<decltype(b)>>);
return (a < b) ? std::forward<decltype(a)>(a) : std::forward<decltype(b)>(b);
}
template<typename T>
auto min(const T& a, const T& b) -> const T& {
return (a < b) ? a : b;
}
Или сделать всегда move() но это очень ограниченное решение.
У вас в голове контекст в одно сообщение? Идите прочтите тогда ветку сначала
Если в ансейф блоках нету сложных зависимостей, то это скорее всего тривиальные обёртки на си библиотекой. Проблемы у вас будут со сложными случаями, а там синтаксический мусор вроде unsafe_unchecked и ужасная эрогономика сырых указателей только мешают. Недавно слышал историю что пришлось ансейф код с раста переписать на си, чтобы его можно было удобно прочесть и отладить. Потом исправленную реализацию запихнуили обратно в раст.
Эти два пункта вообще не связаны, кок и мири это два разных подхода.
и тем не менее в тех директориях гита просто кодоген который гоняет код из одной репрезентации в другую. Каким образом он что то верифицирует?
зачем вы пытаетесь передергивать? И ежу очевидно что мой комментарий был про все остальные сантайзеры из вашего пункта (3). По miri это был пункт (1). Но рад что вы согласились что мири это санитайзер а не формальная верификация.
Речь о проверке кода, при чём тут верификация какой-то модели? Вы сели в лужу со своим предыдущим тезисом и теперь пытаетесь приплести слово верификация хоть куда-то.
Как обычно условия меняются находу.
Если вы хотите вернуть разные ренжи в зависимости от рантайм значения, то задача требует динамического диспатча. Смысла в этом мало, если вы уже передаёте pred, то что мешает передать сразу консьюмера результирующего ренжа? В отличии от динамеческих языков в С++ нам не нужно стирать тип, информация о всём пайплайне трансформаций сохранятеся и может быть использована.
Использовать. У вас в случае с енум на каждое использование ренжа будет теперь в рантайме бранч - есть/нет конечное значение.
Не вижу никакого абьюза. Все работает как изначально и задумывалось
Это не годится. У вас на каждую случай свое имя как в си. Так я не могу написать обобщенный алгоритм который принимает как конечный так и бесконечный интервал.
Ну вот на самом деле у вас и будет тысяча строк которые не работают без сахара в компиляторе и не реализуют половину фич из цпп.
Цпп iota имеет, а хаскель не имеет. Сравнение не уместно. Приходите с хаскель примером когда он это научится.
Греп ничего не даёт. Инвариант необходимый для ансейф блока зачастую приходит снаружи
Не сравнивайте свои списки с С++ ренжами
Во-первых неудобно, везде в других языках просто пишем iota(5, 10) или iota(5) не говоря уже про языки где есть именованные аргументы.
Во-вторых у вас на тайплевеле потерялась информация о том закрытый ренж или открытый
не годится
делается за пол секунды
А где хотя бы случай когда второй аргумет равен бесконечности? Где поддержка operator[i] у хаскель списка?
miri это никакая не "формальная верификация" это санитайзер
coq уже больше похоже на правду, но реально им никто не пользуется
наличие санитайзеров для раст подтверждает что нифига формально не верифицировано и по факту для отлова уб используются утилиты заимствованные из С++. Только интеграция с раст там хуже.
Ренжи по сравнению ч циклами дают инверсию контроля
Потму что ваши методы не должны принимать контейнеры, а должны принимать ренжи. Если код использующий контейнеры дженерик, то надо через algorithm работать
Можно как-то так сделать
Или сделать всегда
move()
но это очень ограниченное решение.Тут проблема в самом
std::min
, можно было бы сделать перегрузку для rvalue ссылок.