Article View: pl.comp.lang.c
Article #307945Re: Jak są zaimplementowane wyjątki ?
From: Wojciech Muła
Date: Sat, 12 Dec 2015 06:24
Date: Sat, 12 Dec 2015 06:24
66 lines
3160 bytes
3160 bytes
On Friday, December 11, 2015 at 8:43:54 AM UTC+1, Borneq wrote:
> Trzeba by się przypatrzyć ich wnętrzu.
Możesz zacząć od tego:
https://monoinfinito.wordpress.com/series/exception-handling-in-c/
Widziałem kiedyś dobrą prezentację pokazującą szczegóły, ale nie potrafię
jej teraz znaleźć. W każdym razie kluczowa fraza to "0-overhead exceptions".
> Ale uwaga - gdy w .c nie było throw, wtedy nie ma obsługi wyjątku mimo
> dzielenia. Czyżby gcc nie potrafił obsługiwać tego typu wyjątków?
Nie, bo to są wyjątki sprzętowe. Które np. na unixach są konwertowane
na sygnały (a sygnały to Zło(TM)).
> Co się stanie, gdy jednak będzie błąd dzielenia?
Program się mniej lub bardziej elegancko wyłoży.
BTW, kilka lat temu przysłałem na tę grupę program zamieniający sygnał
na wyjątek C++, ale... to jest brzydkie i nie wiem nawet czemu działa. :)
Wrzucam jako ciekawostkę, można dodać do kategorii "perwersje".
---start---
#include <signal.h>
#include <setjmp.h>
#include <stdio.h>
jmp_buf toplevel;
void sigsegv(int dummy) {
longjmp(toplevel, 1);
}
void bug(char* cantread) {
char a = cantread[0xfffffff];
}
class SegmentationFault { };
int main(int argc, char* argv[]) {
if (signal(SIGSEGV, sigsegv) == SIG_ERR) {
return 2;
}
try {
if (!setjmp(toplevel)) {
puts("Próba wykonania niebezpiecznego kodu");
bug((char*)0xffffffff);
puts("Uff, powiod³o siê");
}
else {
throw SegmentationFault();
}
}
catch (SegmentationFault& s) {
puts("*** Segmentation Fault ***");
return 1;
}
puts("Ok!");
return 0;
}
---end---
w.
Technical Details
Message-ID:
<ea2b8a69-ca75-411e-a35f-c4a6354a1e8b@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin.stu.neva.ru!news.ripco.com!usenet.blueworldhosting.com!feeder01.blueworldhosting.com!peer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!f78no7931286qge.1!news-out.google.com!l1ni720igd.0!nntp.google.com!mv3no15004235igc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<n4durn$q3e$1@node1.news.atman.pl>Show Full Headers
Complete Article Headers
X-Received: by 10.129.83.85 with SMTP id h82mr14260218ywb.0.1449901491285; Fri, 11 Dec 2015 22:24:51 -0800 (PST) X-Received: by 10.50.50.148 with SMTP id c20mr245045igo.9.1449901491256; Fri, 11 Dec 2015 22:24:51 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin.stu.neva.ru!news.ripco.com!usenet.blueworldhosting.com!feeder01.blueworldhosting.com!peer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!f78no7931286qge.1!news-out.google.com!l1ni720igd.0!nntp.google.com!mv3no15004235igc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.c Date: Fri, 11 Dec 2015 22:24:50 -0800 (PST) In-Reply-To: <n4durn$q3e$1@node1.news.atman.pl> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=37.47.98.115; posting-account=VFwkXwoAAADdT4-lLKRZrMYkTjizGoyn NNTP-Posting-Host: 37.47.98.115 References: <n4durn$q3e$1@node1.news.atman.pl> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <ea2b8a69-ca75-411e-a35f-c4a6354a1e8b@googlegroups.com> Subject: Re: Jak są zaimplementowane wyjątki ? From: Wojciech Muła <wojciech_mula@poczta.onet.pl> Injection-Date: Sat, 12 Dec 2015 06:24:51 +0000 X-Received-Bytes: 3101 X-Received-Body-CRC: 1492752900 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit