Сережа
мне кажется что контракты это один из видов сдерживания
Сережа
поэтому я так написал
Сережа
я погуглил, видимо в плюсах это оффициальные термины, рассматриваются к включения в С++20
Сережа
http://en.cppreference.com/w/cpp/language/constraints
Сережа
это не то что я думал а ограничение при автоматическом выводе типа или типа возвращаемого функцией, явно указанное в коде
Loyd
То, что ты думаешь, в крестах называется концептами
Vladimir
Это контракты уровня компиляции
Kerrigan
кажется у меня тоже тот код сегфолтится
Alexey
вообще молча?
Vladimir
Сегфолтится или стаковерфловится
Kerrigan
ща
Kerrigan
$ cargo build Compiling segfault v0.1.0 (file:///tmp/segfault) Finished dev [unoptimized + debuginfo] target(s) in 0.24 secs $ ./target/debug/segfault thread 'main' has overflowed its stack fatal runtime error: stack overflow zsh: abort (core dumped) ./target/debug/segfault
Kerrigan
но в релизной сборке ок
Kerrigan
1.23.0 stable
Vladimir
Ну видишь
Vladimir
Оверфлоу
Vladimir
А не сегфолт
Sergey
У меня одного телега как сука лагает?
Kerrigan
у меня тоже
Vladimir
И у меня
Kerrigan
дык это ведь ок. или нет?
оно разве должно вызывать сегфолт?
Loo
У меня одного телега как сука лагает?
у меня ок всё (арчик возможно виноват)
Loo
а нет. нихуя. при отправке сообщений задержка есть
Sergey
у меня ок всё (арчик возможно виноват)
Ты так ркн ласково называешь?
Alexey
а там же не сегфолт, а корка
Alexey
а корка - это хорошо!
Alexey
корку потом посмотреть можно
Vladimir
оно разве должно вызывать сегфолт?
Да нет там сегфолтов блять
Vladimir
Сигналы разные бывают
Loo
надеюсь павел таки не даст вложится мэйл рушникам
Vladimir
а там же не сегфолт, а корка
Сегфолт тоже корку сохраняет
Loo
тогда точно будет звездец
Vladimir
Просто сегфолт это всего один сигнал
Vladimir
Vladimir
Да и ico - акционеры не влияют ни на что
Kerrigan
т.е. я могу дернуть сигнал собрать корку без сегфолта?
Vladimir
т.е. я могу дернуть сигнал собрать корку без сегфолта?
Ну кор дамп поидее при любом аборте в случае настроек gcc не?
պլհկ
kill -SEGV
Victor
за дампы отвечает хендлер сигнала. По умолчанию (то что операционка дёргает если не назначено иного) вполне конкретные сигналы приводят к формированию дампов. Если, конечно, в операционке настроено формирование дампов вообще так-то его отключить можно.
պլհկ
ulimit -c unlimited kill -SEGV $$ наблюдаем корку … PROFIT
Kerrigan
ладно, я обещаю больше не выделять дохулиард байтов на стеке //на самом деле нет
Vladimir
BREAKING NEWS: rust падает при выделении большого количества памяти
Vladimir
Может ещё с oom уроним и го на Раст бузить
Alexey
"A panic in Rust is not always implemented via unwinding, but can be implemented by aborting the process as well."
Vladimir
Воу воу
Vladimir
И что теперь делать?
Alexey
Но вообще, breaking news в том, что, кажется, иногда бывает просто сегфолт, без паники.
Vladimir
Попробуй вне майна
Alexey
уже. все равно abort зовется
Alexey
без раскрутки стека
Victor
вообще интересно. Например gcc умеет считать сколько каждая функция аллоцирует на стеке (см. -fstack-usage). Почему бы не проводить анализ в момент запуска, например, и сразу говорить что грядёт нехорошее?
big
но там не должно быть сегфолта
big
там безусловный (т.е. не зависящий на параметр -C panic=) аборт
Alexey
ну, у меня вот abort с коркой. У @sarakerrigan тоже. Сегфолта я пока не видел ни у кого, кроме топикстартера треда вот этого: http://juick.com/zinid/2894418
senpos
Здравствуйте. Пытаюсь освоить error-handling. Есть простая функция для подсчета количества символов, которые идут подряд: fn count_followed_chars(string: &str) -> u16 { let mut total = 0u16; for (ch1, ch2) in string.chars().zip(string.chars().skip(1)) { if ch1 == ch2 { total += 1; } } total }Все работает. Но хочу, например, выдавать ошибку, если количество символов в string меньше двух (исскуственный пример). Прочитал про Result. В документации нашел пример функции: #[derive(Debug)] enum Version { Version1, Version2 } fn parse_version(header: &[u8]) -> Result<Version, &'static str> { match header.get(0) { None => Err("invalid header length"), Some(&1) => Ok(Version::Version1), Some(&2) => Ok(Version::Version2), Some(_) => Err("invalid version"), } } let version = parse_version(&[1, 2, 3, 4]); match version { Ok(v) => println!("working with version: {:?}", v), Err(e) => println!("error parsing header: {:?}", e), } Попытался составить что-то похожее для своей: fn count_followed_chars(string: &str) -> Result<u16, &'static str> { if string.chars().count() < 2 { Err("Incrorrect length of string: should be 2 or more"); } let mut total = 0u16; for (ch1, ch2) in string.chars().zip(string.chars().skip(1)) { if ch1 == ch2 { total += 1; } } Ok(total) } Но видать, я не в ту сторону пошел. Подскажите, каким образом сделать данную проверку на количество символов в строке и вернуть ошибку наружу.
big
там вообще плохой аксес
big
thread 'main' has overflowed its stack fatal runtime error: stack overflow [1] 94982 abort ./main
big
у меня макос, [1] 94982 abort ./main такую хрень он пишет не спроста
big
LLDB подтверждает, стейкпроб делает плохой акксес
Victor
Здравствуйте. Пытаюсь освоить error-handling. Есть простая функция для подсчета количества символов, которые идут подряд: fn count_followed_chars(string: &str) -> u16 { let mut total = 0u16; for (ch1, ch2) in string.chars().zip(string.chars().skip(1)) { if ch1 == ch2 { total += 1; } } total }Все работает. Но хочу, например, выдавать ошибку, если количество символов в string меньше двух (исскуственный пример). Прочитал про Result. В документации нашел пример функции: #[derive(Debug)] enum Version { Version1, Version2 } fn parse_version(header: &[u8]) -> Result<Version, &'static str> { match header.get(0) { None => Err("invalid header length"), Some(&1) => Ok(Version::Version1), Some(&2) => Ok(Version::Version2), Some(_) => Err("invalid version"), } } let version = parse_version(&[1, 2, 3, 4]); match version { Ok(v) => println!("working with version: {:?}", v), Err(e) => println!("error parsing header: {:?}", e), } Попытался составить что-то похожее для своей: fn count_followed_chars(string: &str) -> Result<u16, &'static str> { if string.chars().count() < 2 { Err("Incrorrect length of string: should be 2 or more"); } let mut total = 0u16; for (ch1, ch2) in string.chars().zip(string.chars().skip(1)) { if ch1 == ch2 { total += 1; } } Ok(total) } Но видать, я не в ту сторону пошел. Подскажите, каким образом сделать данную проверку на количество символов в строке и вернуть ошибку наружу.
return Err(".... 2 or more");
big
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7fff5f400620) frame #0: 0x000000010004129a main`compiler_builtins::probestack::__rust_probestack at probestack.rs:55 [opt]
Alexey
ну да. это вроде бы как-то штатно. как топикстартер умудрился получить именно сегфолт - я хз
big
погодите
big
разве EXC_BAD_ACCESS не тоже самое что и SEGFAULT?
senpos
return Err(".... 2 or more");
Спасибо! Сработало.
big
разве EXC_BAD_ACCESS не тоже самое что и SEGFAULT?
я имею ввиду первый аналог второго
Alexey
А вот у еще одного человека просто сегфолт: http://juick.com/zinid/2894418#54
Alexey
ndtimofeev@900x3c ~/foo $ cargo run Compiling foo v0.1.0 (file:///home/ndtimofeev/foo) warning: unused variable: `array` --> src/main.rs:3:9 | 3 | let array: [u8; SIZE] = [0; SIZE]; | ^^^^^ | = note: #[warn(unused_variables)] on by default Finished dev [unoptimized + debuginfo] target(s) in 0.71 secs Running `target/debug/foo` Ошибка сегментирования ndtimofeev@900x3c ~/foo $
big
а аборт с коркой это не сегфолт чтоли?
big
энивей, что здесь происходит, так это stackprobe врезается в guardpage
big
guardpage анмапяться (или мапятся спец образом?) такимобразом что когда их трогают (что собственно стакпроб и делает) ОС это не нравится и она выплевывает либо сегфолт либо че там у системы заготовлено на такой случай
Маjко
Сегфолтится или стаковерфловится
Оверфлоу -- подтип сегфолта, алё
Маjко
С каких пор?
С самого начала
Vladimir
Segmentation fault, в стек оверфлоу это не обращение