Гарантії безпеки виключних ситуацій (виняток- калька з російської не рекомендований до вживання) це набір договірних принципів програмування для реалізації клієнтських бібліотек, які були сформульовані [en], стосовно міркувань про безпеку обробки виключних ситуацій в мовах програмування, які використовують механізм виключних ситуацій, зокрема .
Зазвичай, безпека виключних ситуацій бібліотеки чи компоненту означає, що він матиме адекватну поведінку коли трапляється виключна ситуація під час виконання. Для більшості людей, «адекватна» поведінка полягатиме в тому, що для всіх очікуваних ситуацій обробки виключних ситуацій: не має відбуватися витоку ресурсів, і програма має залишатися в чітко визначеному стані, так що її виконання може продовжуватись далі. Для більшості компонентів також очікується, що в результаті виникнення помилки, про неї буде повідомлено клієнту.
Рівні безпеки
Існує декілька рівнів безпеки виключних ситуацій (в неспадному порядку безпечності):
- Гарантія відсутності виключних ситуацій, або прозорість неполадок: Гарантовано, що операції завершуються вдало і задовільняють всі вимоги навіть під час виключних ситуацій. Якщо виникають виключні ситуації, вони будуть оброблятись всередині і не будуть видні клієнтам.
- Посилена безпека, або семантика комітів або відкатів: Операції можуть зазнати невдачі, але невдалі операції не мають завдавати шкоди, так що всі дані збережуть свої первинні значення.
- Базова, або з гарантією відсутності витоків: Часткове виконання або невдалі операції можуть мати побічні ефекти, але всі інваріанти зберігаються і немає витоків ресурсів. Будь-які збережені дані будуть мати правильні значення, навіть якщо вони відрізнятимуться від тих, що були перед виникненням виключної ситуації.
- Відсутність безпеки виключних ситуацій: Немає ніяких гарантій.
Зазвичай, на базовому рівні безпеки виключних ситуацій необхідно писати надійний код. Більш високі рівні безпеки іноді може бути важко досягти, і можуть бути затратними за рахунок додаткового копіювання.
Техніки виконання безпеки виключних ситуацій
Основними засобами мови програмування для написання безпечного коду є:
- блок
try
і - підтримка техніки проектування «Resource Acquisition Is Initialization» (Отримання ресурсу є ініціалізація).
Основною ідеєю техніки/шаблону проектування «Resource Acquisition Is Initialization» (RAII) є те, що володіння ресурсом віддається об'єкту з обмеженою областю видимості. Зазвичай такий об'єкт створює (відкриває, виділяє пам'ять, і так далі) ресурс в своєму конструкторі. Таким чином, деструктор об'єкта може звільнити ресурс в кінці свого життя незалежно від того, що призвело до закінчення його життєвого циклу, вихід за межі видимості чи виключна ситуація.
Міфи і забобони
«Взаємодія між шаблонами і виключними ситуаціями (exceptions) погано зрозуміла.» Цей міф легко спростовується тим, що ніякої взаємодії не існує. Шаблон, після створення його екземпляру, в усіх відносинах працює як звичайний клас чи функція. Для того, щоб передбачити поведінку шаблона при виключних ситуаціях, слід думати про нього як про конкретний екземпляр, який даний шаблон реалізує. Врешті решт, узагальненість шаблонів не має викликати особливих занепокоєнь. Хоча клієнтська частина програми поставляє компоненту частину реалізації (яка може, якщо не прописана інша поведінка, генерувати довільні виключні ситуації), те ж саме виникає і при використанні віртуальних функцій або просто роботі із вказівниками на функції.
«Неможливо написати безпечний узагальнений контейнер». Це твердження часто виникає з посиланням на статтю Тома Каргіла (Tom Cargill), в якій він досліджує проблему безпеки виключних ситуацій для узагальнених стекових шаблонів. В своїй статті, він підіймає багато корисних питань, але на жаль не може дати вирішення його проблеми. Тому він робить припущення, що рішення не існує. Але пісня публікації статті, послідувало багато прикладів безпечних узагальнених компонентів, серед яких контейнери стандартної бібліотеки C++.
«Наявність коду з генеруванням і обробкою виключних ситуацій сповільнює програму, а шаблони використовуються спеціально для отримання найкращої можливої продуктивності.» Хороша реалізація C++ не призведе до жодного циклу команд для обробки виключних ситуацій, до моменту їх генерування, а при обробці швидкість виконання коду буде порівняна з викликом функції. Програма, яка містить код обробки виключних ситуацій буде мати таку саму швидкодію, як і програма яка ігнорує можливість виникнення помилок. Використання виключних ситуацій (exceptions) може привести до прискорення програми, в порівнянні з «традиційним» способом обробки помилок з ряду причин. По-перше, блок catch явно вказує компілятору, який код відноситься до ситуацій обробки помилок; і він може виноситись окремо із звичайного ходу виконання програми, підвищуючи компактність посилань. По-друге, код із «традиційним» способом обробки помилок має зазвичай має повертати коди помилок, а код який їх викликає повинен постійно їх перевіряти після кожного виклику такої функції; використання виключень повністю позбавляє від цих накладних витрат.
«Виключення ускладнюють розуміння поведінки програми.» Зазвичай це приводять на підтримку міфу про «приховані» шляхи виконання програми, які відбувається під час знищення стеку (stack-unwinding). Приховані шляхи виконання програми не нове поняття для програміста C++, який завжди очікує, що локальні (автоматичні) змінні підлягають знищенню після виходу із функції:
ErrorCode f( int& result ) // 1 { // 2 X x; // 3 ErrorCode err = x.g( result ); // 4 if ( err != kNoError ) // 5 return err; // 6 // ...Будь-який інший код слідує тут... return kNoError; // 7 }
У прикладі наведеному вище, відбувається «прихований» виклик деструктору X::~X() у 6-ій і 7-ій строчці коду. Завдяки, використанню виключень, немає явного коду, який присвячений обробці помилки:
int f() // 1 { // 2 X x; // 3 int result = x.g(); // 4 // ...Будь-який інший код слідує тут... return result; // 5 }
Для більшості програмістів, які знайомі з механізмом обробки виключних ситуацій, другий приклад насправді є більш читабельним і зрозумілим, ніж перший. «Приховані» шляхи виконання коду мають ті самі виклики деструкторів локальних змінних. Крім того, вони слідують тому самому методу, який працює так само ніби там би були потенційні команди виходу return після виклику кожної функції, які генерують виключні ситуації. Читабельність такого коду краща, оскільки код виконання логіки програми не змішується з кодом обробки помилок, а функція може використовувати можливість повернення значень природним чином на свій розсуд.
Примітки
- . Архів оригіналу за 18 березня 2015. Процитовано 29 серпня 2008.
- Abrahams D. Exception-Safety in Generic Components // Lect. Notes Comput. Sci. / G. Goos, J. Hartmanis, J. v. Leeuwen — Berlin, Heidelberg, New York, NY, London [etc.]: , 2000. — P. 69–79. — 11 p. — ISSN 0302-9743; 1611-3349 — doi:10.1007/3-540-39953-4_6
- Bjarne Stroustrup. (PDF). Архів оригіналу (PDF) за 21 березня 2015. Процитовано 19 березня 2015.
- . Архів оригіналу за 3 лютого 2009. Процитовано 19 березня 2015.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - Exception Safety: Concepts and Techniques [ 5 березня 2015 у Wayback Machine.], Bjarne Stroustrup, AT&T Labs — Research Florham Park, NJ 07932, USA
- «Exception Handling: A False Sense of Security» [ 8 червня 2007 у Wayback Machine.], Tom Cargill, C++ Report, Nov-Dec 1994
Література
- Herb Sutter: Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions, 2000
- Jon Kalb: Exception-Safe Coding in C++ [ 20 березня 2015 у Wayback Machine.], with C++Now! 2012 presentations on exception safety.
- Related discussion on Stackoverflow: C++: do you (really) write exception safe code [ 20 березня 2015 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Цю статтю треба для відповідності Вікіпедії. (грудень 2016) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Garantiyi bezpeki viklyuchnih situacij vinyatok kalka z rosijskoyi ne rekomendovanij do vzhivannya ce nabir dogovirnih principiv programuvannya dlya realizaciyi kliyentskih bibliotek yaki buli sformulovani en stosovno mirkuvan pro bezpeku obrobki viklyuchnih situacij v movah programuvannya yaki vikoristovuyut mehanizm viklyuchnih situacij zokrema C Zazvichaj bezpeka viklyuchnih situacij biblioteki chi komponentu oznachaye sho vin matime adekvatnu povedinku koli traplyayetsya viklyuchna situaciya pid chas vikonannya Dlya bilshosti lyudej adekvatna povedinka polyagatime v tomu sho dlya vsih ochikuvanih situacij obrobki viklyuchnih situacij ne maye vidbuvatisya vitoku resursiv i programa maye zalishatisya v chitko viznachenomu stani tak sho yiyi vikonannya mozhe prodovzhuvatis dali Dlya bilshosti komponentiv takozh ochikuyetsya sho v rezultati viniknennya pomilki pro neyi bude povidomleno kliyentu Rivni bezpekiIsnuye dekilka rivniv bezpeki viklyuchnih situacij v nespadnomu poryadku bezpechnosti Garantiya vidsutnosti viklyuchnih situacij abo prozorist nepoladok Garantovano sho operaciyi zavershuyutsya vdalo i zadovilnyayut vsi vimogi navit pid chas viklyuchnih situacij Yaksho vinikayut viklyuchni situaciyi voni budut obroblyatis vseredini i ne budut vidni kliyentam Posilena bezpeka abo semantika komitiv abo vidkativ Operaciyi mozhut zaznati nevdachi ale nevdali operaciyi ne mayut zavdavati shkodi tak sho vsi dani zberezhut svoyi pervinni znachennya Bazova abo z garantiyeyu vidsutnosti vitokiv Chastkove vikonannya abo nevdali operaciyi mozhut mati pobichni efekti ale vsi invarianti zberigayutsya i nemaye vitokiv resursiv Bud yaki zberezheni dani budut mati pravilni znachennya navit yaksho voni vidriznyatimutsya vid tih sho buli pered viniknennyam viklyuchnoyi situaciyi Vidsutnist bezpeki viklyuchnih situacij Nemaye niyakih garantij Zazvichaj na bazovomu rivni bezpeki viklyuchnih situacij neobhidno pisati nadijnij kod Bilsh visoki rivni bezpeki inodi mozhe buti vazhko dosyagti i mozhut buti zatratnimi za rahunok dodatkovogo kopiyuvannya Tehniki vikonannya bezpeki viklyuchnih situacijOsnovnimi zasobami movi programuvannya dlya napisannya bezpechnogo kodu ye blok try i pidtrimka tehniki proektuvannya Resource Acquisition Is Initialization Otrimannya resursu ye inicializaciya Osnovnoyu ideyeyu tehniki shablonu proektuvannya Resource Acquisition Is Initialization RAII ye te sho volodinnya resursom viddayetsya ob yektu z obmezhenoyu oblastyu vidimosti Zazvichaj takij ob yekt stvoryuye vidkrivaye vidilyaye pam yat i tak dali resurs v svoyemu konstruktori Takim chinom destruktor ob yekta mozhe zvilniti resurs v kinci svogo zhittya nezalezhno vid togo sho prizvelo do zakinchennya jogo zhittyevogo ciklu vihid za mezhi vidimosti chi viklyuchna situaciya Mifi i zaboboni Vzayemodiya mizh shablonami i viklyuchnimi situaciyami exceptions pogano zrozumila Cej mif legko sprostovuyetsya tim sho niyakoyi vzayemodiyi ne isnuye Shablon pislya stvorennya jogo ekzemplyaru v usih vidnosinah pracyuye yak zvichajnij klas chi funkciya Dlya togo shob peredbachiti povedinku shablona pri viklyuchnih situaciyah slid dumati pro nogo yak pro konkretnij ekzemplyar yakij danij shablon realizuye Vreshti resht uzagalnenist shabloniv ne maye viklikati osoblivih zanepokoyen Hocha kliyentska chastina programi postavlyaye komponentu chastinu realizaciyi yaka mozhe yaksho ne propisana insha povedinka generuvati dovilni viklyuchni situaciyi te zh same vinikaye i pri vikoristanni virtualnih funkcij abo prosto roboti iz vkazivnikami na funkciyi Nemozhlivo napisati bezpechnij uzagalnenij kontejner Ce tverdzhennya chasto vinikaye z posilannyam na stattyu Toma Kargila Tom Cargill v yakij vin doslidzhuye problemu bezpeki viklyuchnih situacij dlya uzagalnenih stekovih shabloniv V svoyij statti vin pidijmaye bagato korisnih pitan ale na zhal ne mozhe dati virishennya jogo problemi Tomu vin robit pripushennya sho rishennya ne isnuye Ale pisnya publikaciyi statti posliduvalo bagato prikladiv bezpechnih uzagalnenih komponentiv sered yakih kontejneri standartnoyi biblioteki C Nayavnist kodu z generuvannyam i obrobkoyu viklyuchnih situacij spovilnyuye programu a shabloni vikoristovuyutsya specialno dlya otrimannya najkrashoyi mozhlivoyi produktivnosti Horosha realizaciya C ne prizvede do zhodnogo ciklu komand dlya obrobki viklyuchnih situacij do momentu yih generuvannya a pri obrobci shvidkist vikonannya kodu bude porivnyana z viklikom funkciyi Programa yaka mistit kod obrobki viklyuchnih situacij bude mati taku samu shvidkodiyu yak i programa yaka ignoruye mozhlivist viniknennya pomilok Vikoristannya viklyuchnih situacij exceptions mozhe privesti do priskorennya programi v porivnyanni z tradicijnim sposobom obrobki pomilok z ryadu prichin Po pershe blok catch yavno vkazuye kompilyatoru yakij kod vidnositsya do situacij obrobki pomilok i vin mozhe vinositis okremo iz zvichajnogo hodu vikonannya programi pidvishuyuchi kompaktnist posilan Po druge kod iz tradicijnim sposobom obrobki pomilok maye zazvichaj maye povertati kodi pomilok a kod yakij yih viklikaye povinen postijno yih pereviryati pislya kozhnogo vikliku takoyi funkciyi vikoristannya viklyuchen povnistyu pozbavlyaye vid cih nakladnih vitrat Viklyuchennya uskladnyuyut rozuminnya povedinki programi Zazvichaj ce privodyat na pidtrimku mifu pro prihovani shlyahi vikonannya programi yaki vidbuvayetsya pid chas znishennya steku stack unwinding Prihovani shlyahi vikonannya programi ne nove ponyattya dlya programista C yakij zavzhdi ochikuye sho lokalni avtomatichni zminni pidlyagayut znishennyu pislya vihodu iz funkciyi ErrorCode f int amp result 1 2 X x 3 ErrorCode err x g result 4 if err kNoError 5 return err 6 Bud yakij inshij kod sliduye tut return kNoError 7 U prikladi navedenomu vishe vidbuvayetsya prihovanij viklik destruktoru X X u 6 ij i 7 ij strochci kodu Zavdyaki vikoristannyu viklyuchen nemaye yavnogo kodu yakij prisvyachenij obrobci pomilki int f 1 2 X x 3 int result x g 4 Bud yakij inshij kod sliduye tut return result 5 Dlya bilshosti programistiv yaki znajomi z mehanizmom obrobki viklyuchnih situacij drugij priklad naspravdi ye bilsh chitabelnim i zrozumilim nizh pershij Prihovani shlyahi vikonannya kodu mayut ti sami vikliki destruktoriv lokalnih zminnih Krim togo voni sliduyut tomu samomu metodu yakij pracyuye tak samo nibi tam bi buli potencijni komandi vihodu return pislya vikliku kozhnoyi funkciyi yaki generuyut viklyuchni situaciyi Chitabelnist takogo kodu krasha oskilki kod vikonannya logiki programi ne zmishuyetsya z kodom obrobki pomilok a funkciya mozhe vikoristovuvati mozhlivist povernennya znachen prirodnim chinom na svij rozsud Primitki Arhiv originalu za 18 bereznya 2015 Procitovano 29 serpnya 2008 Abrahams D Exception Safety in Generic Components Lect Notes Comput Sci G Goos J Hartmanis J v Leeuwen Berlin Heidelberg New York NY London etc Springer 2000 P 69 79 11 p ISSN 0302 9743 1611 3349 doi 10 1007 3 540 39953 4 6 d Track Q924044d Track Q29394459d Track Q1511639d Track Q1812791 Bjarne Stroustrup PDF Arhiv originalu PDF za 21 bereznya 2015 Procitovano 19 bereznya 2015 Arhiv originalu za 3 lyutogo 2009 Procitovano 19 bereznya 2015 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Exception Safety Concepts and Techniques 5 bereznya 2015 u Wayback Machine Bjarne Stroustrup AT amp T Labs Research Florham Park NJ 07932 USA Exception Handling A False Sense of Security 8 chervnya 2007 u Wayback Machine Tom Cargill C Report Nov Dec 1994LiteraturaHerb Sutter Exceptional C 47 Engineering Puzzles Programming Problems and Solutions 2000 Jon Kalb Exception Safe Coding in C 20 bereznya 2015 u Wayback Machine with C Now 2012 presentations on exception safety Related discussion on Stackoverflow C do you really write exception safe code 20 bereznya 2015 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cyu stattyu treba vikifikuvati dlya vidpovidnosti standartam yakosti Vikipediyi Bud laska dopomozhit dodavannyam dorechnih vnutrishnih posilan abo vdoskonalennyam rozmitki statti gruden 2016