Спираючись на матеріал, описаний в першої частини даної статті, ми продовжимо обговорення теми обробки виключень в Windows x64. І в цій частині ми докладно розглянемо ті області PE образу, які використовуються в процесі обробки винятків. Описуваний матеріал вимагає знання базових понять, таких, як пролог, епілог, кадр функції та розуміння базових процесів, таких, як дії прологу і епілогу, передача параметрів функції і повернення результату функції. Якщо читач не знайомий з вищепереліченим, то перед прочитанням рекомендується ознайомитися з матеріалом з першої частини цієї статті.

Читати далі →

Виключення Windows x64. Як це працює. Частина 1

Раніше ми обговорювали прикладне застосування механізму обробки виключень поза середовища Windows. Тепер ми більш детально розглянемо, як це працює в Windows x64. Матеріал буде описаний послідовно, починаючи з самих основ. Тому багато чого може виявитися вам знайомим, і в цьому випадку такі моменти можна просто пропустити.

Читати далі →

Виключення в UEFI додатку

Будь-якому програмісту, який знайомий з UEFI, відомо, що вбудованого механізму обробки виключень там немає. Мова йде про try/except блоках, які є розширенням Microsoft C/C + + компіляторів. Буває дуже корисно мати такий механізм і в повному обсязі користуватися тими перевагами, які він дає. Тому у даній статті мова піде саме про вирішення цієї проблеми. Також до статті додається повна реалізація механізму з його демонстрацією на базі UEFI програми. Порушені тільки 64х бітні процесори фірми Intel, і в обговоренні маються на увазі тільки вони. Реалізація механізму знаходиться в папці exceptions сховища git за адресою: https://github.com/anatolymik/machineries.git.

Читати далі →

Користь перевіряються винятків вельми сумнівна, а шкода очевидна

Час суперечок пройшло.
— початок глави «Використовуйте не перевірили виключення» книги «Чистий код» Роберта Мартіна.

Як би не хотів Майк Физерс (автор цитати в епіграфі) поставити крапку в суперечці «checked vs безконтрольно exceptions», сьогодні, більш ніж п'ять років по тому, ми змушені визнати, що ця тема досі залишається «холиварной». Спільнота програмістів розділилося на два табори. Обидві сторони наводять вагомі аргументи. Серед тих і інших є розробники екстра-класу: Bruce Eckel критикує концепцію перевіряються винятків, James Gosling — захищає. Схоже, це питання ніколи не буде остаточно закритий.

П'ять років тому рада відмовитися від перевіряються винятків викликав у мене подив і обурення. Підручники з Java пояснювали, коли їх використовувати, а тут таке… У мене зовсім не було досвіду розробки на Java, тому я міг тільки прийняти на віру одне з двох, і я відкинув пораду з «Чистого коду». Я ніколи так не помилявся у своєму житті.

Але в цій статті мова піде про серйозні причини вважати, що зручність перевіряються винятків — міф. Багато статей присвячено цьому питанню, але я постараюся розглянути проблему з дещо іншого боку, навести свої аргументи та приклади. Закривати тему рано.

Загалом, це мій перший пост, не судіть строго ласкаво просимо під кат.

Читати далі →

Винятки для хардкорщиків. Особливості обробки эксепшенов в динамічно розміщується коді

image

Сучасні версії ОС накладають на виконуваний код обмеження, пов'язані з вимогами безпеки. В таких умовах використання механізму виключень в инжектированном коді або, скажімо, у вручну спроецированном образі може стати нетривіальним завданням, якщо не бути в курсі деяких нюансів. У цій статті мова піде про внутрішній устрій юзермодного диспетчера винятків ОС Windows x86/x64/IA64, а також будуть розглянуті варіанти реалізації обходу системних обмежень.

Читати далі →

Виразний JavaScript: Пошук і обробка помилок

Зміст



Налагодження спочатку вдвічі складніше написання коду. Тому, якщо ви пишете код настільки зарозуміла, наскільки можете, то за визначенням ви не здатні налагоджувати його.
Брайан Керниган та П. Ж. Плауэр, «Основи програмного стилю»


Юан-Ма написав невелику програму, що використовує багато глобальних змінних і жахливих хаків. Учень, читаючи програму, запитав його: «Ви попереджали нас про таких техніках, але при цьому я знаходжу їх у вашій же програмі. Як це можливо?» Майстер відповів: «Не потрібно бігти за поливальным шлангом, якщо будинок не горить».

Майстер Юан-Ма, «Книга програмування».


Програма — це кристалізована думка. Іноді думки плутаються. Іноді при перетворенні думок у програму код вкрадаються помилки. В обох випадках виходить пошкоджена програма.

Недоліки в програмах зазвичай називають помилками. Це можуть бути помилки програміста або проблеми в системах, з якими програма взаємодіє. Деякі помилки очевидні, інші — важко контролювати, і можуть ховатися в системах роками.

Часто проблема виникає в тих ситуаціях, виникнення яких програміст спочатку не передбачав. Іноді цих ситуацій можна уникнути. Коли користувача просять ввести його вік, а він вводить «апельсин», це ставить програму в непросту ситуацію. Ці ситуації необхідно передбачати і якось обробляти.

Читати далі →

Rust 1.0 винятків не буде

Rust LogoСьогодні Аарон Тюрон — розробник, який нещодавно приєднався до розробки Rust в Mozilla — оголосив про відстрочення реалізації якого-небудь механізму виключень, крім вже існуючого макросу
try!
і типу
Result
, до невизначеного моменту після першого релізу мови програмування Rust.

Це означає, що у Rust 1.0 будуть відсутні виключення першого класу — тобто, повністю інтегровані з іншими фічами мови.

Для обробки помилок в даній момент у Rust існує тип
Result { Ок(value), Err(why) }
та макрос
try!
. Тип
Result
представляє з себе перерахування (enum), схоже на
Option { Some(value), None }
і пов'язане з ним за змістом. Варіант
None
типу
Option
говорить про отстутствии значення, а варіант
Err(why)
типу
Result
уточнює, чому значення відсутня.

Rust пропонує повертати тип
Result
з функцій, щоб передавати значення повернення або причину, по якій значення повернути не вдалося. Макрос
try!
в свою чергу дозволяє автоматично повертати
Err(why)
з поточної функції, якщо інший виклик функції не вдався (застосовується до об'єкта типу
Result
).

Читати далі →

Виняток - твій друг

  image
У середині дев'яностих, коли я переходив з програмування під DOS на Windows, мій наставник познайомив мене з механізмом винятків.
З тих пір в моїй свідомості вкоренилася думка: програма, падаюча з виключенням — погана програма. Усі винятки треба обробляти і завершувати роботу програми в разі нештатної ситуації самостійно.
І це цілком актуально для звичайного застосування під Windows. Адже в разі падіння програми користувач отримує невиразне повідомлення про помилку і, як результат, негативне сприйняття нестабільно працюючого програми.
Моя думка почало змінюватися після знайомства з інструментами автоматичної обробки виключень (таких як EurekaLog і аналогів).
І остаточно змінилося після знайомства з системою звітів Google Play.
Цей пост — крик душі проти тих тисяч прикладів, які вчать нас пхати в свій код необдумані перевірки.
 
Читати далі →