{"id":301041,"date":"2020-03-31T15:00:41","date_gmt":"2020-03-31T15:00:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=301041"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=301041","title":{"rendered":"saneex.c: try\/catch\/finally \u043d\u0430 \u0431\u0430\u0437\u0435 setjmp\/longjmp (C99) \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 C++\u00b9"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/491084\/\">\n<p>\u041f\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0443\u0433\u0443\u0431\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0425\u0430\u0431\u0440 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0412\u041e\u0417 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043d\u0435 \u0434\u0430\u0436\u0435 \u0441\u0442\u044b\u0434\u043d\u043e \u0435\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u2026 \u043d\u043e \u0432 \u0434\u0443\u0448\u0435 \u0442\u0435\u043f\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0435\u0436\u0434\u0430, \u0447\u0442\u043e \u0430\u0439\u0442\u0438\u0448\u043d\u0438\u043a\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0436\u0430\u043b\u0438\u0441\u044c \u0438 \u043e\u043d\u0430 \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f. \u0418\u043b\u0438 \u043d\u0435\u0442?<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041c\u0435\u043d\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0441\u0445\u0438\u0449\u0430\u043b\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0421\u0438, \u0434\u0430 \u0438 \u0441\u0430\u043c \u0421\u0438\u00a0\u2014 \u043f\u0440\u0438 \u0432\u0441\u0435\u0439 \u0441\u0432\u043e\u0435\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0438\u0445 \u0442\u0430\u043a \u0438 \u0432\u0435\u0435\u0442 \u0434\u0443\u0445\u043e\u043c \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0445 <del>\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043b\u0430\u0437\u0438\u043a\u043e\u0432<\/del> <a href=\"https:\/\/tinyurl.com\/tj364je\" rel=\"nofollow\">\u0445\u0430\u043a\u0435\u0440\u043e\u0432<\/a>. \u0412 <a href=\"https:\/\/tinyurl.com\/m4hdlab\" rel=\"nofollow\">\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435<\/a> \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 (ANSI C, \u043e\u043d \u0436\u0435 C89, <a href=\"https:\/\/tinyurl.com\/djfxz6\" rel=\"nofollow\">\u043e\u043d \u0436\u0435<\/a> ANS X3.159-1989, \u043e\u043d \u0436\u0435, \u043f\u043e\u0437\u0434\u043d\u0435\u0435, C90 \u0438 IEC 9899:1990) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f 145 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 25\u00a0\u2014 \u044d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 (\u0432\u0432\u0438\u0434\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a), \u0430 26 \u0447\u0438\u0441\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445. <a href=\"https:\/\/tinyurl.com\/y6z5z989\" rel=\"nofollow\">K&amp;R \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438<\/a>\u00b2 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 114 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u043f\u043b\u044e\u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435), \u0441\u0447\u0438\u0442\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0443. \u0412 <a href=\"https:\/\/tinyurl.com\/444uvtg\" rel=\"nofollow\">\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435\u00b3 C11<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0436\u0435 348, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0442\u043d\u0438\u00a0\u2014 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u0430 \u0435\u0449\u0435 \u0448\u0442\u0443\u043a 90 \u044d\u0442\u043e \u00ab\u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438\u00bb. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 Boost, \u0433\u0434\u0435 <a href=\"https:\/\/tinyurl.com\/qqu853s\" rel=\"nofollow\">\u043e\u0434\u043d\u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u00a0\u2014 160<\/a>. \u0427\u0443\u0440 \u043c\u0435\u043d\u044f\u2026<\/p>\n<p>  <\/p>\n<p>\u0418 \u0441\u0440\u0435\u0434\u0438 \u044d\u0442\u043e\u0439 \u0441\u043e\u0442\u043d\u0438-\u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e PHP \u0434\u043e\u0448\u043b\u0438 25 \u043b\u0435\u0442 \u0441\u043f\u0443\u0441\u0442\u044f, \u0430 \u0432 Delphi, \u0431\u0443\u0440\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e \u0432\u0440\u0435\u043c\u044f, \u0438\u0445 \u043d\u0435\u0442 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440) \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 50 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 <strong>printf()<\/strong> (\u043c-\u043c-\u043c\u2026 JavaScript), <strong>strftime()<\/strong> (\u2026) \u0438 <strong>scanf()<\/strong> (\u0434\u0435\u0448\u0435\u0432\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c).<\/p>\n<p>  <a name=\"r4\"><\/a>  <\/p>\n<p>\u0410 \u0435\u0449\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438 <strong>setjmp()<\/strong>\/<strong>longjmp()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043f\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0433\u043e \u0421\u0438. \u0412\u043e\u0442 \u043e \u043d\u0438\u0445 \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u00a0\u2014 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#irl\">Quake World<\/a>, \u0441\u0442\u0435\u043a\u0438, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u044b \u0438 \u043f\u0440\u043e\u0447\u0430\u044f <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sjlj\">\u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c<\/a>, \u0430 \u0432\u0438\u0448\u0435\u043d\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 (<a href=\"https:\/\/habr.com\/ru\/post\/491084\/#benchres\">\u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/a>: Visual Studio \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430, \u043a\u0430\u043a \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u0438\u0439 \u0437\u0430\u044f\u0446, \u0430 <strong>throw<\/strong> <code>saneex.c<\/code> \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cx\/fz\/jq\/cxfzjqci2ud94mxrbl5bwitnobo.png\"><a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u00b9 \u041f\u043e <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#benchres\">\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#bench\">\u0437\u0430\u043c\u0435\u0440\u043e\u0432<\/a> \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  <\/p>\n<p>\u00b2 \u041a\u0441\u0442\u0430\u0442\u0438, \u043a\u043d\u0438\u0433\u0430 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u0430\u044f. 270 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 80\u00a0\u2014 \u044d\u0442\u043e \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430. \u0418\u043b\u0438 \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0449\u0435 \u043d\u0435 \u0443\u043c\u0435\u043b\u0438 \u0440\u0430\u0441\u0442\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043c\u044b\u0441\u043b\u044c\u044e \u043f\u043e \u0434\u0440\u0435\u0432\u0443 \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0433\u043e\u043d\u043e\u0440\u0430\u0440, \u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u0440\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e\u0433\u043e. <del><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_(%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0)\" rel=\"nofollow\">K&amp;R<\/a>\u00a0\u2014 \u0441\u0442\u0430\u0440\u0430\u044f \u0448\u043a\u043e\u043b\u0430, \u0447\u043e.<\/del><\/p>\n<p>  <\/p>\n<p>\u00b3 \u0418\u0437 <a href=\"https:\/\/stackoverflow.com\/questions\/17014835\/where-can-i-find-the-c89-c90-standards-in-pdf-format\" rel=\"nofollow\">\u043e\u0441\u043e\u0431\u043e \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/a> \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 ANSI \u0438 ISO \u043f\u0440\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u0437\u0430 \u0434\u0435\u043d\u044c\u0433\u0438, \u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u2074 \u0414\u0430, \u044f \u0442\u043e\u0436\u0435 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u00ab\u0441\u043e\u043a\u0440\u0430\u0449\u0430\u043b\u043a\u0438\u00bb \u0432\u0440\u043e\u0434\u0435 TinyURL, \u043d\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u0425\u0430\u0431\u0440\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 URL \u0447\u0430\u0441\u0442\u044c\u044e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e \u043a\u0430\u0442\u0430, \u044f\u043a\u043e \u0422\u0432\u0456\u0442\u0442\u0435\u0440 \u043f\u043e\u0433\u0430\u043d\u0438\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0447\u0435\u0441\u0442\u043d\u043e-\u0447\u0435\u0441\u0442\u043d\u043e. \u041f\u0430\u0440\u0430\u043d\u043e\u0438\u043a\u0430\u043c \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/urlex.org\" rel=\"nofollow\">urlex.org<\/a>.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><strong>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sjlj\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 <strong>setjmp()<\/strong>\/<strong>longjmp()<\/strong><\/a><br \/> \n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#matan\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0441\u0442\u0435\u043a \u0438 \u0432\u0441\u0435-\u0432\u0441\u0435-\u0432\u0441\u0435<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#clob\">\u0417\u0430\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438, \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, clobbering<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#vol\">\u041a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <strong>volatile<\/strong><\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#irl\">\u0421\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f IRL<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#perf\">\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/a><br \/> \n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#bench\">\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#benchres\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#saneex\">\u0412\u0438\u043d\u043e\u0432\u043d\u0438\u043a \u0442\u043e\u0440\u0436\u0435\u0441\u0442\u0432\u0430\u00a0\u2014 saneex.c<\/a><br \/> \n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sexfeat\">\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u00ab\u0444\u0438\u0447\u0438\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sexpit\">\u0418 \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sexside\">\u0418\u0442\u043e\u0433: \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0433\u0435\u0440\u043e\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\u00a0\u2014 <a href=\"https:\/\/www.opennet.ru\/man.shtml?topic=setjmp&amp;category=3&amp;russian=2\" rel=\"nofollow\">setjmp()<\/a>\/<a href=\"https:\/\/www.opennet.ru\/man.shtml?topic=longjmp&amp;category=3&amp;russian=2\" rel=\"nofollow\">longjmp()<\/a>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 <a href=\"https:\/\/www.opennet.ru\/man.shtml?topic=setjmp.h&amp;category=3&amp;russian=5\" rel=\"nofollow\">setjmp.h<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u044e\u0431\u044f\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u0430\u043a \u00abSJLJ\u00bb (\u0445\u043e\u0442\u044f \u043c\u043d\u0435 \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u043f\u0435\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0443). \u041e\u043d\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 C89 \u0438, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435 \u0432\u0441\u0435 \u0437\u043d\u0430\u044e\u0442 (\u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0\u2014 \u0437\u043d\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u00a0\u2014 \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0437\u0435\u0442).<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/324642\">\u0443\u0436\u0435<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/50985\">\u0431\u044b\u043b\u0438<\/a> \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0435 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/208006\">\u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/zzeng\/\" class=\"user_link\">zzeng<\/a>. \u0412 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u0421\u0435\u0442\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, <a href=\"http:\/\/groups.di.unipi.it\/~nids\/docs\/longjump_try_trow_catch.html\" rel=\"nofollow\">\u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f<\/a>, \u043f\u043b\u044e\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/Jamesits\/CTryCatch\" rel=\"nofollow\">\u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0439<\/a> \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 <a href=\"https:\/\/sourceforge.net\/projects\/cexception\" rel=\"nofollow\">\u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439<\/a>\u00b9, \u043d\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, <del>\u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/del> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u0440\u0438\u0432\u044b\u0447\u0435\u043d (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e), \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043d\u0435 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443.<\/p>\n<p>  <\/p>\n<p>\u00b9 <a href=\"https:\/\/sourceforge.net\/projects\/cexception\" rel=\"nofollow\">CException<\/a> \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0441\u043e\u0431\u043e\u00a0\u2014 \u0432\u0441\u0435\u0433\u043e 60 \u0441\u0442\u0440\u043e\u0447\u0435\u043a, \u043f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u0442\u043e\u0436\u0435 ANSI C, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 <strong>finally<\/strong> \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0435\u0442\u00a0\u2014 \u0432\u0435\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0440 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%83%D1%82%D0%B5%D1%88%D0%B5%D1%81%D1%82%D0%B2%D0%B8%D1%8F_%D0%93%D1%83%D0%BB%D0%BB%D0%B8%D0%B2%D0%B5%D1%80%D0%B0#%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%9F%D1%83%D1%82%D0%B5%D1%88%D0%B5%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%B2_%D0%9B%D0%B8%D0%BB%D0%B8%D0%BF%D1%83%D1%82%D0%B8%D1%8E\" rel=\"nofollow\">\u0442\u0443\u043f\u043e\u043a\u043e\u043d\u0435\u0447\u043d\u0438\u043a\u043e\u0432 \u0441 \u043e\u0441\u0442\u0440\u043e\u043a\u043e\u043d\u0435\u0447\u043d\u0438\u043a\u0430\u043c\u0438<\/a> \u0432 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438 \u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0431\u0430\u0440\u0440\u0438\u043a\u0430\u0434, \u0438\u043b\u0438 \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u0438\u043c\u043e, \u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u043b\u043a\u0443 \u0437\u043d\u0430\u043d\u0438\u0439, \u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u043f\u043e\u043b\u043a\u0443 \u00ab\u0447\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0442\u0430\u0449\u0430\u0442 \u0432 \u043d\u0430\u0448\u0443 \u0443\u044e\u0442\u043d\u0435\u043d\u044c\u043a\u0443\u044e \u0441\u0438\u0448\u0435\u0447\u043a\u0443\u00bb. (\u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043f\u043e\u0440\u0449\u0438\u043a\u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u043b\u0438, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u0421\u0438 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043e\u0442 \u00ab\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\u00bb \u043d\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430, \u0438\u0431\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <strong>errno<\/strong> \u043d\u0435 \u0441\u043f\u0430\u0441\u0435\u0442 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 \u043d\u043e\u043b\u044c. \u0421\u0438\u0433\u043d\u0430\u043b\u044b\u00a0\u2014 \u0442\u0435 \u0436\u0435 \u044f\u0439\u0446\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u044c.)<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u043d\u044f \u043b\u0438\u0447\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0435 \u0434\u0443\u043c\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c (\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430\u00a0\u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0431\u0435\u0437 <code>if (error) return -1;<\/code>)<\/li>\n<li>\u043a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u0438 \u0432\u043f\u0440\u044f\u043c\u044c \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a\u00a0\u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043e\u0442 \u043a\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u0438 \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u043e \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. <a href=\"https:\/\/habr.com\/ru\/post\/224955\">\u041a\u0430\u043a \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u0440\u0438\u043d\u044f\u0442\u043e<\/a>, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u0430\u0442\u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>  <a name=\"sjlj\"><\/a>  <\/p>\n<h2 id=\"kak-rabotayut-setjmplongjmp\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 <strong>setjmp()<\/strong>\/<strong>longjmp()<\/strong><\/h2>\n<p>  <a name=\"matan\"><\/a>  <\/p>\n<h3 id=\"registry-stek-i-vse-vse-vsehttplibruanekdoty9600txt\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0441\u0442\u0435\u043a \u0438 <a href=\"http:\/\/lib.ru\/ANEKDOTY\/9600.txt\" rel=\"nofollow\">\u0432\u0441\u0435-\u0432\u0441\u0435-\u0432\u0441\u0435<\/a><\/h3>\n<p>  <\/p>\n<p>\u0412 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, <strong>longjmp()<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 <strong>goto<\/strong>, \u0430 <strong>setjmp()<\/strong>\u00a0\u2014 <del>\u043f\u0440\u043e\u0440\u043e\u043a \u0435\u0433\u043e<\/del> \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043a\u0438 \u044d\u0442\u043e\u043c\u0443 <strong>goto<\/strong> \u0432 run-time. \u041a\u043e\u0440\u043e\u0447\u0435, \u00ab<strong>goto<\/strong> \u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445\u00bb. \u0418, \u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u044b\u0435 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u044b, \u0442\u043e \u0431\u0438\u0448\u044c, <strong>goto<\/strong>, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043c\u044b\u0439 \u0432\u0440\u0435\u0434 \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443\u00a0\u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0430\u043a\u0443\u044e \u043b\u0430\u043f\u0448\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f <strong>goto<\/strong> \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043d\u0435 \u0434\u043e\u0441\u044f\u0433\u0430\u0435\u043c\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u0435\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0438, \u0437\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0447\u0435\u0442\u043a\u0443\u044e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 (\u043a\u0430\u043a \u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u00a0\u2014 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u044f\u0432\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u00abtry\u00bb).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0447\u0442\u043e \u043e\u0442 \u0421\u0438 \u0438, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e, \u043e\u0442 <code>setjmp.h<\/code> \u043f\u0440\u044f\u043c\u043e \u0432\u0435\u0435\u0442 <del>\u0447\u0435\u0440\u0442^W<\/del> \u044e\u043d\u0438\u043a\u0441\u043e\u0432\u0449\u0438\u043d\u043e\u0439? \u0422\u0430\u043a \u0432\u043e\u0442, \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 <strong>setjmp()<\/strong> \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f <strong>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0440\u0430\u0437<\/strong> (\u043d\u043e, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043e\u0434\u0438\u043d). \u0414\u0430, \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043c\u0438\u0440\u0435 <del>\u0441\u043c\u0443\u0437\u0438\u0445\u043b\u0435\u0431\u044b<\/del> \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u0432 <del>\u0421\u043e\u0432\u0435\u0442\u0441\u043a\u043e\u0439 \u0420\u043e\u0441\u0441\u0438\u0438<\/del> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0441 \u0441\u0430\u043c\u0430, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0435\u0439 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438 \u043a\u043e\u0433\u0434\u0430 \u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u0422\u0430\u043a\u0438\u0435 \u0434\u0435\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f, \u043a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <strong>setjmp()<\/strong>\u00a0\u2014 <a href=\"https:\/\/www.opennet.ru\/man.shtml?topic=fork&amp;category=3&amp;russian=5\" rel=\"nofollow\">fork()<\/a> \u0432 POSIX \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435\u0435. \u042f \u043f\u043e\u043c\u043d\u044e, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441 *nix\u2019\u043e\u0432\u044b\u043c\u0438 API \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 WinAPI, \u043c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043d\u043e\u0441\u0438\u043b\u043e \u043a\u0440\u044b\u0448\u0443\u00a0\u2014 \u0432 \u043c\u043e\u0438\u0445 \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441\u0435\u0431\u044f \u0432\u0435\u0441\u0442\u0438. \u041a\u0430\u043a \u043c\u0435\u0442\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442\u00a0\u2014 \u00ab\u0430 \u0447\u0442\u043e, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e?\u00bb\u2026 \u041d\u043e \u043c\u044b \u043e\u0442\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c.<\/p>\n<p>  <a name=\"r6\"><\/a>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435 \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u00a0\u2014 \u044d\u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D1%82%D0%B5%D0%BA_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2\" rel=\"nofollow\">\u0441\u0442\u0435\u043a<\/a>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0436\u0430\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435) \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0448\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e\u00a0\u2014 \u0441\u0442\u0435\u043a \u0440\u0430\u0441\u0442\u0435\u0442 (\u043f\u0440\u0438\u0447\u0435\u043c \u0443 Intel\u2019\u0430\u00a0\u2014 \u0432\u043d\u0438\u0437), \u0432\u044b\u0445\u043e\u0434\u0438\u0448\u044c\u00a0\u2014 \u0442\u0430\u0435\u0442 (\u0443 Intel\u2019\u0430\u00a0\u2014 \u0434\u0430-\u0434\u0430, \u0432\u0432\u0435\u0440\u0445). \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0447\u0438\u043a: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">void sub(int s) {   char buf[256];   sub(2); }  int main(int m) {   sub(1); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043d\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u00a0\u2014 <strong>tcc<\/strong> (<a href=\"https:\/\/bellard.org\/tcc\/\" rel=\"nofollow\">Tiny C Compiler<\/a>) \u043e\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430-\u043f\u0430\u0440\u043e\u0445\u043e\u0434\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B5%D0%BB%D0%BB%D0%B0%D1%80,_%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%81\" rel=\"nofollow\">\u0424. \u0411\u0435\u043b\u043b\u0430\u0440\u0430<\/a>. <strong>tcc<\/strong> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435. \u041e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u0442\u0435\u043b\u043e \u0434\u043b\u044f <strong>sub()<\/strong> (\u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/X86_assembly_language#Syntax\" rel=\"nofollow\">\u043d\u043e\u0442\u0430\u0446\u0438\u0438 Intel<\/a>, \u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u043b\u043e\u0433 \u0438 \u044d\u043f\u0438\u043b\u043e\u0433): <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sub     esp, 100h       ; \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e mov     eax, 2          ; \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 push    eax call    sub_401000      ; \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c sub() add     esp, 4          ; \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0442\u0435\u043a \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 (= cdecl)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0441\u0445\u0435\u043c\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xt\/mz\/lc\/xtmzlclm6cujy23wvupm7cxmm1k.png\">  <\/p>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0438 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443\u00a0\u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 Intel\u2026 \u043d\u0443, \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438). \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <strong>ESP<\/strong> (<strong>RSP<\/strong> \u043d\u0430 x86_64). <strong>setjmp()<\/strong> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>ESP<\/strong>\/<strong>RSP<\/strong>, \u043f\u043b\u044e\u0441 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 <strong>jmp_buf<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 <strong>longjmp()<\/strong> \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 (\u0438\u0437 \u044d\u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0438\u0437 \u043f\u043e\u0434\u0444\u0443\u043d\u043a\u0446\u0438\u0438)\u00a0\u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u043e\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0433\u0434\u0435 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d <strong>setjmp()<\/strong>, \u0430 \u0432\u0441\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f (\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f). \u042d\u0434\u0430\u043a\u0438\u0439 \u043e\u0442\u043a\u0430\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u00abundo\u00bb \u0434\u043b\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430 (\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0442\u044f\u0436\u043a\u043e\u0439).<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <strong>setjmp()<\/strong> \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442 \u0432 <strong>jmp<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <code>FEF8h<\/code> (<code>FDF0h<\/code> \u0438 \u0442.\u0434.\u00a0\u2014 \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0432\u044b\u0448\u0435) \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">void sub(int s) {   char buf[256];   jmp_buf jmp;   setjmp(jmp);   sub(2); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441&trade;:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 (<strong>setjmp()<\/strong> \u0432 \u043e\u0434\u043d\u043e\u043c, <strong>longjmp()<\/strong> \u0432 \u0434\u0440\u0443\u0433\u043e\u043c), \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0435\u043a<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u0432\u0430\u043b\u0430 <strong>setjmp()<\/strong>, \u0443\u0436\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c, \u0442\u043e \u00ab\u0440\u0435\u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0435\u0435 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442\u00a0\u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u043f\u0430\u0434\u0435\u0442 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"nofollow\">undefined behavior<\/a> (\u0438 \u044d\u0442\u043e \u043d\u0435 \u043b\u0435\u0447\u0438\u0442\u0441\u044f)<\/li>\n<\/ul>\n<p>  <a name=\"r1\"><\/a>  <\/p>\n<ul>\n<li>\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\u00a0\u2014 \u043e\u043d\u0438, \u0432\u0438\u0434\u0438\u0442\u0435 \u043b\u0438, \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442!\u00a0\u2014 \u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e, \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0441\u0442\u0435\u043a\u0430 \u0438, \u0445\u043e\u0442\u044f <strong>setjmp()<\/strong> \u043c\u043e\u0433\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430, \u043e\u043d\u0430 \u0438 <strong>longjmp()<\/strong> \u043d\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <strong>setjmp()<\/strong><\/li>\n<\/ul>\n<p>  <a name=\"clob\"><\/a>  <\/p>\n<h3 id=\"zatiranie-peremennyh-ili-po-russki-clobbering\">\u0417\u0430\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438, \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, clobbering<\/h3>\n<p>  <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r1\">\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442<\/a> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d. \u041f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;setjmp.h&gt;  int main(void) {   int i;   jmp_buf jmp;   i = rand();   if (setjmp(jmp) == 0) {     i = rand();     printf(&quot;%d\\n&quot;, i);     longjmp(jmp, 1);   } else {     printf(&quot;%d\\n&quot;, i);   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043b\u0443: \u0431\u0443\u0434\u0443\u0442 \u043b\u0438 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c?<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442: \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043e\u043b\u0438 \u0437\u0432\u0435\u0437\u0434. <del>\u0422\u0430\u043a-\u0442\u043e!<\/del><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <strong>gcc<\/strong>. \u0415\u0441\u043b\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 <strong>-O0<\/strong>, \u0442\u043e \u0447\u0438\u0441\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c, \u0430 \u0432 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u043e\u0442 \u044d\u0442\u043e: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">; int main(void) {   push    ebp             ; \u043f\u0440\u043e\u043b\u043e\u0433 (\u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f stack frame)   mov     ebp, esp        ; EBP \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0435\u043a \u043d\u0438\u0436\u0435 ESP (\u0435\u0441\u043b\u0438 \u043f\u043e \u0441\u0445\u0435\u043c\u0435)   sub     esp, E0h   ...   call    _rand           ; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 EAX   mov     [ebp-D4h], eax  ; \u044d\u0442\u043e i = rand(); \u0433\u0434\u0435 i \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 (EBP-D4h)   ... ; if (... == 0) {         ; \u0432\u044b\u0437\u043e\u0432 setjmp() \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u043d\u0435\u0435 \u0434\u043e \u043f\u0440\u044b\u0436\u043a\u0430   call    _rand   mov     [ebp-D4h], eax  ; \u0441\u043d\u043e\u0432\u0430 i = rand(); \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 ; printf(&quot;%d\\n&quot;, i);   mov     eax, [ebp-D4h]  ; \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c i \u0441\u043e \u0441\u0442\u0435\u043a\u0430 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440   mov     esi, eax   lea     edi, format     ; \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 &quot;%d\\n&quot;   mov     eax, 0   call    _printf   ... ; } else {                ; \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 setjmp() \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u044b\u0436\u043a\u0430   mov     eax, [ebp-D4h]  ; \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c i, \u043a\u0430\u043a \u0432 \u0432\u0435\u0442\u043a\u0435 \u0432\u044b\u0448\u0435   mov     esi, eax   lea     edi, format     ; &quot;%d\\n&quot;   mov     eax, 0   call    _printf<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <strong>i<\/strong> \u0432 \u0441\u0442\u0435\u043a (\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>EBP - D4h<\/code>). \u0415\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0441\u044e \u0442\u0443 \u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r6\">\u0441\u0445\u0435\u043c\u043a\u0443<\/a>, \u0442\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u0430 256 <strong>char<\/strong> \u043c\u044b \u0438\u043c\u0435\u0435\u043c <strong>int<\/strong> \u0438 <strong>jmp_buf<\/strong>, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 4 \u0438 200 \u0431\u0430\u0439\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043b\u044e\u0441 20 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e\u0434 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u043e\u0441\u044c 224 \u0431\u0430\u0439\u0442\u0430 (E0h) \u0432\u043c\u0435\u0441\u0442\u043e 100h, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r6\">\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a><\/li>\n<li><strong>ESP<\/strong> \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <strong>setjmp()<\/strong> \u0440\u0430\u0432\u0435\u043d <code>FFF8h - E0h = FF18h<\/code> (\u0432\u043c\u0435\u0441\u0442\u043e <code>FEF8h<\/code>), \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <strong>jmp<\/strong><br \/> \n<ul>\n<li>\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u044b\u043c<\/li>\n<\/ul>\n<\/li>\n<li>\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 <strong>i<\/strong>, \u0438 \u0432\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>i<\/strong> \u0432 \u0441\u0442\u0435\u043a\u0435 (\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>FF18h<\/code>)<\/li>\n<li><strong>longjmp()<\/strong> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 <code>FF18h<\/code>, \u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <strong>i<\/strong> \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u044d\u0442\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u043e\u043d\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f (<strong>jmp<\/strong>), \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong>main()<\/strong> (\u0431\u0443\u0434\u0435 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c)<br \/> \n<ul>\n<li>\u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <strong>ESP<\/strong> \u0438 \u0442\u0430\u043a \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u043d\u043e <strong>longjmp()<\/strong> \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0433 \u0431\u044b \u0431\u044b\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u0437 <strong>main()<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b <strong>-O1<\/strong>, \u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">; \u043f\u0440\u043e\u043b\u043e\u0433\u0430 \u0438 stack frame \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ESP \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e   sub     esp, E8h   ...   call    _rand   mov     [esp+E8h-DCh], eax  ; i = rand(); \u0432 \u0441\u0442\u0435\u043a\u0435, \u043a\u0430\u043a \u0438 \u0441 -O0   ... ; -O1 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0440\u0435\u0448\u0438\u043b\u043e, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 else \u0431\u043e\u043b\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0435\u043c ; if (setjmp() == 0) (\u0445\u043e\u0442\u044f \u043f\u043e-\u043c\u043e\u0435\u043c\u0443 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442), \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u043b\u043e ; \u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u043c\u0438; \u0437\u0434\u0435\u0441\u044c \u044f \u0432\u0435\u0440\u043d\u0443\u043b \u043f\u0440\u0435\u0436\u043d\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u043b\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u0438 ; if (... == 0) {   call    _rand   mov     esi, eax            ; \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415! \u0437\u0430\u043f\u0438\u0441\u044c i \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 ; printf(&quot;%d\\n&quot;, i);   lea     edi, format     ; &quot;%d\\n&quot;   mov     eax, 0   call    _printf   ... ; } else {   mov     esi, [esp+E8h-DCh]  ; \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415! \u0447\u0442\u0435\u043d\u0438\u0435 i \u0441\u043e \u0441\u0442\u0435\u043a\u0430   lea     edi, format     ; &quot;%d\\n&quot;   mov     eax, 0   call    _printf<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, \u0441 <strong>-O1<\/strong> <strong>gcc<\/strong> \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">test.c:6:11: warning: variable \u2018i\u2019 might be clobbered by \u2018longjmp\u2019 or \u2018vfork\u2019 [-Wclobbered]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c? \u0412\u043d\u0430\u0447\u0430\u043b\u0435 <strong>i<\/strong> \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 (\u0432\u043d\u0443\u0442\u0440\u0438 <strong>if<\/strong>) <strong>gcc<\/strong>, \u0432\u0438\u0434\u0438\u043c\u043e \u0441\u043e\u0447\u0442\u044f <strong>i<\/strong> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e <strong>printf()<\/strong>, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432 <strong>ESI<\/strong>, \u0430 \u043d\u0435 \u0432 \u0441\u0442\u0435\u043a (\u0447\u0435\u0440\u0435\u0437 <strong>ESI<\/strong> \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 <strong>printf()<\/strong>, \u0441\u043c. <a href=\"https:\/\/raw.githubusercontent.com\/wiki\/hjl-tools\/x86-psABI\/x86-64-psABI-1.0.pdf\" rel=\"nofollow\">ABI, \u0441\u0442\u0440. 22<\/a>\u00a0\u2014 RDI (<strong>format<\/strong>), RSI (<strong>i<\/strong>),\u00a0\u2026). \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>ESP + E8h - DCh<\/code> \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>rand()<\/strong><\/li>\n<li>\u0432 <strong>ESI<\/strong> \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/li>\n<li><strong>printf()<\/strong> (\u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432) \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 (\u043d\u043e\u0432\u043e\u0435) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430<\/li>\n<li><strong>longjmp()<\/strong> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445<\/li>\n<li>\u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 <strong>printf()<\/strong> (\u0432 <strong>else<\/strong>) \u0447\u0438\u0442\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e, \u0438\u0437 \u0441\u0442\u0435\u043a\u0430, \u0442\u043e \u0431\u0438\u0448\u044c \u0441\u0442\u0430\u0440\u043e\u0435<br \/> \n<ul>\n<li>\u043d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d\u043e \u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0437 <strong>ESI<\/strong>, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u044b\u0436\u043a\u0430 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0431\u044b\u043b \u0431\u044b \u043c\u0443\u0441\u043e\u0440 (\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0438\u0437 <strong>printf()<\/strong> \u0438\u043b\u0438 \u0441\u0430\u043c\u043e\u0433\u043e <strong>longjmp()<\/strong>)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <a name=\"r2\"><\/a>  <\/p>\n<p>\u0418\u043b\u0438, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0421\u0438: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stack[i] = rand();          \/\/ i = rand(); \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 (1) if (setjmp(jmp) == 0) {   ESI = rand();             \/\/ i = rand(); \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 (2)   printf(&quot;%d\\n&quot;, ESI);      \/\/ \u043f\u0435\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (2)   longjmp(jmp, 1);          \/\/ \u043f\u0440\u044b\u0436\u043e\u043a } else {   printf(&quot;%d\\n&quot;, stack[i]); \/\/ \u043f\u0435\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (1)   \/\/ \u0438\u043b\u0438 \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0431\u044b\u0442\u044c \u0442\u0430\u043a:   printf(&quot;%d\\n&quot;, ESI);      \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0433\u0434\u0435 \u0443\u0436\u0435 \u043a\u0442\u043e-\u0442\u043e                             \/\/ &quot;\u043f\u043e\u0431\u044b\u0432\u0430\u043b&quot; (\u043f\u0435\u0440\u0432\u044b\u0439 printf() \u0438\u043b\u0438 longjmp()) }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 <strong>gcc<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e <strong>rand()<\/strong> \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 <strong>ESI<\/strong> \u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 (\u0434\u0430\u0436\u0435 \u043f\u0440\u0438 <strong>-O3<\/strong>). \u041d\u0430 <abbr title=\"StackOverflow.com\">SO<\/abbr> <a href=\"https:\/\/stackoverflow.com\/questions\/2535989\/what-are-the-calling-conventions-for-unix-linux-system-calls-on-i386-and-x86-6\" rel=\"nofollow\">\u043f\u0438\u0448\u0443\u0442<\/a>, \u0447\u0442\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 x86_64 (\u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043a\u0440\u043e\u043c\u0435 <strong>EAX<\/strong>. \u0417\u0430\u0447\u0435\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a? \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043b, \u0447\u0442\u043e <strong>gcc<\/strong> \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u043b <strong>printf()<\/strong> \u0432 <strong>else<\/strong> \u043f\u043e\u0441\u043b\u0435 <strong>longjmp()<\/strong>, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 <strong>rand()<\/strong> \u0438 \u044d\u0442\u043e\u0442 <strong>printf()<\/strong>\u00a0\u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, <strong>i<\/strong> \u0442\u0430\u043a \u0436\u0435 \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u043b\u0438\u0442\u044c \u0441\u0432\u0435\u0442 \u043d\u0430 \u0441\u0438\u044e \u0442\u0430\u0439\u043d\u0443\u00a0\u2014 \u043f\u0440\u043e\u0448\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<\/div>\n<\/div>\n<p>  <a name=\"vol\"><\/a>  <\/p>\n<h3 id=\"kvalifikator-volatile\">\u041a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <strong>volatile<\/strong><\/h3>\n<p>  <\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#clob\">\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/a> \u00ab\u043b\u0435\u0442\u0443\u0447\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\u00bb\u00a0\u2014 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <strong>volatile<\/strong> (\u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e\u00a0\u2014 \u00ab\u043b\u0435\u0442\u0443\u0447\u0438\u0439\u00bb). \u041e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0442\u0435\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">volatile int i;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 <strong>-O1<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u0435\u043b\u0435 <strong>if<\/strong>: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">; \u0431\u044b\u043b\u043e:   call    _rand   mov     esi, eax ; \u0441\u0442\u0430\u043b\u043e:   call    _rand   mov     [rsp+E8h-DCh], eax   mov     esi, [rsp+E8h-DCh] ; \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:   call    _rand   mov     esi, eax   mov     [rsp+E8h-DCh], eax<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a (<a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r2\">\u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435<\/a>): <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">if (setjmp(jmp) == 0) {   ESI = stack[i] = rand();<\/code><\/pre>\n<p>  <a name=\"irl\"><\/a>  <\/p>\n<h3 id=\"sluchai-ispolzovaniya-abbr-titlein-real-lifeirlabbr\">\u0421\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <abbr title=\"In Real Life\">IRL<\/abbr><\/h3>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043c\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438\u00a0\u2014 \u043d\u0435 \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0438\u043c\u0438\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u043d\u0435-<strong>volatile<\/strong> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u044b\u0436\u043a\u0430, \u0442\u043e SJLJ \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0431\u0435\u0441\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443. \u0418 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0442\u044c \u0430\u0434\u0435\u043f\u0442\u043e\u043c \u0441\u0435\u043a\u0442\u044b \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u0435\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\u00a0\u2014 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0438\u0431\u043e SJLJ \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e <del>\u0437\u0430\u043f\u043e\u043b\u043e\u043d\u0438\u043b\u0438 \u0432\u0441\u044e \u043f\u043b\u0430\u043d\u0435\u0442\u0443<\/del> \u0441\u0440\u0435\u0434\u0438 \u043d\u0430\u0441:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Setjmp.h#Cooperative_multitasking\" rel=\"nofollow\">\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0432 \u0421\u0438 (\u044f \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u00a0\u2014 \u043a\u0430\u043a \u0431\u044b \u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, \u0445\u043e\u0442\u044f <a href=\"https:\/\/habr.com\/ru\/users\/ldir\/\" class=\"user_link\">ldir<\/a> \u0442\u0430\u043a\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u0442\u043e\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/143318\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b<\/a>)<\/li>\n<li>\u043d\u0430 \u0425\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/users\/alexkalmuk\/\" class=\"user_link\">alexkalmuk<\/a> \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/447704\">\u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b \u0432 \u042d\u043b\u044c\u0431\u0440\u0443\u0441\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 SJLJ<\/a> (+ <a href=\"https:\/\/habr.com\/ru\/post\/239387\">\u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a>), \u0430 <a href=\"https:\/\/habr.com\/ru\/users\/dzeban\/\" class=\"user_link\">dzeban<\/a>\u00a0\u2014 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/261003\">\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Linux<\/a><\/li>\n<li>\u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0441\u0442\u043d\u044b\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/261665\">\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440<\/a> (\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e: \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0434\u0443\u043d\u0441\u0442\u0432\u043e \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/atakua\/\" class=\"user_link\">Atakua<\/a>), \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/176707\">\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 x86emu<\/a> (<a href=\"https:\/\/habr.com\/ru\/users\/nwocs\/\" class=\"user_link\">NWOcs<\/a>) \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/176163\">\u0432 libpng<\/a> (\u0432 <a href=\"https:\/\/libjpeg-turbo.org\" rel=\"nofollow\">libjpeg-turbo<\/a> <a href=\"https:\/\/raw.githubusercontent.com\/libjpeg-turbo\/libjpeg-turbo\/master\/example.txt\" rel=\"nofollow\">\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e<\/a>)<\/li>\n<li>\u0432 2017 <a href=\"https:\/\/habr.com\/ru\/users\/skapix\/\" class=\"user_link\">Skapix<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/339698\">\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e <strong>pthreads<\/strong><\/a>, \u0430 <a href=\"https:\/\/habr.com\/ru\/users\/kutelev\/\" class=\"user_link\">kutelev<\/a>\u00a0\u2014 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/332626\">\u043f\u0440\u044b\u0436\u043a\u0438 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/819864\/what-are-some-good-ways-to-use-longjmp-setjmp-for-c-error-handling\" rel=\"nofollow\">\u0442\u0443\u0442 \u043f\u0438\u0448\u0443\u0442<\/a>, \u0447\u0442\u043e \u044d\u0442\u0430 \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Symbian_OS\" rel=\"nofollow\">Symbian<\/a><\/li>\n<li>\u0430 \u0432 <strong>Quake World<\/strong> \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0442\u043e\u0447\u043d\u043e\u00a0\u2014 \u0441\u043c. <a href=\"https:\/\/habr.com\/ru\/post\/324804\">\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0430\u0440\u0445\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0430\u0441\u043a\u043e\u043f\u043e\u043a<\/a> \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/patientzero\/\" class=\"user_link\">PatientZero<\/a> \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <a href=\"https:\/\/github.com\/id-Software\/Quake\/blob\/master\/WinQuake\/host.c\" rel=\"nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a> (\u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0442)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0445\u0440\u0435\u0441\u0442\u043e\u043c\u0430\u0442\u0438\u0439\u043d\u044b\u0439\u00a0\u2014 \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0439\u0442\u0438 \u00ab\u0432\u043e\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb, \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0437\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u0433\u0434\u0435-\u0442\u043e \u0438 \u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438). \u041a\u0441\u0442\u0430\u0442\u0438, <a href=\"https:\/\/habr.com\/ru\/post\/434992\">\u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u0431\u044b\u043b \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/habr.com\/ru\/users\/drmefisto\/\" class=\"user_link\">DrMefistO<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 <strong>Quake World<\/strong> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432 <strong>WinMain()<\/strong>, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 <strong>jmp_buf<\/strong>, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0432 \u043d\u0435\u0433\u043e \u043f\u0440\u044b\u0433\u0430\u0442\u044c, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u00ab\u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 <strong>continue<\/strong>\u00bb: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ WinQuake\/host.c jmp_buf         host_abortserver;  void Host_EndGame (char *message, ...) {   ...    if (cls.demonum != -1)     CL_NextDemo ();   else     CL_Disconnect ();    longjmp (host_abortserver, 1); }  void Host_Error (char *error, ...) {   ...    if (cls.state == ca_dedicated)     Sys_Error (&quot;Host_Error: %s\\n&quot;,string);  \/\/ dedicated servers exit    CL_Disconnect ();   cls.demonum = -1;    inerror = false;    longjmp (host_abortserver, 1); }  void _Host_Frame (float time) {   static double           time1 = 0;   static double           time2 = 0;   static double           time3 = 0;   int                     pass1, pass2, pass3;    if (setjmp (host_abortserver) )     return;                 \/\/ something bad happened, or the server disconnected    ... }  \/\/ QW\/client\/sys_win.c int WINAPI WinMain (...) {   ...    while (1)   {     ...     newtime = Sys_DoubleTime ();     time = newtime - oldtime;     Host_Frame (time);     oldtime = newtime;   }    \/* return success of application *\/   return TRUE; }<\/code><\/pre>\n<p>  <a name=\"perf\"><\/a>  <\/p>\n<h2 id=\"proizvoditelnost\">\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0434\u043e\u0432\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\u00a0\u2014 \u0438\u0445 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 <strong>setjmp()<\/strong> \u0432 <a href=\"http:\/\/ftp.gnu.org\/gnu\/glibc\/\" rel=\"nofollow\">glibc<\/a> \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0426\u041f. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0449\u0435\u043c, \u043d\u0438 SJLJ\/<code>saneex.c<\/code> \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0447\u0438\u0441\u043b\u043e\u0434\u0440\u043e\u0431\u0438\u043b\u043e\u043a<\/li>\n<li>\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435-\u043a\u0445\u0435\u2026\u043a\u0445\u0435-\u043d\u043e\u043b\u043e\u0433\u0438\u0438 (<del>\u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d \u0432 \u0433\u043e\u0440\u043b\u043e \u043f\u043e\u043f\u0430\u043b<\/del>) \u0442\u0430\u043a\u043e\u0432\u044b, \u0447\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0430-\u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u00a0\u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043c\u0430\u043b\u0430\u044f \u0438\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0435\u0441\u0443\u0442<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0430, \u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0445\u043e\u0447\u0435\u0442\u0441\u044f\u00a0\u2014 \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b zero-cost exceptions (\u0438\u043b\u0438, \u0442\u043e\u0447\u043d\u0435\u0435, zero-cost <strong>try<\/strong>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u044e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u0431\u043b\u043e\u043a <strong>try<\/strong>, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432\u0441\u044e \u0433\u0440\u044f\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u0432\u044b\u0431\u0440\u043e\u0441\u0430)\u00a0\u2014 \u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 <strong>goto<\/strong> \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0433\u043c, \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u043e\u0439 \u00ab\u043f\u0435\u0440\u0435\u043a\u043e\u0441\u00bb \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u044d-\u044d, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u00ab\u0427\u0435\u0441\u0442\u043d\u044b\u0435\u00bb zero-cost exceptions \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435, \u0447\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0445 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#vol\">volatile<\/a>-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0435, \u0430 \u043d\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 (\u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0438 \u043d\u0435 \u0437\u0430\u0442\u0438\u0440\u0430\u044e\u0442\u0441\u044f <strong>longjmp()<\/strong>). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u0442\u043e \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft-specific_exception_handling_mechanisms\" rel=\"nofollow\">\u0412 Windows<\/a> \u0435\u0441\u0442\u044c <abbr title=\"Structured Exception Handling\">SEH<\/abbr> \u0438 <abbr title=\"Vectored Exception Handling\">VEH<\/abbr>, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0434\u0432\u0435\u0437\u043b\u0438 \u0432 XP.<\/li>\n<li>\u0412 <strong>gcc<\/strong> \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432\u00a0\u2014 \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 SJLJ, \u043f\u043e\u0442\u043e\u043c DWARF, \u043a\u043e\u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0431\u044b\u043b\u043e \u043f\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0439 (DWARF \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0432 <strong>clang<\/strong>). \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0441\u043c. \u043e\u0442\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/users\/zzeng\/\" class=\"user_link\">zzeng<\/a>: <a href=\"https:\/\/habr.com\/ru\/post\/208006\">\u0442\u044b\u0446<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/267771\">\u0442\u044b\u0446<\/a>, \u0438 \u0441\u0430\u0439\u0442 <a href=\"http:\/\/dwarfstd.org\" rel=\"nofollow\">dwarfstd.org<\/a>.<\/li>\n<li>\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/50985#comment_12975751\">\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/a> \u043a <a href=\"https:\/\/habr.com\/ru\/post\/50985\">\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043a\u0430\u043c\u0440\u0430\u0434 <a href=\"https:\/\/habr.com\/ru\/users\/nuit\/\" class=\"user_link\">nuit<\/a> \u0434\u0430\u043b \u043d\u0430\u0432\u043e\u0434\u043a\u0443 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"http:\/\/www.nongnu.org\/libunwind\/\" rel=\"nofollow\">libunwind<\/a>, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\u00a0\u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u0438\u0437 \u0432\u043e\u0440\u043e\u0431\u044c\u0435\u0432 \u043f\u043e \u043f\u0443\u0448\u043a\u0430\u043c (\u0431\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418, \u0445\u043e\u0442\u044f <code>saneex.c<\/code> \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u043f\u0430\u043b\u044c\u043c\u0443 zero-cost (\u0435\u0435 \u043f\u0430\u043b\u044c\u043c\u0430\u00a0\u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c), \u0442\u0430\u043a \u043b\u0438 \u0443\u0436 \u0441\u0442\u0440\u0430\u0448\u0435\u043d <strong>setjmp()<\/strong>, \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u0430\u043b\u044e\u044e\u0442? \u041c\u043e\u0436\u0435\u0442, \u044d\u0442\u043e \u0441\u0443\u0435\u0432\u0435\u0440\u0438\u0435? \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438\u00a0\u2014 \u043f\u043e\u043c\u0435\u0440\u044f\u0435\u043c.<\/p>\n<p>  <a name=\"bench\"><\/a>  <\/p>\n<h3 id=\"testovaya-sreda\">\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/h3>\n<p>  <\/p>\n<p>\u042f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0434\u0432\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u00ab\u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 <strong>main()<\/strong> \u0432 \u0446\u0438\u043a\u043b\u0435 100 \u0442\u044b\u0441\u044f\u0447 \u0440\u0430\u0437 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0431\u043b\u043e\u043a <strong>try<\/strong>\/<strong>catch<\/strong> \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 <strong>throw()<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043d\u0430 C:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;stdio.h&gt; #include &lt;time.h&gt; #include &quot;saneex.h&quot;  int main(void) {   for (int i = 0; i &lt; 100000; i++) {     try {       \/\/ \u043b\u0438\u0431\u043e (&quot;\u0432\u044b\u0431\u0440\u043e\u0441&quot; = \u0434\u0430):       throw(msgex(&quot;A quick fox jumped over a red dog and a nyancat was spawned&quot;));       \/\/ \u043b\u0438\u0431\u043e (&quot;\u0432\u044b\u0431\u0440\u043e\u0441&quot; = \u043d\u0435\u0442):       time(NULL);     } catchall {       fprintf(stderr, &quot;%s\\n&quot;, curex().message);     } endtry   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043d\u0430 \u0421++ (\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <a href=\"https:\/\/en.wikipedia.org\/wiki\/C%2B%2B#Exception_handling\" rel=\"nofollow\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>, \u0432\u044b\u043d\u0435\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0437\u0430 \u0446\u0438\u043a\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0432 <code>cerr &lt;&lt;<\/code> \u043d\u0430 <strong>fprintf()<\/strong>):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;stdexcept&gt; #include &lt;time.h&gt;  int main() {   std::vector&lt;int&gt; vec{ 3, 4, 3, 1 };    for (int i = 0; i &lt; 100000; i++) {     try {       \/\/ \u043b\u0438\u0431\u043e (&quot;\u0432\u044b\u0431\u0440\u043e\u0441&quot; = \u0434\u0430):       int i{ vec.at(4) };       \/\/ \u043b\u0438\u0431\u043e (&quot;\u0432\u044b\u0431\u0440\u043e\u0441&quot; = \u043d\u0435\u0442):       time(NULL);     }     catch (std::out_of_range &amp; e) {       \/\/ &lt;&lt; \u0432\u043c\u0435\u0441\u0442\u043e fprintf() \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u043d\u0430 25-50%       \/\/std::cerr &lt;&lt; &quot;Accessing a non-existent element: &quot; &lt;&lt; e.what() &lt;&lt; '\\n';       fprintf(stderr, &quot;%s\\n&quot;, e.what());     }     catch (std::exception &amp; e) {       \/\/std::cerr &lt;&lt; &quot;Exception thrown: &quot; &lt;&lt; e.what() &lt;&lt; '\\n';       fprintf(stderr, &quot;%s\\n&quot;, e.what());     }     catch (...) {       \/\/std::cerr &lt;&lt; &quot;Some fatal error\\n&quot;;       fprintf(stderr, &quot;Some fatal error&quot;);     }   }    return 0; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0432 \u0434\u0432\u0443\u0445 \u041e\u0421 (\u043e\u0431\u0435 64-\u0431\u0438\u0442\u043d\u044b\u0435):<\/p>\n<p>  <\/p>\n<ul>\n<li>Windows 10 2019 LTSC \u043f\u043e\u0434 PowerShell \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Measure-Command { test.exe 2&gt;$null }<\/code><\/li>\n<li>\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 Live CD <a href=\"https:\/\/www.ubuntu.com\" rel=\"nofollow\">Ubuntu<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 <strong>time<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Windows \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <strong>__try<\/strong>\/<strong>__except<\/strong>, \u0432\u0437\u044f\u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Exception_handling_syntax#Microsoft-specific\" rel=\"nofollow\">\u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt;  int filterExpression(EXCEPTION_POINTERS* ep) {   ep-&gt;ContextRecord-&gt;Eip += 8;   return EXCEPTION_EXECUTE_HANDLER; }  int main() {   static int zero;   for (int i = 0; i &lt; 100000; i++) {     __try {       zero = 1 \/ zero;       __asm {         nop         nop         nop         nop         nop         nop         nop       }       printf(&quot;Past the exception.\\n&quot;);     }     __except (filterExpression(GetExceptionInformation())) {       printf(&quot;Handler called.\\n&quot;);     }   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0446\u0438\u043a\u043b \u043d\u0435 \u0432\u044b\u0448\u043b\u043e\u00a0\u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error C2712: Cannot use __try in functions that require object unwinding<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u0434 \u0438\u0434\u0443\u0442 \u0432\u0440\u0430\u0437\u0440\u0435\u0437 \u0441 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0441\u0442\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r4\">\u0432 \u043d\u0430\u0447\u0430\u043b\u0435<\/a>, \u044f \u043d\u0435 \u0432\u043d\u0435\u0441 \u044d\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#benchres\">\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0438\u0436\u0435<\/a>. \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e \u044d\u0442\u043e 1100-1300 \u043c\u0441 (Debug \u0438\u043b\u0438 Release, x86)\u00a0\u2014 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 <abbr title=\"Visual Studio\">VS<\/abbr>, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u043d\u0438 \u0436\u0435 \u0432 g++.<\/p>\n<p>  <a name=\"benchres\"><\/a>  <\/p>\n<h3 id=\"rezultaty\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u2116   \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440        \u041a\u043e\u043d\u0444\u0438\u0433    \u041f\u043b\u0430\u0442\u0444 \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c  \u0412\u044b\u0431\u0440\u043e\u0441  \u0412\u0440\u0435\u043c\u044f (\u043c\u0441)\u00b9           saneex \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435  1.  VS 2019 v16.0.0   Debug     x64   saneex.c  \u0434\u0430      9713  \/ 8728  = 1.1   \u0432 1.8 \/ 1.8 2.  VS 2019 v16.0.0   Debug     x64   saneex.c  \u043d\u0435\u0442     95    \/ 46    = 2     \u0432 4.5 \/ 2.3 3.  VS 2019 v16.0.0   Debug     x64   C++       \u0434\u0430      5449  \/ 4750\u00b2 = 1.6 4.  VS 2019 v16.0.0   Debug     x64   C++       \u043d\u0435\u0442     21    \/ 20    = 1 5.  VS 2019 v16.0.0   Release   x64   saneex.c  \u0434\u0430      8542\u00b3 \/ 182   = 47    \u0432 1.8 \/ 0.4 6.  VS 2019 v16.0.0   Release   x64   saneex.c  \u043d\u0435\u0442     80\u00b3   \/ 23    = 3.5   \u0432 8   \/ 1.8 7.  VS 2019 v16.0.0   Release   x64   C++       \u0434\u0430      4669\u00b3 \/ 420   = 11 8.  VS 2019 v16.0.0   Release   x64   C++       \u043d\u0435\u0442     10\u00b3   \/ 13    = 0.8 9.  gcc 9.2.1         -O0       x64   saneex.c  \u0434\u0430      71    \/ 351   = 0.2   \u0432 0.2 \/ 0.6 10. gcc 9.2.1         -O0       x64   saneex.c  \u043d\u0435\u0442     6     \/ 39    = 0.2   \u0432 1.5 \/ 1.1 11. g++ 9.2.1         -O0       x64   C++       \u0434\u0430      378   \/ 630   = 0.6 12. g++ 9.2.1         -O0       x64   C++       \u043d\u0435\u0442     4     \/ 37    = 0.1 13. gcc 9.2.1         -O3       x64   saneex.c  \u0434\u0430      66    \/ 360   = 0.2   \u0432 0.2 \/ 0.6 14. gcc 9.2.1         -O3       x64   saneex.c  \u043d\u0435\u0442     5     \/ 23    = 0.2   \u0432 1   \/ 0.6 15. g++ 9.2.1         -O3       x64   C++       \u0434\u0430      356   \/ 605   = 0.6 16. g++ 9.2.1         -O3       x64   C++       \u043d\u0435\u0442     5     \/ 38    = 0.1<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u00b9 \u0412 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 <strong>\u0412\u0440\u0435\u043c\u044f<\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u0430\u043c\u0435\u0440\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 Windows 7 SP1 x64 \u0441 VS 2017 v15.9.17 \u0438 gcc \u043f\u043e\u0434 cygwin.<\/p>\n<p>  <\/p>\n<p>\u00b2 \u041a\u0440\u0430\u0439\u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: \u0435\u0441\u043b\u0438 <strong>fprintf()<\/strong> \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <code>cerr &lt;&lt;<\/code>, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <strong>\u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0441\u044f<\/strong> \u0432 3 \u0440\u0430\u0437\u0430: 1386\/1527 \u043c\u0441.<\/p>\n<p>  <\/p>\n<p>\u00b3 VS \u0432 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043a\u0430\u0445 \u043d\u0430 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0446\u0438\u0444\u0440\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c\u2026 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043b\u0430\u0432\u0430\u044e\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0438\/\u0438\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u00ab\u0447\u0443\u0434\u0438\u0442\u00bb VS. \u0427\u0435\u043c \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e\u00a0\u2014 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>cerr &lt;&lt;<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <strong>fprintf()<\/strong> \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0432\u044b\u0431\u0440\u043e\u0441\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 VS \u0432 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0446\u0438\u043a\u043b \u0432 3-4 \u0440\u0430\u0437\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 3). <abbr title=\"\u0427\u0442\u043e \u042f \u0414\u0435\u043b\u0430\u044e \u041d\u0435 \u0422\u0430\u043a\">\u0427\u042f\u0414\u041d\u0422<\/abbr>?<\/li>\n<li>\u0412\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0431\u043b\u043e\u043a <strong>try<\/strong> \u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <strong>throw<\/strong>\u00a0\u2014 \u043c\u0438\u0437\u0435\u0440\u043d\u044b\u0435 (4-28 \u043c\u0441 \u043d\u0430 100 \u0442\u044b\u0441\u044f\u0447 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439).<\/li>\n<li>\u041d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u00ab\u0440\u0430\u0437\u043e\u0433\u043d\u0430\u043d\u043d\u043e\u0433\u043e\u00bb Debug \u0432 VS, \u0432\u044b\u0431\u0440\u043e\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 <code>saneex.c<\/code> \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u0445 (\u0432 2.3 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 VS, \u0432 5 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 <strong>gcc<\/strong>\/g++), \u0430 <strong>try<\/strong> \u0431\u0435\u0437 <strong>throw<\/strong>\u00a0\u2014 \u043f\u043e\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043d\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u0412\u043e\u0442 \u044d\u0442\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442!<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u2026 \u0415\u0441\u0442\u044c \u043e \u0447\u0435\u043c \u043f\u043e\u0445\u043e\u043b\u0438\u0432\u0430\u0440\u0438\u0442\u044c. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438!<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 use-case\u00a0\u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u043e\u0432 <strong>try<\/strong> \u0441 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u0438\u043c\u0438 <strong>throw<\/strong> (\u00ab\u043b\u043e\u0432\u0438 \u043c\u043d\u043e\u0433\u043e, \u0431\u0440\u043e\u0441\u0430\u0439 \u043c\u0430\u043b\u043e\u00bb), \u0430 \u043e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 <strong>setjmp()<\/strong>, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u0441\u0443\u0434\u044f \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u043b\u043e\u0445\u0430, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0434\u0443\u043c\u0430\u044e\u0442. \u041a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0438 <a href=\"https:\/\/tratt.net\/laurie\/blog\/entries\/timing_setjmp_and_the_joy_of_standards.html\" rel=\"nofollow\">\u0432\u043e\u0442 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/a>, \u0433\u0434\u0435 \u0430\u0432\u0442\u043e\u0440 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 <strong>setjmp()<\/strong> \u0440\u0430\u0432\u0435\u043d \u0434\u0432\u0443\u043c \u0432\u044b\u0437\u043e\u0432\u0430\u043c \u043f\u0443\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 OpenBSD \u0438 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 (1.45)\u00a0\u2014 \u0432 Solaris. \u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442 2005 \u0433\u043e\u0434\u0430. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u00ab\u043d\u043e\u00bb\u00a0\u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0441\u043a\u0438, \u043d\u043e \u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0438 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443, \u0430 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a\u2026<\/p>\n<p>  <a name=\"saneex\"><\/a>  <\/p>\n<h2 id=\"vinovnik-torzhestva-saneexc\">\u0412\u0438\u043d\u043e\u0432\u043d\u0438\u043a \u0442\u043e\u0440\u0436\u0435\u0441\u0442\u0432\u0430\u00a0\u2014 <code>saneex.c<\/code><\/h2>\n<p>  <\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0447\u0435\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u044b\u043b \u043d\u0430 <abbr title=\"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0414\u043b\u044f \u041f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u044f\">\u041a\u0414\u041f\u0412<\/abbr>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 Visual Studio<\/li>\n<li>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u0443\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0431\u043b\u043e\u043a\u043e\u0432, <strong>throw()<\/strong> \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, <strong>finally<\/strong> \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>catch<\/strong> \u043d\u0430 \u0431\u043b\u043e\u043a (\u043f\u043e \u043a\u043e\u0434\u0443 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f)<\/li>\n<li>\u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 (\u0432\u0441\u0435 \u0432 <strong>static<\/strong>)<\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sexmt\">\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e<\/a>-\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f (<strong>__thread<\/strong>\/<strong>_Thread_local<\/strong>)<\/li>\n<li>\u0432 public domain (<a href=\"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/\" rel=\"nofollow\">CC0<\/a>)<\/li>\n<\/ul>\n<p>  <a name=\"r5\"><\/a>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043c\u043e\u0433\u0443\u0442 <a href=\"https:\/\/github.com\/ProgerXP\/SaneC\" rel=\"nofollow\">\u043d\u0430\u0439\u0442\u0438 \u0435\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 GitHub<\/a>. \u041d\u0438\u0436\u0435 \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sexpit\">\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438<\/a>. \u041a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 <code>saneex-demo.c<\/code> \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">01.    #include &lt;stdio.h&gt; 02.    #include &quot;saneex.h&quot; 03. 04.    int main(void) { 05.      sxTag = &quot;SaneC's Exceptions Demo&quot;; 06. 07.      try { 08.        printf(&quot;Enter a message to fail with: [] [1] [2] [!] &quot;); 09. 10.        char msg[50]; 11.        thrif(!fgets(msg, sizeof(msg), stdin), &quot;fgets() error&quot;); 12. 13.        int i = strlen(msg) - 1; 14.        while (i &gt;= 0 &amp;&amp; msg[i] &lt;= ' ') { msg[i--] = 0; } 15. 16.        if (msg[0]) { 17.          errno = atoi(msg); 18.          struct SxTraceEntry e = newex(); 19.          e = sxprintf(e, &quot;Your message: %s&quot;, msg); 20.          e.uncatchable = msg[0] == '!'; 21.          throw(e); 22.        } 23. 24.        puts(&quot;End of try body&quot;); 25. 26.      } catch (1) { 27.        puts(&quot;Caught in catch (1)&quot;); 28.        sxPrintTrace(); 29. 30.      } catch (2) { 31.        puts(&quot;Caught in catch (2)&quot;); 32.        errno = 123; 33.        rethrow(msgex(&quot;calling rethrow() with code 123&quot;)); 34. 35.      } catchall { 36.        printf(&quot;Caught in catchall, message is: %s\\n&quot;, curex().message); 37. 38.      } finally { 39.        puts(&quot;Now in finally&quot;); 40. 41.      } endtry 42. 43.      puts(&quot;End of main()&quot;); 44.    }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0448\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0431\u0440\u043e\u0441\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0432\u0435\u0441\u0442\u0438\u00a0\u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">End of try body Now in finally End of main()<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c \u043a\u043e\u0434\u043e\u043c (<strong>1<\/strong>), \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0439\u043c\u0430\u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0431\u043b\u043e\u043a\u0435 <code>catch (1)<\/code> (26.), \u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Caught in catch (1) Your message: 1 hello, habr!     ...at saneex-demo.c:18, code 1 Now in finally End of main()<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u043e\u0439\u043a\u0443, \u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0439\u043c\u0430\u043d\u043e (30.), \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u043d\u043e\u0432\u043e\u0435 (\u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u0434\u043e\u043c, \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u043c) \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 (33.), \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Caught in catch (2) Now in finally  Uncaught exception (code 123) - terminating. Tag: SaneC's Exceptions Demo Your message: 2 TM! kak tam blok4ain?     ...at saneex-demo.c:18, code 2 calling rethrow() with code 123     ...at saneex-demo.c:33, code 123 rethrown by ENDTRY     ...at saneex-demo.c:41, code 123<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0432\u0435\u0441\u0442\u0438 <code>!<\/code>, \u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u00ab\u043d\u0435\u0443\u043b\u043e\u0432\u0438\u043c\u044b\u043c\u00bb (<strong>uncatchable<\/strong>; 20.)\u00a0\u2014 \u043e\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0441\u043a\u0432\u043e\u0437\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 <strong>try<\/strong> \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 (\u043a\u0430\u043a <strong>catch<\/strong>, \u0442\u0430\u043a \u0438 <strong>finally<\/strong>), \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u00a0\u2014 \u0433\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 <strong>abort()<\/strong>: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Caught in catch (1) Your message: ! it is a good day to die     ...UNCATCHABLE at saneex-demo.c:18, code 0 Now in finally  Uncaught exception (code 0) - terminating. Tag: SaneC's Exceptions Demo Your message: ! it is a good day to die     ...UNCATCHABLE at saneex-demo.c:18, code 0 UNCATCHABLE rethrown by ENDTRY     ...at saneex-demo.c:41, code 0<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0440\u043e\u0439\u043a\u0443, \u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 <strong>catchall<\/strong> (35.), \u0433\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Caught in catchall, message is: Your message: 3 we need more gold Now in finally End of main()<\/code><\/pre>\n<p>  <a name=\"sexfeat\"><\/a>  <\/p>\n<h3 id=\"ostalnye-fichi\">\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u00ab\u0444\u0438\u0447\u0438\u00bb<\/h3>\n<p>  <a name=\"sexmt\"><\/a>  <\/p>\n<p><strong>\u041f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.<\/strong> \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0435 \u043d\u0435\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 (\u043d\u0435 MSVC\u00b9), \u0442\u043e C11 \u0441\u043f\u0430\u0441\u0435\u0442 \u043e\u0442\u0446\u0430 \u043d\u0430\u0440\u043e\u0434\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Thread-local_storage\" rel=\"nofollow\">TLS<\/a>): <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#define SX_THREAD_LOCAL _Thread_local<\/code><\/pre>\n<p>  <\/p>\n<p>\u00b9 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b \u0443 Microsoft <a href=\"https:\/\/docs.microsoft.com\/en-us\/previous-versions\/visualstudio\/visual-studio-2013\/hh409293(v=vs.120)#compiler\" rel=\"nofollow\">\u0438\u043c\u0435\u044e\u0442\u0441\u044f<\/a> <a href=\"https:\/\/docs.microsoft.com\/en-us\/previous-versions\/hh409293(v=vs.140)#c-runtime-library\" rel=\"nofollow\">\u043a\u0430\u043a\u0438\u0435-\u0442\u043e<\/a> <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/cpp\/build\/reference\/experimental-preprocessor\" rel=\"nofollow\">\u043f\u043e\u0434\u0432\u0438\u0436\u043a\u0438<\/a> \u043d\u0430 \u043f\u043e\u0447\u0432\u0435 open source, \u043d\u043e <del>\u0432\u0441\u0435\u043c \u043f\u043e<\/del> <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/cpp\/c-language\/ansi-conformance\" rel=\"nofollow\">\u0434\u0435\u043b\u043e<\/a> \u0438\u0434\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0445\u043e\u0442\u044f \u0438 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c <a href=\"https:\/\/herbsutter.com\/2012\/05\/03\/reader-qa-what-about-vc-and-c99\/\" rel=\"nofollow\">8 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b <a href=\"https:\/\/coub.com\/view\/cl1z0\" rel=\"nofollow\">\u043f\u043e\u043a\u0430 \u0434\u0435\u0440\u0436\u0438\u043c\u0441\u044f<\/a>.<\/p>\n<p>  <\/p>\n<p><strong>sxTag<\/strong> (05.)\u00a0\u2014 \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0435\u043f\u043e\u0439\u043c\u0430\u043d\u043d\u044b\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0432 <strong>stderr<\/strong>. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0\u2014 \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (<strong>__DATE__<\/strong> <strong>__TIME__<\/strong>).<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SxTraceEntry<\/strong> (\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 stack trace). \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432\u00a0\u2014 \u043e\u0431\u0435\u0440\u0442\u043e\u043a \u043d\u0430\u0434 <code>(struct SxTraceEntry) {...}<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>newex()<\/code>\u00a0\u2014 \u044d\u0442\u043e\u0442 \u0431\u044b\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r5\">\u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a>; \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 <strong>__FILE__<\/strong>, <strong>__LINE__<\/strong> \u0438 \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 = <strong>errno<\/strong> (\u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u043b\u0435 <strong>fgets()<\/strong>; 11.)<br \/> \n<ul>\n<li>\u043a\u043e\u0434 \u043c\u0435\u043d\u044c\u0448\u0435 1 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 1 (\u0438\u0431\u043e <strong>setjmp()<\/strong> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>catch (0)<\/code> \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/li>\n<\/ul>\n<\/li>\n<li><code>msgex(m)<\/code>\u00a0\u2014 \u043a\u0430\u043a <strong>newex()<\/strong>, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<\/li>\n<li><code>exex(m, e)<\/code>\u00a0\u2014 \u043a\u0430\u043a <strong>msgex()<\/strong>, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u0435\u0442 \u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c; \u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 <strong>free()<\/strong> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">try {   TimeoutException *e = malloc(sizeof(*e));   e-&gt;elapsed = timeElapsed;   e-&gt;limit = MAX_TIMEOUT;   errno = 146;   throw(exex(&quot;Connection timed out&quot;, e)); } catch (146) {   printf(&quot;%s after %d\\n&quot;, curex().message,     \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 void *SxTraceEntry.extra:     ((TimeoutException *) curex().extra)-&gt;elapsed); } endtry<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u043c\u043e\u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/C99#Design\" rel=\"nofollow\">designated initializers<\/a> \u0438\u0437 \u0432\u0441\u0435 \u0442\u043e\u0433\u043e \u0436\u0435 C99 (\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 Visual Studio <a href=\"https:\/\/docs.microsoft.com\/en-us\/previous-versions\/visualstudio\/visual-studio-2013\/hh409293(v=vs.120)#compiler\" rel=\"nofollow\">2013+<\/a>): <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">throw( (struct SxTraceEntry) {.message = &quot;kaboom!&quot;} );<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0431\u0440\u043e\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li><code>throw(e)<\/code>\u00a0\u2014 \u0431\u0440\u043e\u0441\u0430\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 <strong>SxTraceEntry<\/strong><\/li>\n<li><code>rethrow(e)<\/code>\u00a0\u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <strong>throw()<\/strong>, \u043d\u043e \u043d\u0435 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 stack trace; \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <strong>catch<\/strong>\/<strong>catchall<\/strong><\/li>\n<li><code>thrif(x, m)<\/code>\u00a0\u2014 \u043c\u0430\u043a\u0440\u043e\u0441; \u043f\u0440\u0438 <code>if (x)<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 <strong>SxTraceEntry<\/strong> \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c <strong>x<\/strong> + <strong>m<\/strong> \u0438 \u00ab\u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u00bb \u0435\u0433\u043e<\/li>\n<li><code>thri(x)<\/code>\u00a0\u2014 \u043a\u0430\u043a <strong>thrif()<\/strong>, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u0443\u0441\u0442\u044b\u043c <strong>m<\/strong><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u00ab\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u00a0\u2014 \u043a\u0430\u043a \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#r5\">\u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a> \u0441 <strong>fgets()<\/strong> (11.), \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 <strong>fgets()<\/strong> \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 (\u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e <abbr title=\"End Of File\">EOF<\/abbr>: <code>.\/a.out &lt;\/dev\/null<\/code>), \u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0412\u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">thri(read(0xBaaD, buf, nbyte)); \/\/ errno = 9, &quot;Bad file descriptor&quot; \/\/ Assertion error: read(0xBaaD, buf, nbyte);<\/code><\/pre>\n<p>  <a name=\"sexpit\"><\/a>  <\/p>\n<h3 id=\"i-osobennosti-realizacii\">\u2026\u0418 \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00bb<\/h3>\n<p>  <\/p>\n<p>\u0418\u0445 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0435 \u0441 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439 (\u043d\u043e \u0437\u0430\u0442\u043e \u043a\u0430\u043a\u0438\u0435!):<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0431\u043b\u043e\u043a \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <strong>endtry<\/strong>\u00a0\u2014 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (\u0431\u043b\u043e\u043a\u0430 <strong>try<\/strong>) \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443<br \/> \n<ul>\n<li>\u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u043e\u0439\u043c\u0430\u0435\u0442, \u0438\u0431\u043e <strong>try<\/strong> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 <code>{<\/code>, \u0430 <strong>endtry<\/strong> \u0438\u0445 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u043b\u0430\u0442\u044c return \u043c\u0435\u0436\u0434\u0443 try \u0438 endtry<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0436\u0438\u0440\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441, \u043d\u043e \u043c\u043e\u044f \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044f \u043d\u0435 \u043d\u0430\u0448\u043b\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0438\u0434\u0435\u0438 \u0438 <abbr title=\"Pull Request\">PR<\/abbr><br \/> \n<ul>\n<li>\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <strong>goto<\/strong> \u0432\u043d\u0443\u0442\u0440\u044c \u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u0442\u043e\u0436\u0435 \u043f\u043e\u0434 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u043c, \u043d\u043e \u0440\u0430\u0437\u0432\u0435 \u0435\u0433\u043e \u043a\u0442\u043e-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442? <code>&lt;\/sarcasm&gt;<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u00ab\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b\u00bb, \u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#vol\">\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435<\/a> <strong>volatile<\/strong>. \u00ab\u041f\u0440\u0438\u0435\u043c\u00bb \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0441\u043c. <strong>longjmp()<\/strong>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u043b\u0430 <strong>try<\/strong>, \u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <strong>catch<\/strong>\/<strong>catchall<\/strong>\/<strong>finally<\/strong> \u0438 \u043f\u043e\u0441\u043b\u0435 <strong>endtry<\/strong>, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a <strong>volatile<\/strong>. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442 \u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435. \u0412\u043e\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">int foo = 1; try {   foo = 2;   \/\/ \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c foo } catchall {   \/\/ \u0430 \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043d\u0435\u0442! } finally {   \/\/ \u0438 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435! } endtry \/\/ \u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f!<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 <strong>volatile<\/strong> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">volatile int foo = 1; try {   ...<\/code><\/pre>\n<p>  <a name=\"sexside\"><\/a>  <\/p>\n<h3 id=\"itog-kak-eto-rabotaet\">\u0418\u0442\u043e\u0433: \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>  <\/p>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 (\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445) \u043c\u0430\u0441\u0441\u0438\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>struct SxTryContext<\/code>\u00a0\u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0431\u043b\u043e\u043a\u0430\u0445 <strong>try<\/strong>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f\u00a0\u2014 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, <strong>jmp_buf<\/strong> \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0434\u0435\u0441\u044c \u0438\u0445 \u0434\u0432\u0430: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">try {   try {     \/\/ \u043c\u044b \u0437\u0434\u0435\u0441\u044c   } endtry } endtry<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>struct SxTraceEntry<\/code>\u00a0\u2014 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 stack trace, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u043e\u043c \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439; \u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0431\u043b\u043e\u043a\u043e\u0432 <strong>try<\/strong>: <\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"plaintext\">try {         \/\/ \u043e\u0434\u0438\u043d SxTryContext   try {       \/\/ \u0434\u0432\u0430 SxTryContext               \/\/ \u043d\u043e\u043b\u044c SxTraceEntry     throw(msgex(&quot;\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0448\u0435\u043b!&quot;));               \/\/ \u043e\u0434\u0438\u043d SxTraceEntry   } catchall {               \/\/ \u043e\u0434\u0438\u043d SxTraceEntry     rethrow(msgex(&quot;\u0412\u0442\u043e\u0440\u043e\u0439 \u043a \u0431\u043e\u044e \u0433\u043e\u0442\u043e\u0432!&quot;));               \/\/ \u0434\u0432\u0430 SxTraceEntry (*)   } endtry } endtry<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435 \u0432\u043c\u0435\u0441\u0442\u043e <strong>rethrow()<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>throw()<\/strong>, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <strong>SxTraceEntry<\/strong> <code>(*)<\/code> \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0434\u0432\u0430, \u0430 \u043e\u0434\u0438\u043d\u00a0\u2014 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d (stack trace \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0438\u0449\u0435\u043d). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 <code>sxAddTraceEntry(e)<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>try<\/strong> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441\u0443\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b (&mdash; \u0432\u0430\u0448 <abbr title=\"\u041a\u0430\u043f\u0438\u0442\u0430\u043d \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c\">\u041a. \u041e.<\/abbr>). \u0421\u043a\u043e\u0431\u043a\u0438 <code>{ }<\/code> \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435, \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">try {                             int _sxLastJumpCode = setjmp(add_context()\u00b9);                                   bool handled = false;                                   if (_sxLastJumpCode == 0) {   throw(msgex(&quot;Mama mia!&quot;));        clearTrace();                                     sxAddTraceEntry(msgex(...));                                     if (count_contexts() == 0) {                                       fprintf(stderr, &quot;Shurik, vs\u0451 propalo!&quot;);                                       sxPrintTrace();                                       exit(curex().code);                                     } else [                                       longjmp(top_context());                                     } } catch (9000) {                  } else if (_sxLastJumpCode == 9000) {                                     handled = true; } catchall {                      } else {                                     handled = true; } finally {                       }                                   \/\/ \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 finally { } } endtry                          remove_context();                                   if (!handled) {                                     \/\/ \u043a\u0430\u043a \u0432\u044b\u0448\u0435 \u0441 throw()                                   }<\/code><\/pre>\n<p>  <\/p>\n<p>\u00b9 \u0418\u043c\u0435\u043d\u0430 \u0441 <strong>_<\/strong> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043f\u043e\u0441\u043b\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sjlj\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439<\/a>, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 SJLJ, \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435 \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043b\u0438\u0448\u043d\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043e\u0442\u043a\u043b\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u0443\u0436\u0435 \u0432\u0430\u043c.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/\"> https:\/\/habr.com\/ru\/post\/491084\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/491084\/\">\n<p>\u041f\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0443\u0433\u0443\u0431\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0425\u0430\u0431\u0440 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0412\u041e\u0417 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043d\u0435 \u0434\u0430\u0436\u0435 \u0441\u0442\u044b\u0434\u043d\u043e \u0435\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u2026 \u043d\u043e \u0432 \u0434\u0443\u0448\u0435 \u0442\u0435\u043f\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0435\u0436\u0434\u0430, \u0447\u0442\u043e \u0430\u0439\u0442\u0438\u0448\u043d\u0438\u043a\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0436\u0430\u043b\u0438\u0441\u044c \u0438 \u043e\u043d\u0430 \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f. \u0418\u043b\u0438 \u043d\u0435\u0442?<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041c\u0435\u043d\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0441\u0445\u0438\u0449\u0430\u043b\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0421\u0438, \u0434\u0430 \u0438 \u0441\u0430\u043c \u0421\u0438\u00a0\u2014 \u043f\u0440\u0438 \u0432\u0441\u0435\u0439 \u0441\u0432\u043e\u0435\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0438\u0445 \u0442\u0430\u043a \u0438 \u0432\u0435\u0435\u0442 \u0434\u0443\u0445\u043e\u043c \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0445 <del>\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043b\u0430\u0437\u0438\u043a\u043e\u0432<\/del> <a href=\"https:\/\/tinyurl.com\/tj364je\" rel=\"nofollow\">\u0445\u0430\u043a\u0435\u0440\u043e\u0432<\/a>. \u0412 <a href=\"https:\/\/tinyurl.com\/m4hdlab\" rel=\"nofollow\">\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435<\/a> \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 (ANSI C, \u043e\u043d \u0436\u0435 C89, <a href=\"https:\/\/tinyurl.com\/djfxz6\" rel=\"nofollow\">\u043e\u043d \u0436\u0435<\/a> ANS X3.159-1989, \u043e\u043d \u0436\u0435, \u043f\u043e\u0437\u0434\u043d\u0435\u0435, C90 \u0438 IEC 9899:1990) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f 145 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 25\u00a0\u2014 \u044d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 (\u0432\u0432\u0438\u0434\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a), \u0430 26 \u0447\u0438\u0441\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445. <a href=\"https:\/\/tinyurl.com\/y6z5z989\" rel=\"nofollow\">K&amp;R \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438<\/a>\u00b2 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 114 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u043f\u043b\u044e\u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435), \u0441\u0447\u0438\u0442\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0443. \u0412 <a href=\"https:\/\/tinyurl.com\/444uvtg\" rel=\"nofollow\">\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435\u00b3 C11<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0436\u0435 348, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0442\u043d\u0438\u00a0\u2014 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u0430 \u0435\u0449\u0435 \u0448\u0442\u0443\u043a 90 \u044d\u0442\u043e \u00ab\u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438\u00bb. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 Boost, \u0433\u0434\u0435 <a href=\"https:\/\/tinyurl.com\/qqu853s\" rel=\"nofollow\">\u043e\u0434\u043d\u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u00a0\u2014 160<\/a>. \u0427\u0443\u0440 \u043c\u0435\u043d\u044f\u2026<\/p>\n<p>  <\/p>\n<p>\u0418 \u0441\u0440\u0435\u0434\u0438 \u044d\u0442\u043e\u0439 \u0441\u043e\u0442\u043d\u0438-\u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e PHP \u0434\u043e\u0448\u043b\u0438 25 \u043b\u0435\u0442 \u0441\u043f\u0443\u0441\u0442\u044f, \u0430 \u0432 Delphi, \u0431\u0443\u0440\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e \u0432\u0440\u0435\u043c\u044f, \u0438\u0445 \u043d\u0435\u0442 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440) \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 50 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 <strong>printf()<\/strong> (\u043c-\u043c-\u043c\u2026 JavaScript), <strong>strftime()<\/strong> (\u2026) \u0438 <strong>scanf()<\/strong> (\u0434\u0435\u0448\u0435\u0432\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c).<\/p>\n<p>  <a name=\"r4\"><\/a>  <\/p>\n<p>\u0410 \u0435\u0449\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438 <strong>setjmp()<\/strong>\/<strong>longjmp()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043f\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0433\u043e \u0421\u0438. \u0412\u043e\u0442 \u043e \u043d\u0438\u0445 \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u00a0\u2014 <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#irl\">Quake World<\/a>, \u0441\u0442\u0435\u043a\u0438, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u044b \u0438 \u043f\u0440\u043e\u0447\u0430\u044f <a href=\"https:\/\/habr.com\/ru\/post\/491084\/#sjlj\">\u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c<\/a>, \u0430 \u0432\u0438\u0448\u0435\u043d\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 (<a href=\"https:\/\/habr.com\/ru\/post\/491084\/#benchres\">\u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/a>: Visual Studio \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430, \u043a\u0430\u043a \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u0438\u0439 \u0437\u0430\u044f\u0446, \u0430 <strong>throw<\/strong> <code>saneex.c<\/code> \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cx\/fz\/jq\/cxfzjqci2ud94mxrbl5bwitnobo.png\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-301041","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=301041"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301041\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=301041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=301041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=301041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}