Вот такой пример как хандлить сегфаулт в линуксе:
#include
#include
#include
jmp_buf buf;
void handler(int s) {
printf("Segmentation fault signal caught! Attempting recovery...\n");
longjmp(buf,1);
}
int main(void) {
int *p = NULL;
signal(SIGSEGV,handler);
int value = setjmp(buf);
if (!value) {
*p=0xdead;
}
else {
printf("recovered, %i\n",value);
}
return 0;
}
Но есть проблема. Если компилировать через clang с ненулевым уровнем оптимизации, то происходит illegal instruction. Кстати, это тоже можно хандлить. Если компилировать через gcc, то на любом уровне оптимизации всё работает. Видимо, clang делает какие-то оптимизации и не обращает внимания на setjmp. Или тут проблема в стандартах. gcc же использует расширения для си, они могут включать определения для компиляции, где setjmp. Незнаю... Возможно это ещё и проблема x86-64 с её разноразмерными инструкциями. Может быть в ARM и clang справился бы?
В laisi по идее обращения по указателям не часто должны быть, так как индексация идёт по своим правилам и адреса проверяются, исключения выдаются. Но когда всё же будет обращение по адресу, можно делать такую штуку. Хотя это ОСезависимо, а у в laisi такого не надо, но, может быть, в библиотеке error такое будет полезно. Кроме того, когда icolaisi будет запускать файл кода, а не просто компилировать, он автоматически подключит библиотеку error для дебаггинга, а также будет использовать оптимизации для фич хостового процессора, в случае компиляции в файл изначально неизвестно какие фичи нужны и программист сам должен их включать.