Article View: pl.comp.lang.c
Article #267804Re: Ciemna strona C++
From: Sektor van Skijlen
Date: Thu, 06 Dec 2007 16:03
Date: Thu, 06 Dec 2007 16:03
101 lines
6229 bytes
6229 bytes
Dnia Wed, 5 Dec 2007 06:14:03 -0800 (PST), Maciej Sobczak skrobie: > On 5 Gru, 14:44, Sektor van Skijlen > <ethou...@guess.if.gmail.com.is.valid.or.invalid> wrote: > > > Funkcje podane przez użytkownika są ZAMIAST a nie PRZED. > > > set_terminate() ustawia funkcję, wobec której standard wymaga, aby > > > zakończyła program. Nie ma sensu rozważać, co się dzieje potem. > > > > Gdzie tak przepraszam wyczytałeś, bo ja niczego takiego w standardzie nie > > widzę > Przecież sam zacytowałeś: > > typedef void (* unexpected_handler )(); > [...] > > 2 Required behavior: An unexpected_handler shall not return. See also 15.5.2. > [...] > > typedef void (* terminate_handler )(); > [...] > > 2 Required behavior: A terminate_handler shall terminate execution of the > > program without returning to the > > caller. > Zwróć uwagę na shall powyżej, w obu przypadkach. Tak, ale "shall not return" jest tylko w pierwszej ;)) Cholera, ślepnę na starość, albo co. > > Czy na podstawie standardu jesteś więc w stanie określić, czy: > > - wolno nie kończyć programu w terminate() > Nie wolno. Ale nie stwierdza się jasno, co się stanie, jeśli się tego nie zrobi. Jest to wtedy UB czy IDB? > > - implementacji wolno utłuc program abort()-em jeśli użytkownik nie ubije > > wcześniej programu w swoim handlerze terminate()? > Wolno. Skoro użytkownik *nie spełnił wymagań* nałożonych przez > standard na jego handler, to skazuje program na UB. Implementacja może > swobodnie utłuc taki program. Wg mnie nawet powinna, gdyż kontynuacja pracy tak zepsutej aplikacji może mieć fatalne skutki dla całego jej otoczenia. Ale to tak wg mnie. > > Nie przyglądałem się, jak to jest w standardzie - o tym, że oryginalna > > terminate() i tak jest wołana po funkcji użytkownika, przeczytałem w DEC++. > W takim razie jest to informacja na temat DEC++. Zazwyczaj w książkach są informacje nt. tego, co jest zawarte w książce, np. w książce pt. "Jądro systemu UNIX" jest napisane o jądrze systemu UNIX. Tak samo w książce Design & Evolution of C++ (DEC++) jest napisane o projektowaniu i rozwoju C++. Aczkolwiek - już na poważnie - mówię to z pamięci; nie mam w tej chwili dostępu do tej książki, więc nie wiem. > > Nie wiem, na ile jest to sprawa implementacji, ale jedynym sposobem wymuszenia > > na użytkowniku, żeby w swoim handlerze spowodował zakończenie programu jest > > spowodowanie zakończenia programu po jej zakończeniu. Ponieważ w domyślnej > > sytuacji nic innego nie robi (a kończy program i tak w ten sam sposób), więc > > metodą logicznej eliminacji jedyną sensowną implementacją spełniającą wymogi > > standardu jest wywołać abort() zaraz po wykonaniu funkcji użytkownika - > > najwyżej użytkownik zakończy program poprzez exit() zanim do tego dojdzie. > Nie widzę takiego wymagania, Nie pisałem nic o wymaganiach - tylko o jedynej sensownej implementacji, która spełnia wymagania standardu. > nawet jeśli sam bym tak to zaimplementował. A no widzisz. Maciek, zrozum - ja często w tym tutorialu wybiegam ponad standard (błąd tkwi jedynie w tym, że nie zawsze o tym wprost informuję), robię to zupełnie świadomie, i to nie dlatego, żebym uważał, że rozumiem C++ lepiej, niż twórcy standardu. Robię to dlatego, że często dzięki temu objaśnienie jest prostsze, spójniejsze, łatwiejsze do przyswojenia. > > Ale nawet zakładając, że tak rzecze standard, nie zmienia to faktu: większość > > tutoriali twierdzi stanowczo, że funkcja ta używana jest ZAMIAST oryginalnego > > handlera, "trochę zapominając" wspomnieć, że funkcja ta MUSI spowodować > > również zakończenie programu. > Widocznie te tutoriale nie są tak dokładne jak standard. Tak, ale pominięcie tej informacji pomija bardzo ważny, istotny aspekt: terminate() w momencie wywołania zastaje aplikację w stanie totalnego rozkładu, co prawda z nie zwiniętym stosem (standard tego wprost zabrania implementacji), ale z niekoniecznie stabilnym stanem istniejących obiektów. Dlatego w terminate() aplikacja musi zostać zakończona. -- // _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl> \\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com> // \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx "Java is answer for a question that has never been stated"
Technical Details
Message-ID:
<fj96fq$7e4$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mailReferences:
<fghgeo$spf$1@nemesis.news.tpi.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <1195688300.8426.30.camel@qrnik> <fi3ems$7ig$1@kujawiak.man.lodz.pl> <1195734091.8426.77.camel@qrnik> <fi6n5f$fpr$1@kujawiak.man.lodz.pl> <1195858230.20523.107.camel@qrnik> <fie2un$cbn$1@kujawiak.man.lodz.pl> <1196076390.30869.52.camel@qrnik> <fj1tmo$52u$1@kujawiak.man.lodz.pl> <1101d6ea-b312-4214-b153-8e1cc26a99ba@n20g2000hsh.googlegroups.com> <fj69vc$te$1@kujawiak.man.lodz.pl> <240a4947-994a-4b71-8aab-358ad88da5a9@e25g2000prg.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Thu, 6 Dec 2007 16:03:06 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 101
Sender: Michal Malecki <sektor@student.kis.p.lodz.pl>
Message-ID: <fj96fq$7e4$1@kujawiak.man.lodz.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <1195688300.8426.30.camel@qrnik> <fi3ems$7ig$1@kujawiak.man.lodz.pl> <1195734091.8426.77.camel@qrnik> <fi6n5f$fpr$1@kujawiak.man.lodz.pl> <1195858230.20523.107.camel@qrnik> <fie2un$cbn$1@kujawiak.man.lodz.pl> <1196076390.30869.52.camel@qrnik> <fj1tmo$52u$1@kujawiak.man.lodz.pl> <1101d6ea-b312-4214-b153-8e1cc26a99ba@n20g2000hsh.googlegroups.com> <fj69vc$te$1@kujawiak.man.lodz.pl> <240a4947-994a-4b71-8aab-358ad88da5a9@e25g2000prg.googlegroups.com>
NNTP-Posting-Host: student.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1196956986 7620 212.191.89.21 (6 Dec 2007 16:03:06 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Thu, 6 Dec 2007 16:03:06 +0000 (UTC)
User-Agent: tin/1.8.3-20070201 ("Scotasay") (UNIX) (FreeBSD/6.2-RELEASE-p3 (sparc64))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit