🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #307945

Re: Jak są zaimplementowane wyjątki ?

#307945
From: Wojciech Muła
Date: Sat, 12 Dec 2015 06:24
66 lines
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-mail
References: <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