Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SEH 
:(
    Опции темы
FCM
Дата 17.8.2009, 18:17 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Почему-то с помощью SEH не удается отследить EXCEPTION_INT_OVERFLOW.
Не подавляется (обрабатывается) ли оно аппаратно?

PM MAIL   Вверх
GoldFinch
Дата 17.8.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



FCM, такое аппаратное исключение вообще бывает? что-то сомневаюсь %)
PM MAIL ICQ   Вверх
FCM
Дата 17.8.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Формально приведено в одной книжке (Рихтер "Windows via С/С++") в главе про SEH


Это сообщение отредактировал(а) FCM - 17.8.2009, 19:40
PM MAIL   Вверх
GoldFinch
Дата 17.8.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



вообщето оно генерится инструкцией into
как вы его генерили?
PM MAIL ICQ   Вверх
GremlinProg
Дата 18.8.2009, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



FCM, представляешь, сколько бы проблем было при поднятии такого исключения на автомате?
флаг OF(overflow) очень часто используется штатно для определения критериев завершения циклов,
поэтому такое переполнение не генерируется по-умолчанию

если нужно, просто генерируй его сам:
Код

if( ( (ULONGLONG)x + y ) >> 32 ){
  ::RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_EXECUTE_HANDLER, 0, NULL );
}


into - тоже подойдет, но оно тестирует OF, конкретно по факту операции, типа такого:
Код

x += y;
__asm into;



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 18.8.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(GremlinProg @  18.8.2009,  09:13 Найти цитируемый пост)
x += y;
__asm into;

никакой гарантии, что OF не будет сброшен\установлен кодом между непосредственной операцией сложения и __asm

Добавлено через 3 минуты и 57 секунд
Цитата(GremlinProg @  18.8.2009,  09:13 Найти цитируемый пост)
флаг OF(overflow) очень часто используется штатно для определения критериев завершения циклов,

в любой операции сравнения на больше\меньше проверяется равенство флагов знаков и переполнения
PM MAIL ICQ   Вверх
GremlinProg
Дата 18.8.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch @  18.8.2009,  12:05 Найти цитируемый пост)
никакой гарантии, что OF не будет сброшен\установлен кодом между непосредственной операцией сложения и __asm

при чем тут сброс?

add, inc, sub, dec, mul - все устанавливают OF в соответствии с результатом,
сброс тут не нужен,
если нужно что-то более сложное - встроенный ассемблер в помощь,
а без него - RaiseException, как я уже показал


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 18.8.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg
RaiseException который ты показал сводит на нет весь смысл into, изза немеряного оверхеда, непонятно вообще зачем бросать EXCEPTION_INT_OVERFLOW если можно бросить чтоугодно, всеравно там if

как устанавливается и сбрасывается OF я знаю, любая арифметическая инструкция, в том числе cmp, между сложением и into поменяет OF, кроме того, порядок вызова операторов перед __asm никем не гарантируется, 
  a+=b; x+=y; __asm into
может скомпилироваться в аналог
  x+=y; a+=b; __asm into
PM MAIL ICQ   Вверх
GremlinProg
Дата 18.8.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch @  18.8.2009,  14:17 Найти цитируемый пост)
RaiseException который ты показал сводит на нет весь смысл into

into тут ни при чем, смысл RaiseException как раз в поднятии исключения без использования асма, и соответственно into
RaiseException - равнозначная замена, только с учетом того, что тут можно бросить не обязательно EXCEPTION_INT_OVERFLOW, а любое другое, которое программа в состоянии обработать (вплоть до критического)
любой программист в состоянии завести свой список исключений и работать с ним в дополнение ко всем системным исключениям (mc.exe в помощь)
Цитата(GoldFinch @  18.8.2009,  14:17 Найти цитируемый пост)
всеравно там if

if тут опять же ни при чем, т.к. от OF и  into тут уже ни чего не будет зависеть
Цитата(GoldFinch @  18.8.2009,  14:17 Найти цитируемый пост)
 любая арифметическая инструкция, в том числе cmp, между сложением и into поменяет OF

не любая
Цитата(GoldFinch @  18.8.2009,  14:17 Найти цитируемый пост)
порядок вызова операторов перед __asm никем не гарантируется, 

чтобы порядок не имел значения, у программиста должен быть другой оч. полезный инструмент - голова


GoldFinch, если тебе есть что сказать в тему - я не против, всегда рад разделить мнение,
но если будешь по-прежнему опоражнять пустой стакан, я тебе в него налью воды, не сомневайся


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 18.8.2009, 13:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg
дополнительное вычисление(?) "result >> 32" +  if это в сотни раз медленнее однобайтовой into которая выполняется за 0 или 1 тактов,
это называется "оверхед"
без into это должно реализовываться как jo/jno - тот же if, и это замена одного подхода на другой, 
можно писать into, можно писать jo, это разная логика кода - исключение и условие

Цитата(GremlinProg @  18.8.2009,  13:44 Найти цитируемый пост)
не любая

какая?

Цитата(GremlinProg @  18.8.2009,  13:44 Найти цитируемый пост)
чтобы порядок не имел значения, у программиста должен быть другой оч. полезный инструмент - голова

это вообще к чему?

PM MAIL ICQ   Вверх
GremlinProg
Дата 18.8.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch @  18.8.2009,  15:00 Найти цитируемый пост)
дополнительное вычисление(?) "result >> 32" +  if это в сотни раз медленнее однобайтовой into которая выполняется за 0 или 1 тактов

это к теме не относится, причем даже  "сотни раз" - это уже перебор

Цитата(GoldFinch @  18.8.2009,  15:00 Найти цитируемый пост)
без into это должно реализовываться как jo/jno - тот же if, и это замена одного подхода на другой, 

поздравляю, GoldFinch, ты освоил начальные навыки ассемблера, только к теме это так же не относится

Цитата(GoldFinch @  18.8.2009,  15:00 Найти цитируемый пост)
можно писать into, можно писать jo, это разная логика кода - исключение и условие

это было наглядно продемонстрировано моим первым постом
Цитата(GoldFinch @  18.8.2009,  15:00 Найти цитируемый пост)
какая?

очевидно все те арифметические операции, которые это переполнение не генерируют: DIV, IDIV, и т.п.

Цитата(GoldFinch @  18.8.2009,  15:00 Найти цитируемый пост)
это вообще к чему?

это к тому, что если не предусмотрено вычисление выражения, в ходе которого происходит переполнение, то разницы нет, какая команда это переполнение сгенерировало, результат в любом случае будет неверным


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch1
Дата 18.8.2009, 14:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.8.2009

Репутация: нет
Всего: нет



Признаю я был не прав. Как часто бывает, уверенность в своих знаниях меня подвела. 
Решив посмотреть как ведет себя div, я скомпилил в фасме код
Код

format PE

mov eax,1
mov ecx,2
div ecx
int3

запустил, и получил пресловутый Integer Overflow. Все таки не into единым.

Цитата(GremlinProg @  18.8.2009,  13:41 Найти цитируемый пост)
очевидно ... DIV, IDIV, и т.п.

Уважаемый GremlinProg, опомнись, и перестать писать то чего не знаешь. Ты вводишь в заблуждение участников форума, да и выглядит это не красиво.
Любой справочник говорит: 
DIV -- Unsigned Divide 
Flags Affected
OF, SF, ZF, AR, PF, CF are undefined. 


За сим отправляюсь отдыхать недельку, пока основной акк в бане.
PM MAIL   Вверх
GremlinProg
Дата 18.8.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GoldFinch1 @  18.8.2009,  16:08 Найти цитируемый пост)
Признаю я был не прав. Как часто бывает, уверенность в своих знаниях меня подвела. Решив посмотреть как ведет себя div, я скомпилил в фасме код
Код

format PE

mov eax,1
mov ecx,2
div ecx
int3

запустил, и получил пресловутый Integer Overflow. Все таки не into единым.
Цитата(GremlinProg @  18.8.2009,  15:41 Найти цитируемый пост)
очевидно  ... DIV, IDIV, и т.п.

Уважаемый GremlinProg, опомнись, и перестать писать то чего не знаешь. Ты вводишь в заблуждение участников форума, да и выглядит это не красиво.Любой справочник говорит: DIV -- Unsigned Divide Flags Affected OF, SF, ZF, AR, PF, CF are undefined. За сим отправляюсь отдыхать недельку, пока основной акк в бане.

я даже сохраню это на память )

уважаемый GoldFinch, честно говоря не знаю где ты мог получить в этом коде Integer Overflow, очевидно где-то ранее предоставленного кода, но опираясь даже на справку, которую ты так любезно нам предоставил:
Цитата(GoldFinch1 @  18.8.2009,  16:08 Найти цитируемый пост)
OF, SF, ZF, AR, PF, CF are undefined

are undefined означает не определено, т.е. не затрагиваются, они могут затрагиваться любыми предыдущими операциями, но не данной

совсем не обязательно было лезть в бутылку, только ради того, чтобы посмешить народ,
хотя, признаю, тема стала интересна только благодаря тебе, спасибо!


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
FCM
Дата 18.8.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(GoldFinch @  17.8.2009,  21:27 Найти цитируемый пост)
вообщето оно генерится инструкцией into
как вы его генерили?

Да никак не генерил - прочитал книгу, попробовал . И почему это называется аппаратным исключением, если я его сам должен генерить? Было бы разумным иметь опцию в свойствах проекта, включающую/отключающую генерацию этого исключения.

Кстати пробовал еще с помощью EXCEPTION_ARRAY_BOUNDS_EXCEEDED отловить выход за пределы С-массива -  то же безрезультатно (в Debug это ловилось RTL'ю, а в Release- никак)

A EXCEPTION_FLT_***  фиксируется (после того как контрольным словом отключить их FPU-обработу).
Хотя тут два момента непонятны. 
1) Если  аппаратное FLT-исключение нигде не обработано, Windows его определяет (выдает правильный 16-чный код исключения), но почему-то называет unknown software exception
2) Просматривал статусное слово различных FLT-операций и заметил, что в Release фиксируется меньше критических FLT-событий. Если Debug и Release отличается толко настройками RTL, то как настройки RTL влияют на FPU-обработку FLT-исключений.?

Если взять простое консольное приложение, то "казалось бы" после его одевания при компоновке в SEH-фреймы оно должно иметь внешний фрейм от windows, потом фреймы (или аналоги?) от RTL, потом пользовательские (если есть) ловушки, а аппаратные средства обработки еще глубже. И каким боком туда залезает RTL (в С++ еще минимально , в некоторых языках еще более выраженно).

Не совсем понятно, что собственно генерит аппаратные исключения - CPU/FPU или какие-нибудь драйвера. Также не понятно, как FPU обрабатывает EXCEPTION_FLT_*** действительно аппаратно или драйвера.  Функции VС++ напрямую работают c железом или через WinApi ? 
Например попытка открыть несуществующий файл - приводит к соответствующему errno. Кто его назначает? Это же программное исключение?



Это сообщение отредактировал(а) FCM - 18.8.2009, 18:06
PM MAIL   Вверх
GremlinProg
Дата 19.8.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
И почему это называется аппаратным исключением, если я его сам должен генерить?

ну, потому что процессор не знает ни EXCEPTION_INT_OVERFLOW, ни любой другой статус, привычный нам, он просто генерирует аппаратное прерывание, которое перемещает исполнение кода на соответствующий адрес в векторе прерываний, а оттуда уже операционка нас информирует о случившемся через SEH (в документации такие прерывания обозначаются через решетку: #OF(overflow), #DE(divide error) и т.п.)
Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
Было бы разумным иметь опцию в свойствах проекта, включающую/отключающую генерацию этого исключения.

в принципе, может и появится в будущем,
есть же опция /fp:except, которая расставляет WAIT'ы после любых обращений к FPU
тут в принципе аналогично - после целочисленных вычислений вставлять into, но по-моему, от этого будет только больше проблем, чем пользы
Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
Кстати пробовал еще с помощью EXCEPTION_ARRAY_BOUNDS_EXCEEDED отловить выход за пределы С-массива -  то же безрезультатно (в Debug это ловилось RTL'ю, а в Release- никак)

ну так проверка на выход за границы массива только в дебаге и ведется, можешь и в релизе ее включить, только зачем оно надо, это ведь отладочный механизм
Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
Не совсем понятно, что собственно генерит аппаратные исключения - CPU/FPU или какие-нибудь драйвера

сопроцессор и генерит
Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
как FPU обрабатывает EXCEPTION_FLT_*** действительно аппаратно или драйвера

он не обрабатывает EXCEPTION_FLT_***
он обрабатывает свои контрольные регистры: если поднят флаг исключения (одного из 6), и если это исключение выключено по маске, то генерирует какое-то общее прерывание для исключений (смотри документацию, не помню какое именно)
если исключение маскируется, то FPU просто заменяет результат одним из табличных значений:
Код

Ошибка стека Неопределенность 
Операция с неподдерживаемым числом Неопределенность 
Операция с SNAN QNAN 
Сравнение числа с NAN C0 = C2 = C3 = 1 
Сложение бесконечностей с одним знаком или вычитание  — с разным Неопределенность 
Умножение нуля на бесконечность Неопределенность 
Деление бесконечности на бесконечность или 0/0 Неопределенность 
Команды FPREM и FPREM1, если делитель  — 0 или делимое — бесконечность Неопределенность и C2 = 0 
Тригонометрическая операция над бесконечностью Неопределенность и C2 = 0 
Корень или логарифм, если x < 0, log(x+1), если x < -1 Неопределенность 
FBSTP, если регистр-источник пуст, содержит NAN, бесконечность или превышает 18 десятичных знаков Десятичная неопределенность 
FXCH, если один из операндов пуст Неопределенность 

и продолжает работать дальше
Цитата(FCM @  18.8.2009,  18:59 Найти цитируемый пост)
Функции VС++ напрямую работают c железом или через WinApi ? Например попытка открыть несуществующий файл - приводит к соответствующему errno. Кто его назначает? Это же программное исключение?

с железом работают драйвера, а errno ставит CRT, и это уже не исключение, это что-то вроде упрощенного аналога для GetLastError


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0889 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.