vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Больше 10 лет программирую для *nix, и только сегодня совершенно случайно узнал, что оказывается, существует способ проверить, случится Segmentation Fault при обращении по определенному указателю, или нет.
Оказывается, если передать некорректный указатель (и соответствующий размер) в системный вызов write, он не пошлет программе SIGSEGV, а просто вернет EFAULT в errno. К сожалению, это не работает в случае, если этот файл связан с /dev/null. Но fileno(popen("cat >/dev/null")) прокатывает.

Date: 2008-02-01 08:33 pm (UTC)
From: [identity profile] bofhland.livejournal.com
Однако ж.

Сейчас проверим. )

Date: 2008-02-01 08:55 pm (UTC)
From: [identity profile] angry-elf.livejournal.com
чего только не придумают, только что б не юзать try-except :)

Date: 2008-02-01 09:07 pm (UTC)
From: [identity profile] angry-elf.livejournal.com
Хых. Ну, я не наезжаю на "другие" языки. Понятно, что у каждого своя ниша и каждый крутится как может...

Date: 2008-02-04 06:02 am (UTC)
From: [identity profile] vadiml.livejournal.com
в perl'e обычно хватает посмотреть в какой функции был segfault, если вызывается С-код, достаточно посмотреть bt в gdb

Date: 2008-02-01 11:36 pm (UTC)
From: [identity profile] max630.livejournal.com
какое отношение исклюения имеют к сигналу 11?

Date: 2008-02-01 11:41 pm (UTC)
From: [identity profile] angry-elf.livejournal.com
Да не, никаких. Спокойней только, без холивора :)

Я вот в питоне ни одного сигнала не перехватываю. А программа неубиваемая. Чудеса? :)

Date: 2008-02-02 01:18 am (UTC)
From: [identity profile] max630.livejournal.com
это просто никак не связанные вещи, и для холивора тут нет темы.

Date: 2008-02-04 06:03 am (UTC)
From: [identity profile] vadiml.livejournal.com
Вы видать не писали на питоне обертки для C/C++ :)

Date: 2008-02-04 10:18 am (UTC)
From: [identity profile] angry-elf.livejournal.com
Эээ... Да, согласен... Низлежащие сегфолты крайне неприятны :)

Но вот чистый питон.. !

Date: 2008-02-02 09:26 am (UTC)
From: [identity profile] blacklion.livejournal.com
Такое, что синхронные сигналы очень удобно представлять исключениями. MS'овский SEH так и работает — но только с их компилятором, конечно. И эти исключения ортогональны C++-исключениям и работают и в C тоже.

Date: 2008-02-02 03:52 pm (UTC)
From: [identity profile] max630.livejournal.com
кто такой "MS и их компилятор"? ;)

Date: 2008-02-02 06:47 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Microsoft и их VisualStudio C++ compiler

Date: 2008-02-01 09:21 pm (UTC)
From: [identity profile] e-kolo.livejournal.com
Это было опытным путем получено, или есть источник?

Date: 2008-02-01 09:50 pm (UTC)
From: [identity profile] nskboy.livejournal.com
А не может ли это быть багом, который приняли за фичу?

Date: 2008-02-01 10:26 pm (UTC)
lodin: A bearded hacker in a hat (Default)
From: [personal profile] lodin
Из man 2 write:
   EFAULT       buf is outside your accessible address space.


Таки фича.

Date: 2008-02-01 11:24 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Самое забавное, что я это знал - но вот такого применения в голову мне не приходило.

Date: 2008-02-01 11:36 pm (UTC)
arilou: (Work)
From: [personal profile] arilou
А, кстати, да. Читал же про все эти коды ошибок, и про этот читал.
А токого применения не придумал.

Date: 2008-02-01 11:40 pm (UTC)

Date: 2008-02-02 01:51 am (UTC)
From: [identity profile] catap.livejournal.com
Спасибо

Date: 2008-02-02 08:42 am (UTC)
From: [identity profile] cmike.livejournal.com
Век живи, век учись - дураком помрешь.
+1

Рву на себе волосы и ухожу читать документацию.

Паллиатива :(

Date: 2008-02-02 09:14 am (UTC)
From: [identity profile] cmike.livejournal.com
Для вызова функции по указателю, очевидно, неработает.

Date: 2008-02-02 10:08 am (UTC)
From: [identity profile] besm6.livejournal.com
"most useless use of cat"

Date: 2008-02-02 06:04 pm (UTC)
From: [identity profile] alec_v.livejournal.com
Дак вызов write уходит из glibc (usermode) почти прямо в ядро (syscall(__NR_write)->kernel mode) как есть. Полагаю, что /dev/null проверяется зачем-то в glibc.

Надо смотреть исходники.

Date: 2008-02-03 12:24 am (UTC)
From: [identity profile] michael.ul.myopenid.com (from livejournal.com)
Интересно. То есть ядро знает как выяснить, принадлежит ли область памяти процессу или нет. Почему же тогда до сих пор нет отдельного системного вызова специально для этой цели?

P.S. Я бы сделал проверку на файле, созданном mktemp(3), чтобы не порождать при каждой проверке ненужный процесс.

Date: 2008-02-03 08:54 am (UTC)
From: [identity profile] stepancheg.livejournal.com
А зачем может понадобиться узнать, случится ли Segmentation Fault при обращении по определенному указателю, или нет?

Date: 2008-02-04 05:59 am (UTC)
From: [identity profile] vadiml.livejournal.com
И я не знал такого, обычно ищу в отладчике, правда только для *nix пишу всего 3 года

спасибо.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

June 2025

S M T W T F S
1 23 4 56 7
89 1011 12 1314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 14th, 2025 09:51 am
Powered by Dreamwidth Studios