LINUX.ORG.RU
ФорумTalks

Как в русте борятся в переполнением стека?

 , программировай


0

3

прочитал тут, что в русте по умолчанию все выделяется на стеке. Разве это не еррорпрон от которого все страдали 20лет назад с рандомно вылетаюшими программами? Как безопасносте помогает решать подобные кейсы реального использования?

★★★★★

Последнее исправление: Syncro (всего исправлений: 1)

Просто: в русте запрещены переполнения стека. Еретиков поддают анафеме.

beastie ★★★★★
()
Ответ на: комментарий от ya-betmen

Stack - это структура данных, работающая по принципу LIFO. Последний элемент, который был помещен в стек, будет первым извлеченным. В Rust все данные размер которых известен на этапе компиляции и не изменяется во время выполнения программы, обычно хранятся на стеке. Это включает примитивные типы (как i32, f64), фиксированные массивы, кортежи с элементами известного размера и структуры без динамических элементов.

Syncro ★★★★★
() автор топика

Разве это не еррорпрон от которого все страдали 20лет назад с рандомно вылетаюшими программами?

Прямо рандомно?

Как безопасносте помогает решать подобные кейсы реального использования?

Никак. Проблема исчерпания памяти нерешаема. Другой вопрос, что падает корректно, сообщая об ошибке. А не с сегфолтом.

$ cat overflow.rs 
fn f(n: u64) {
  println!("{}\n", n);
  f(n + 1)
}

fn main() {
  f(0)
}
$ rustc overflow.rs     
warning: function cannot return without recursing
 --> overflow.rs:1:1
  |
1 | fn f(n: u64) {
  | ^^^^^^^^^^^^ cannot return without recursing
2 |   println!("{}\n", n);
3 |   f(n + 1)
  |   -------- recursive call site
  |
  = help: a `loop` may express intention better if this is on purpose
  = note: `#[warn(unconditional_recursion)]` on by default

warning: 1 warning emitted

$ ./overflow > /dev/null

thread 'main' (1335857) has overflowed its stack
fatal runtime error: stack overflow, aborting
[1]    1335857 abort (core dumped)  ./overflow > /dev/null
hateyoufeel ★★★★★
()
Ответ на: комментарий от madcore

а кто тебе сказал, что там не возникает сегфолта?

Да, ты прав. Я проверил в GDB, там свой обработчик сигнала вставлен.

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

Там специальная guard page заводится в конце стека, она в память не замаплена и при обращении к ней срабатывает сегфолт.

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

до чего прогресс дошёл, какой-нить турбопаскаль такое умел лет 40 на зад
да и тут ничто не мешает повесить свой обработчик исключения

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

Да, не является, но раст гарантирует что она всегда будет. Я уже плохо помню, но на какой-то платформе был баг что guard страница не создавалась и ради этого фикса даже отдельный минорный релиз выпустили.

pftBest ★★★★
()

все страдали 20лет

Растовики решили эту проблему путём несуществования раста 20 лет назад.

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

gp - это вообще функция ос, а все те детали зависят от архитектуры, модели памяти, abi итп
для раста работают те же самые механизмы mmu

madcore ★★★★★
()

Разве это не еррорпрон от которого все страдали 20лет назад с рандомно вылетаюшими программами?

А потом придумали ulimit -s?

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

А потом придумали java

Пофиксил, не благодари.

Ygor ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)