The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Фронтэнд для языка Rust доведён до готовности для интеграции в GCC 13, opennews (??), 06-Дек-22, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


170. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +1 +/
Сообщение от Аноним (-), 07-Дек-22, 11:28 
#include <iostream>
#include <memory>

int main() {
    auto i = std::unique_ptr<int>(new int);
    *i = 5;
    std::cout << "i = " << *i << "\n";
    std::unique_ptr<int> j = move(i);
    std::cout << "i = " << *i << "\n";
        // можно написать return 0, но бестолку, потому что предыдущая строчка сегфолтнется
}

Смартпоинтеры не дают никаких гарантий, они лишь немного упрощают статический анализ.

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

187. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (187), 07-Дек-22, 14:29 
А зачем ты читаешь из перемещённого указателя?
Ответить | Правка | Наверх | Cообщить модератору

189. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (189), 07-Дек-22, 14:37 
Чтобы показать, что C++ ничего не гарантирует. Программист на C++ может гарантировать, но только на словах: "мамойклянус". А C++ не гарантирует ничего.
Ответить | Правка | Наверх | Cообщить модератору

195. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  –1 +/
Сообщение от AlexCr4ckPentest (?), 07-Дек-22, 14:47 
Гений инвалидировал указатель, создав для него moved-from state контекст, это черным по белому прописанно в стандарте. Почитай, что такое moved-from sate и почему у тебя тут сегфолт, а потом уже ной, что ты не знаешь стандарта.
Ответить | Правка | Наверх | Cообщить модератору

197. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (197), 07-Дек-22, 15:08 
> Почитай, что такое

Скажи мне, ты действительно настолько тупой, что не понимаешь, что код был скрафчен руками так, чтобы показать UB, и сделано это было с опорой на знание дебилизма стандарта C++?

> Гений инвалидировал указатель

Не надо лести, любой программист прочитавший стандарт сможет сделать то же самое, чтобы продемонстрировать, что при разработке на C++ только программист может что-либо гарантировать, C++ не гарантирует ничего.

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

202. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +2 +/
Сообщение от AlexCr4ckPentest (?), 07-Дек-22, 15:49 
Почти аналогичный код на твоем любимом и "самом безопасном" расте.

use std::ptr;

pub fn main() {
    unsafe {
        let ptr: *mut i32 = std::ptr::null_mut();
        *ptr = 111;
        println!(*ptr);
    }
}

Догадайся, что будет выведено на экран?
Это еще кстати к слову об "отсутствии" nullptr )

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

203. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +1 +/
Сообщение от AlexCr4ckPentest (?), 07-Дек-22, 15:52 
Интересно, если в документации у растоманов это помечено как UB, для них это типа не счиатеся UB?
P.S:
Разумеется, println! принимает формат-строку: по этому коррентнее будет println!("{}", *ptr)
Ответить | Правка | Наверх | Cообщить модератору

216. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от анон (?), 07-Дек-22, 18:30 
Ничоси! 11 метровый файл на выходе!! Что за нах?
Ответить | Правка | К родителю #202 | Наверх | Cообщить модератору

218. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 07-Дек-22, 18:51 
> Ничоси! 11 метровый файл на выходе!! Что за нах?

У меня около 9.2 МиБ получился.

А это вот раст, который "легковесный" и в котором все "безопасно" и "без оверхеда" )
Как у них круто реализована концепция "Не платим за то, что не используем".
Вообще у меня такое ощущение, будт-то компилятор туда еще и отладочную информацию запихнул, хотя флаг -g не выставлен.

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

238. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +1 +/
Сообщение от Прохожий (??), 08-Дек-22, 08:15 
Если бы ты, кроме форума, читал ещё документацию по обсуждаемому предмету, то  знал, что это так и есть. По умолчанию компилятор впихивает отладочную информацию и использует статическую линковку. Если нужно, всё это отключаемо. Но чукча (точнее очередной опеннетный "эксперт") не читатель.
Ответить | Правка | Наверх | Cообщить модератору

239. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 08-Дек-22, 10:31 
> По умолчанию компилятор впихивает отладочную информацию и использует статическую линковку. Если нужно, всё это отключаемо.

Ну, собственно, этим все и сказано. Опять эти "если не нужно - не используй" и тп...
То есть получается, раст не умеет в принципы KISS и "не платим за то, что не используем".
Как жаль, ведь столько громких заявлений было про него.

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

241. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 08-Дек-22, 11:05 
> Если бы ты, кроме форума, читал ещё документацию по обсуждаемому предмету, то
>  знал, что это так и есть. По умолчанию компилятор впихивает
> отладочную информацию и использует статическую линковку. Если нужно, всё это отключаемо.
> Но чукча (точнее очередной опеннетный "эксперт") не читатель.

Кстати, а почему бы не пойти дальше, и не запихать вообще все "так нужные" библиотеки в core раста?
Ну а что, было бы удобно: и 100500 реализаций спецификации OpenGL, чтобы GUI рисовать, например.
Вот почему линковаться статически научились по умолчанию, а в реализацию компилятора под такое же кол-во архитектур и написание собственного рантайма без libc - не смогли?

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

234. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Прохожий (??), 08-Дек-22, 07:59 
По умолчанию в программу включается отладочная информация. Плюс используется статическая линковка. Всё это можно отключить при необходимости. Об этом уже на этом сайте говорилось огромное количество раз.
Ответить | Правка | К родителю #216 | Наверх | Cообщить модератору

229. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +3 +/
Сообщение от anonymous (??), 08-Дек-22, 02:39 
Так ты ж сам написал unsafe. Зачем?
Сделай UB без unsafe, тогда поговорим
Ответить | Правка | К родителю #202 | Наверх | Cообщить модератору

235. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +1 +/
Сообщение от Прохожий (??), 08-Дек-22, 08:03 
Похоже, твой оппонент таки был прав. Ты реально глуп. В Расте, если не использовать unsafe, ты подобного не напишешь. В плюсах у тебя нет никаких опций для этого.
Ответить | Правка | К родителю #202 | Наверх | Cообщить модератору

240. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 08-Дек-22, 10:57 
> Похоже, твой оппонент таки был прав. Ты реально глуп. В Расте, если
> не использовать unsafe, ты подобного не напишешь. В плюсах у тебя
> нет никаких опций для этого.

Похоже, мой оппонент немного фанатик псевдо-безопасного раста, раз пишет подобные заявления.
Использование unsafe контекста для данного примера как раз необходимо, чтобы создать одинаковые условия для сравнения языков, и что их любимый и "самый безопасный" язык точно так же не дает __никаких__ гарантий относительно точно такого же unsafe кода.

Как-то опять двойные стандарты пошли: программистам на расте можно говорить что-то про UB в C++, а вот если им начинаю предъявлять за самые глупые ошибки даже в их собственной стандартной библиотеке и про ровно точно такой же код в unsafe, то они плачут и оправдывают это словами "ну это же логическа ошибка" и "по умолчанию так нельзя" и бла-бла-бла.

Кстати, почему вы вообще сравниваете С++ и Rust? По-моему это вообще никак не сравнимо, это абсолютно 2 разных языка с разными подходами к их использованию.

Я согласен, проверка всего этого в compile-time - это здорово, но не нужно это возносить как средство от всего. Кроме того, существование подобной штуки в языке наоборот препядствует адекватному восприятию безопасного кода (логические и семантически ошибки твои compile-time проверки никак не исправят). Не надо натягивать маску клоуна, чтобы выступать в цирке.

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

250. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (-), 08-Дек-22, 13:27 
> Использование unsafe контекста для данного примера как раз необходимо

Нет, оно нужно для того, чтобы у тебя появилась возможность заменить смарт-поинтеры raw-указателями.

Попробуй скомпилять вот это, вот тебе unsafe но со смарт-поинтерами:

fn main() {
    unsafe {
    let i = Box::new(5i32);
    println!("i = {i}");
    let _j = i;
    println!("i = {i}");
    }
}

Этот код не компилируется:

rustc tmp.rs
error[E0382]: borrow of moved value: `i`
--> tmp.rs:6:17
  |
3 |     let i = Box::new(5i32);
  |         - move occurs because `i` has type `Box<i32>`, which does not implement the `Copy` trait
4 |     println!("i = {i}");
5 |     let _j = i;
  |              - value moved here
6 |     println!("i = {i}");
  |                    ^ value borrowed here after move
  |

Попробуй найти способ получить в i невалидный указатель, разадресация которого приведёт к UB. Используй unsafe или не используй, как тебе покажется удобнее. Вот когда ты найдёшь такой способ, я смогу тебе на нём объяснить, чем смарт-поинтеры Rust'а лучше C++. А пока не найдёшь, тебе придётся оставаться в неведении.

> Кстати, почему вы вообще сравниваете С++ и Rust?

А ты зачем сравниваешь C++ и Rust? Ты тут самый активный участник обсуждения, и вдруг ты начинаешь всех обвинять, что они это обсуждение ведут. У тебя какая-то конкретная некогерентность в поведении наблюдается.

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

257. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 08-Дек-22, 15:41 
>> Использование unsafe контекста для данного примера как раз необходимо
> Нет, оно нужно для того, чтобы у тебя появилась возможность заменить смарт-поинтеры
> raw-указателями.
> Попробуй скомпилять вот это, вот тебе unsafe но со смарт-поинтерами:

Вот код на расте: https://godbolt.org/z/8hPrK7ddv
Вот аналогичный код на C++: https://godbolt.org/z/j63E6jh4o
И там, и там - это ошибка компиляции, дальше что?

> Попробуй найти способ получить в i невалидный указатель, разадресация которого приведёт к UB.

Любой volatile указатель, или указатель, который используется в коде на C. Очевидно, если он приходит от C API, то управляешь им не ты, а значит нужно использовать "сырые" указатели, относительно которых нету гарантий.

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

262. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (-), 08-Дек-22, 17:17 
> Вот код на расте

Сори. Там js нужен, у меня не работает.

Но, глядя вот на это:

> И там, и там - это ошибка компиляции, дальше что?

Я могу сказать тебе, что ты аргумент совершенно определённо пытаешься выставить кривым образом. Если C++ код можно написать так, чтобы он фейлился на этапе компиляции, когда программист попросил сделать что-то глупое, то Rust-код нельзя написать так, чтобы он не фейлился на этапе компиляции, когда программист попросил сделать что-то глупое.

Вчитайся в эту фразу. Я её укоротил как мог, чтобы тебе проще логику было бы применять. Оно из-за этого не совсем верное стало: я выкинул оговорку об ограничении классов глупостей программистов. Но ты тем не менее вчитайся, и пойми что приводя примеры когда C++ что-то ловит на этапе компиляции ты ничего не докажешь. Тебе надо показать, что невозможно написать код на смартпоинтерах C++, который не сфейлится на компиляции но сфейлится в рантайме.

> Любой volatile указатель, или указатель, который используется в коде на C.

В смысле смарт-поинтер, или raw-поинтер? Если второе, то тебя опять заносит в raw-поинтеры, хотя мы говорим о смарт-поинтерах. Если первое... Ну я не знаю, например, может ты можешь рассказать как взять raw-pointer, который по логике volatile, завернуть его в Volatile[1], и потом получить UB, работая с Volatile, то расскажи нам об этом. Или может у тебя в голове какой-то другой сценарий? Расскажи нам об этом.

[1] https://docs.rs/volatile/latest/volatile/

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

259. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от AlexCr4ckPentest (ok), 08-Дек-22, 15:52 
> Этот код не компилируется ...

Так же некоторый вопрос: чем же смарт-поинтеры в расте лучше, если компилятор зачем-то перемещает состояние, когда копирование запрещено? Причем делает это неявно, даже не выдавая диагностики.
Хотя C++, например, это вообще-то ошибка компиляции, и компилятор обязан выдать диагностику.

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

260. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (-), 08-Дек-22, 16:24 
> компилятор зачем-то перемещает состояние, когда копирование запрещено?

Компилятор перемещает, потому что я попросил его переместить значение. Я в курсе что Copy не реализован для Box'а, в этом фишка Box'а, это смарт-поинтер, а не член собачий. Box гарантирует, что он будет в единственном экземпляре. Если бы мне нужно было клонировать, я бы сделал:

let j = i.clone();

Но тогда я бы получил вторую аллокацию памяти и в i и j лежали бы разные Box<i32>, которые по значению бы совпадали, но были бы разные. В терминах lisp'а, они были бы equal, но не eq.

> Причем делает это неявно,

Да, это дефолтное поведение типов в ответ на =, описанное в любом материале для личинок растоманов. Clone и Copy -- это дополнительные трейты, которые разработчик этих типов может навешивать на них, а может нет. Таким образом move -- это дефолт в расте.

Но это иррелевантно нашему разговору, разговор о том, что UB не возникает. И ты так и не придумал, как его создать на смарт-поинтерах.

Или может не совсем иррелевантно... Это ведь суть отличий смарт-поинтеров C++ и Rust'а, так? Та самая суть которая делает смарт-поинтеры Rust'а смарт-поинтерами, и оставляет смарт-поинтеры C++ членами собачьими.

> даже не выдавая диагностики.

Ты в глаза долбишься, или что? Я тебе привёл диагностику. Не всю, там ещё хинты всякие для нубов, что можно сделать чтобы код скомпилировался, но я и не стал копировать.

> Хотя C++, например, это вообще-то ошибка компиляции, и компилятор обязан выдать диагностику.

В C++ это не ошибка компиляции, выше по треду есть аналогичный C++ код, и компилятор C++ его радостно компилирует и выдаёт на выходе бинарь. А вот в Rust'е это ошибка, и раст как раз выдаёт ошибку компиляции и диагностику.

Ты чо, крeмлeвcкoй пpoпaгaнgы пересмотрел, и решил что обвинять других в своих грехах -- это хороший способ вести дискуссию? Нет, это может быть эффективным способом пpoпaгaнgы -- не знаю, но в дискуссии тебя будут макать в чан с известной субстанцией за каждую такую попытку.

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

273. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (-), 10-Дек-22, 02:37 
> move occurs because `i` has type `Box<i32>`, which does not implement
> the `Copy` trait

Вот чем rust приколен так это абсолютно марсианской диагностикой.

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

276. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (-), 10-Дек-22, 11:40 
Это не марсианский, это английский.
Ответить | Правка | Наверх | Cообщить модератору

242. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Аноним (242), 08-Дек-22, 11:11 
Санитайзер, да даже clang-tidy тебе об этом скажет
Ответить | Правка | К родителю #170 | Наверх | Cообщить модератору

252. "Фронтэнд для языка Rust доведён до готовности для интеграции..."  +/
Сообщение от Вы забыли заполнить поле Name (?), 08-Дек-22, 14:16 
clang-tidy скажет об этой ошибке

> used after it was moved [bugprone-use-after-move,-warnings-as-errors]

не говоря уже о санитайзерах.

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

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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