Выпуск новостей ReactOS №62 | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translated in draft, editing and proof-reading required.
If you do not want to register an account, you can sign in with OpenID.
ReactOS Newsletter #62 | ||
PSEH Corruption | ||
In NT operating systems, structured exception handling is used to help safeguard probing of user mode memory buffers and pageable memory while in kernel mode. This requirement was what motivated the creation of the PSEH library by KJK::Hyperion since GCC does not have support for it. Since the last attempt to add SEH support to GCC failed, ReactOS remains dependent on PSEH. Recently, the ARM team committed some code which exposed a very nasty bug in the PSEH library and investigation of the issue led KJK to discover another bug while analyzing the code. Both were fairly serious, as they ended up causing major problems when exceptions were thrown. | В операционных системах семейства NT структурированная обработка исключений (SEH) используется для безопасного освобождения буферов памяти пользовательского режима и страничной памяти в режиме ядра. Это требование мотивировало KJK::Hyperion на создание библиотеки PSEH, так как GCC не имеет поддержки SEH. Так как недавняя попытка добавить её поддержку в GCC провалилась, ReactOS по-прежнему зависит от PSEH. Недавно команда ARM внесла некоторый код, который вызвал очень неприятную ошибку в библиотеке PSEH и расследование причин подвело KJK к обнаружению ещё одной ошибки в процессе анализа кода. Обе эти ошибки являются серьёзными, так как они оказались причиной крупных проблем при возникновении исключений. | — Может уже разместим? — Alex.Pancho — Согласен: на вид все OK, да и оригинал уже неделю как опубликован — h1bymask |
The first bug involved nested try/catch blocks, wherein if an exception was raised and caught in the inner block and another exception was raised in the outer block, the code would jump not to the outer block's catch statement but the inner block. Execution would then progress from the inner block again and result in an infinite loop as the code constantly jumps back. What was effectively happening was that the trylevel for the inner block was not being popped when the code left the block and were left on the stack, which made PSEH think it was still in the inner block. This of course rendered the OS unusable when the bug was triggered, which was what happened after the ARM commit and a test in the automated testing combined to trigger it. With some help from Stefan Ginsberg, KJK managed to find the cause of the bug in the nested try/catch blocks and automated testing is now working again. | Первая ошибка связана с вложенными блоками try/catch, в которых при возникновении и обработке исключения во внутреннем блоке и возникновении второго исключения во внешнем, управление может передаваться не внешнему блоку catch, а внутреннему. Код продолжит исполняться опять с внутреннего блока, что приведет к бесконечному циклу (из-за непрерывной передачи управления обратно). Проблема была в том, что при выходе из блока значение переменной, отвечающей за уровень вложенности, не загружалось из стека, так и оставаясь в нем, из-за чего PSEH считал, что он по-прежнему во внутреннем блоке. Это, конечно же, делало ОС непригодной для использования, когда происходила ошибка. Так и случилось после внесения кода ARM в репозиторий и автоматического теста, составленного для выявления ошибок. С небольшой помощью Стефана Гинсберга, KJK удалось найти причину этой ошибки с вложенными блоками try/catch, и в настоящее время автоматическое тестирование опять работает. | — Из головы вылетел термин... Порождение исключения? Или как возникновение грамотно зовётся? — bz00mmer Comment was deleted — эээ, какой нафиг try/catch??? там же должно быть __try, __except, __finally. Может не будем копировать ошибку из оригинала? — fox_anthony — на самом деле, в ReactOS вообще используются конструкции вида _SEH2_TRY, _SEH2_EXCEPT, _SEH2_END, так что я бы оставил просто try/catch как обозначение — h1bymask — да, это и есть pseudo SEH — fox_anthony |
The second bug is somewhat similar to the first one, in that the execution frame of the exception was not removed from the stack, which would have a completely random result. The really bad thing about this was that this bug could be triggered without nested try/catch blocks so that even while it did not stall the OS, it essentially resulted in random stack corruption which could affect other things and eventually cause hard to trace corruptions. Since this was happening every time an exception was raised in SEH, it would not be surprising if it was the cause of many random crashes ReactOS has suffered since the introduction of PSEH2. Ironically, an identical problem also existed in PSEH1 and also had the same fix. KJK's PSEH test suite also helped, once he added a sanity check that was missing. Of course, adding that check resulted in his code failing the majority of the tests until he fixed the bug. | Вторая ошибка несколько похожа на первую тем, что фрейм стека, в контексте которого выполняется обработка исключения, не удалялся, что приводит к абсолютно непредсказуемым результатам. Настоящая проблема в том, что эта ошибка может активироваться без вложенных блоков try/catch, даже если она не тормозит ОС, то все равно приводит к случайным повреждениям стека, что может повлиять на другие аспекты, и, в итоге, сильно усложняет поиск ошибок. Поскольку это происходило постоянно при возникновении исключения в SEH, нет ничего удивительного в случайных сбоях ReactOS после введения PSEH2.По иронии судьбы, идентичная проблема также существует в PSEH1, и имеет те же причины. Набор тестов PSEH KJK также помог, как только он добавил проверку исправности, которой небыло. Конечно, добавление результатов проверки в его код провалило большинство тестов до тех пор, пока он исправит ошибки. | — Execution frame of the exception - полагаю, что это фрейм стека, в контексте которого исполняется блок try...catch (т.е. "исполняющий фрейм исключений" звучит некорректно). — h1bymask |

— Номер 64 тут: http://translated.by/you/reactos-news... — Alex.Pancho