|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 24, 2004 14:32:58 Я неоднократно слышал примерно такую фразу: если исключительное событие маловероятно, то для большей скорости выгоднее использовать механизм исключений, а если "многовероятно", то проще и выгоднее использовать прямую проверку результата. Мне никогда раньше не приходилось писать критичных к скорости выполнения программ, поэтому я подобные заявления просто игнорировал. Но вот прочитал статью про цикличиский инкремент пароля, попытался написать аналог... и вернулся к этому больному месту. Описанный в статье пример хорош всем, кроме одной малюсенькой детали: допустим, я заранее знаю, что длина пароля не превышает N символов. И я хочу, чтобы программа-переборщик остановилась после перебора всех возможных паролей из N символов в любом случае, даже если пароль вдруг не будет найден. Вставлять проверку при каждом изменении позиции символа - слишком дорогое удовольствие: она будет выполняться через каждые M паролей, где M - число символов алфавита. Может быть, попробовать механизм исключений? Вот было бы здорово, чтобы при переходе на N+1-ый символ пароля возникло исключение... И тут вылазит грабля: просто объявить массив как char * и обернуть обращения к нему в try-catch нельзя - в общем случае неизвестно, что будет расположено непосредственоо за концом массива. Вполне может оказаться, что там будет лежать еще какая-то read-write переменная, или даже будет лежать "PADDING" - то есть пустое (или занятое мусором, неважно) место для выравнивания страницы памяти на 4 килобайта. :( Обойти эту граблю можно как минимум двумя методами, но я нигде и никогда не встречал рекомендаций использовать такие методы. Метод 1 : с помощью VirtualAlloc выделить 2 страницы памяти, с помощью VirtualProtect запретить доступ ко второй странице, а буфер хранить в самом конце первой страницы так, чтобы переполнение буфера даже на 1 символ вызывало исключение. Метод 2 : с помощью Get/SetThreadContext изменить отладочные регистры таким образом, чтобы "точка аппаратного останова" располагалась сразу за концом буфера. Оба метода довольно извратны, но больше вариантов я не вижу. В чем я запутался? Может быть, a) другие варианты есть, просто я торможу и не могу их придумать; b) мои варианты вполне нормальны, просто я не в курсе о том, что они используются довольно часто; c) заявление о том, что механизм исключений является хорошей защитой от ошибок в программе - не более чем громкие красивые слова. |
|
|
Дата: Июн 24, 2004 20:25:27 > Я неоднократно слышал примерно такую фразу: > если исключительное событие маловероятно, > то для большей скорости выгоднее использовать механизм > исключений, а если "многовероятно", > то проще и выгоднее использовать прямую проверку результата. странное суждение. это смотря как проверять и что. да, SEH имеет значительный оверхид, но зато ЦП проверяет многие вещи аппаратно. если это однократная проверка, скажем IsBadXXXPrt перед циклом, то SEH лучше не трогать, а вот в цикл IsPadXXXPtr я бы пихать ни стал, на это есть SEH, то же самое и о проверке деления на нуль (в цикле). в общем, каждый случай требует отдельного рассмотрения. > a) другие варианты есть, просто я торможу и не могу их придумать; вообще отказаться от контроля длины. скорость перебора паролей известна и более или менее постоянна, поэтому можно передически всплывать по таймеру и смотреть - сколько еще. как перевалим за N просто рубаем задачу. самое дешевое и наболее системно-независимое решение. > b) мои варианты вполне нормальны, просто я не в курсе о том, что они используются довольно часто; мне пришло в голову тоже самое. > c) заявление о том, что механизм исключений является > хорошей защитой от ошибок в программе - не более чем > громкие красивые слова. SEH не механизм защиты, это механизм уведомления об ошибках. с делегированием полономочий по их обработке аплеухе. |
|
|
Дата: Июн 24, 2004 22:07:26 Есть интересная команда bound. Может подойдёт |
|
|
Дата: Июн 25, 2004 11:09:49 SEH не механизм защиты, это механизм уведомления об ошибках Вот только получается, что уведомляет он далеко не обо всех ошибках. И, как по мне, лучше громкое падение проги, чем ее тихое, но неправильное поведение. Есть интересная команда bound. Может подойдёт Да, интересная команда. Вот только использовать ее в цикле мне совсем не хочется. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088 |