LINUX.ORG.RU

Rust 1.7

 


1

6

Команда Rust рада объявить о выпуске новой стабильной версии Rust 1.7. Rust является системным языком программирования, сосредоточенным на безопасности, быстроте и многопоточности.

В этой версии основные изменения коснулись библиотек. Изменения, связанные с языком, готовятся в будущих выпусках.

В версии 1.7 были стабилизированы около 40 библиотечных функций и методов. Одним из стабилизированных API является поддержка задаваемых пользователем алгоритмов хеширования в типе HashMap<K, V> стандартной библиотеки. Теперь можно достигнуть значительного быстродействия за счёт возможности смены и использования более быстрого алгоритма хеширования.

Другие изменения:

  • <[T]>::clone_from_slice(), эффективный путь копирования данных из одного среза в другой срез.
  • Методы для удобства работы с Ipv4Addr и Ipv6Addr, такие как is_loopback(), который возвращает true или false, в зависимости от того, является ли адрес петлевым адресом, согласно RFC 6890.
  • Улучшения в CString, используемом в FFI.

Детальный RELEASE NOTES: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-170-2016-03...

>>> Анонс в блоге Rust

★★★★★

Проверено: tailgunner ()
Последнее исправление: cetjs2 (всего исправлений: 3)
Ответ на: комментарий от anonymous

а вот рефлексия, например, в Java это то, что используется во все поля.

Да я не спорю, что штука полезная (бывает). В «джавовском виде» рефлексии в расте явно не будет, но тот же С++ живёт без рефлексии вообще. А вот на этапе компиляции можно через макросы изобразить, если так сильно хочется.

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous
thread '<main>' has overflowed its stack
playpen: application terminated abnormally with signal 11 (Segmentation fault)

Дефолтный размер стака у большинства дистров линукса 8Мб, это нормальное поведение.

anonymous
()
Ответ на: комментарий от anonymous

это нормальное поведение.

Нормальное поведение для языка, который гордо заявляет «guaranteed memory safety», - не напороться на Segmentation fault, а, например, бросить исключение как в Java.

anonymous
()
Ответ на: комментарий от tailgunner

У тебя какое-то свое понимание memory safety.

А у тебя какое-то свое понимание segmentation fault. Очевидно код на Rust полез за пределы стека.

anonymous
()
Ответ на: комментарий от anonymous

Очевидно код на Rust полез за пределы стека.

Я понимаю, что случилось. Это можно считать косяком, но это не нарушение memory safety.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Прикол, супербезопасный конпелятор не просек переполнение стека. А еще каких сюрпризов ждать?

anonymous
()
Ответ на: комментарий от anonymous

Прикол, супербезопасный конпелятор не просек переполнение стека

А как компилятор мог это просечь - он оракул?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Хотя это не тот пример, но переполнение стека он тоже ловит аналогично.

anonymous
()
Ответ на: комментарий от tailgunner

и это рантайм

Ну и ладно, всяко лучше чем попробовать записать по адресу, а там будь что будет.

anonymous
()
Ответ на: комментарий от anonymous

typically halts the program

Раст это и делает лол. При компиляции нет возможности во всех ситуациях анализировать и предсказать возможность переполнения, кроме того как это определить при компиляции, если размер стака можно перед запуском программы задать. А при работе программы при переполнении стака ты все равно не сможешь ничего сделать в треде с переполненным стаком - потому что там, сурпайз, стак инвалидный.

Но если стак переполнится в дочернем треде, то ты можешь обработать эту ситуацию в родительском и предпринять желаемые действия по этому поводу.

https://en.wikipedia.org/wiki/AddressSanitizer#Stack-buffer-overflow

1) Тут вообще используется адресация за пределом массива, от чего раст как раз таки защищает.

2) Тут ошибка во время чтения, а не аллокация как в примере с ошибкой раста.

3) Это ошибка в рантайме, а не при компиляции. Собственно в чем разница?

anonymous
()
Ответ на: комментарий от anonymous

Нормальное поведение для языка, который гордо заявляет «guaranteed memory safety», - не напороться на Segmentation fault

Переполнение стака, так же как и паникующий unwrap - прямой признак ошибки в программе. Такая программа и не должна работать.

anonymous
()
Ответ на: комментарий от tailgunner

Но программа была halted, поэтому ошибка не привела к violation of memory safety.

Это не заслуга Rust:

«A guard page typically halts the program, preventing memory corruption, but functions with large stack frames may bypass the page.»

Это раз. Во-вторых берем:

fn main() {
    let x = [0u8; 1024 * 1024];
}

Смотрим выхлоп:

.Ltmp0:
	.cfi_def_cfa_offset 16
.Ltmp1:
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
.Ltmp2:
	.cfi_def_cfa_register %rbp
	subq	$1048464, %rsp
	xorl	%eax, %eax
	movl	%eax, %ecx
	leaq	-1048576(%rbp), %rdx
	movq	%rdx, -1048584(%rbp)
	movq	%rcx, -1048592(%rbp)
.LBB0_1:
	movq	-1048592(%rbp), %rax
	movq	-1048584(%rbp), %rcx
	movb	$0, (%rcx,%rax)
	addq	$1, %rax
	cmpq	$1048576, %rax
	movq	%rax, -1048592(%rbp)
	jb	.LBB0_1
	.loc	1 3 0 prologue_end
.Ltmp3:
	addq	$1048464, %rsp
	popq	%rbp
	retq
.Ltmp4:

Оба-на, при инициализации код начинает писать значения с того адреса, с какого мы захотим, сразу перескочив и весь стек и «guard page».

anonymous
()
Ответ на: комментарий от anonymous

Переполнение стака, так же как и паникующий unwrap - прямой признак ошибки в программе. Такая программа и не должна работать.

Я вижу у Rust яже появилась своя минисекта.

anonymous
()
Ответ на: комментарий от anonymous

Но программа была halted, поэтому ошибка не привела к violation of memory safety.

Это не заслуга Rust

Memory safety не нарушена, но твое особое мнение занесено в протокол.

Я вижу у Rust яже появилась своя минисекта.

Зависть - плохое чувство.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Memory safety не нарушена

Нарушена. Внимательно смотри выхлоп на ассемблере выше, процесс может писать как угодно далеко за пределами стека. В том числе в память, которой пользуется другой тред.

Зависть - плохое чувство.

Было бы к чему.

anonymous
()
Ответ на: комментарий от tailgunner

Так бы и сказал, что ассемблер - слишком сложно, и вообще много букв, не осилил.

anonymous
()
Ответ на: комментарий от anonymous

Нарушена. Внимательно смотри выхлоп на ассемблере выше, процесс может писать как угодно далеко за пределами стека. В том числе в память, которой пользуется другой тред.

Это ошибка программиста. Если ты выделяешь 100500 элементов на стеке, будь добр, подгони стек под эти требования.

В семантике языка, Box::new([2i64; N]) означает:

  • Выделить на стеке size_of::<i64>() * N
  • Заполнить его 2
  • Выделить в куче size_of::<i64>() * N
  • Перенести значения из стека
anonymous
()
Ответ на: комментарий от tailgunner

Так уж и быть, в общем расскажу, что происходит. Стек на x86 растет вниз, а не вверх. Потому, когда Rust выделяет память под массив он уменьшает адрес на размер массива, пропуская и стек и «guard page». После чего идет инициализация значений массива. Только идет она не сверху-вниз как стек, чтоб сразу напороться на guard page и откинуться, а снизу-вверх. Т.е. мы можем произвести запись как угодно далеко за пределами стека. Да, после этого мы таки напоремся на segfault, но до этого мы некоторое время успешно будем портить память. Со всеми возможными последствиями.

anonymous
()
Ответ на: комментарий от anonymous

Это ошибка программиста.

А, ну тогда в C тоже безопасная работа с памятью. А если что - это ошибка программиста.

anonymous
()
Ответ на: комментарий от anonymous

А, ну тогда в C тоже безопасная работа с памятью. А если что - это ошибка программиста.

Ну ладно, ладно. Rust совсем не безопасный. Сколько стека то надо? 1 Мб? Мало? Ну давай тогда 1Гб? Опять мало? Ну давай тогда всю память под стек, тогда точно не упадёт.

anonymous
()
Ответ на: комментарий от anonymous

Ну ладно, ладно. Rust совсем не безопасный. Сколько стека то надо? 1 Мб? Мало? Ну давай тогда 1Гб? Опять мало? Ну давай тогда всю память под стек, тогда точно не упадёт.

Нисколько не надо, нужна проверка текущего.

https://msdn.microsoft.com/ru-ru/library/system.stackoverflowexception(v=vs.1...

anonymous
()
Ответ на: комментарий от anonymous

Нисколько не надо, нужна проверка текущего.

Так это есть.

thread '<main>' has overflowed its stack
fatal runtime error: stack overflow

Раньше был __morestack, но отказались, т.к. негативно сказывается на производительности.

Как ты будет проверять каждый указатель? Как это скажется на производительности?

Если выделяешь 100500 байт на стеке, побеспокойся чтобы он был достаточного размера.

anonymous
()
Ответ на: комментарий от anonymous

Как ты будет проверять каждый указатель? Как это скажется на производительности?

Зачем каждый?

Если выделяешь 100500 байт на стеке, побеспокойся чтобы он был достаточного размера.

Об этом может побеспокоиться и рантайм.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Об этом может побеспокоиться и рантайм.

Ну да, а потом рантайм позаботится и об управлением памятью... А стой...

anonymous
()
Ответ на: комментарий от anonymous

Об этом может побеспокоиться и рантайм.

Ну да, а потом рантайм позаботится и об управлением памятью...

А потом он убьет твою собаку.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Так это есть.
thread '<main>' has overflowed its stack
fatal runtime error: stack overflow

У меня rust такое пишет, только если устроить бесконечную рекурсию. Со слишком большим массивом тупо молча вываливается в сегфолт.

anonymous
()
Ответ на: комментарий от tailgunner

А потом он убьет твою собаку.

Я же не зову его на помощь. Пусть переживают те, кто его зовёт.

anonymous
()
Ответ на: комментарий от tailgunner

Они как раз не переживают ни о собаке, ни об управлении памятью.

Это неправда, собаку жалко.

anonymous
()
Ответ на: комментарий от anonymous

Не переживай, рантайм ее не убьет. И памятью управлять тоже не будет.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

У меня rust такое пишет, только если устроить бесконечную рекурсию. Со слишком большим массивом тупо молча вываливается в сегфолт.

В конце стека страница, обращение к которой и означает переполнение. Если массив больше 4Кб, то он её просто перескочит. Потом Rust попытается попортить память за пределами стека + 4Кб. Если она не отображена, то будет ошибка сегментации. Если отображена, то в любом (если не писать uninitialized) случае наткнётся на страницу и будет переполнение стека как в рекурсии.

anonymous
()
Ответ на: комментарий от DarkEld3r

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

Когда люди говорят о спасительном рефакторинге, в подавляющем большинстве случаев, ИМХО, он либо ещё не нужен, либо уже не нужен.

В первом случае на лицо каргокультизм, в втором — быдлокодерство (лучше клин-рум, чем разбор спагетти).

И да, сдается мне, что зависимость от рефакторинга есть последствия ООП гойловного моска. Вот цитата Степанова на эту тему:

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

shkolnick-kun ★★★★★
()
Ответ на: комментарий от shkolnick-kun

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

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

в подавляющем большинстве случаев

Мде.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

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

Так без меня есть кому её доносить :) Включи телевизор или там вконтактик открой, там отовсюду общество потребления лезетXDXDXDXD

shkolnick-kun ★★★★★
()
Ответ на: комментарий от shkolnick-kun

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

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

Так без меня есть кому её доносить :)

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

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.