информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Серьезная уязвимость в Apache Log4j 
 Крупный взлом GoDaddy 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Я в общем не понял вопроса, но в exception-ах разбираюсь неплохо 09.05.07 06:09  Число просмотров: 2811
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
Спасибо за ответ.

>Я в общем не понял вопроса,...
>> (kenguru?) говорят, мол компилируй только с /EHa.
>Компилируй с /EH :-)

VC++ 8.0, kомпилирую с /ЕHs (по дефолту):

try { int *i = 0; *i = 1; }
catch(...) { std::cout << "we will never be here."; }

Считай, что здесь, в try:
void third_party_api_I_have_to_use(void)
{
int *i = 0;
*i = 1;
}

Даже не надейся использовать здесь (с /ЕHs) _set_se_translator(). В VC++ 8.0 (не в VC++ 6.0) это не работает.
Получишь warning C4535: calling _set_se_translator() requires /EHa.
Даже хуже. Всё скомпилируется и рухнет при выполнении.
Здесь как минимум два варианта (на самом деле 3): компилировать с /ЕHa
или помещать third_party_api_I_have_to_use в __try/__except.


>>Чего то не того. __CxxFrameHandler проверяет по сигнатурам является ли >>exception C++сным и если нет, то вызывает se_translator (если он был установлен).

Ты не сможешь установить _set_se_translator( _My_translator_SE2CE) при компиляции с /ЕHs. Только с /ЕHа.


>>А этот самый __CxxFrameHandler устанавливается хэндлером для try-catch блоков >>и генерится автоматом.

Я ответил. Не генерится автоматом для /ЕHs.


>>В принципе, если ты отловил в __except исключение, которое брошено через >>throw, то в принципе нет нормального способа превратить его обратно в CE.

1) B __except я не ловлю исключений, брошенных через throw. Там я ловлю Win32 SE.
Другое дело, что любое исключение, в том числе и программное (throw) будет попадать в __except, если не правильно уцтановить фильтр __except.

Например, такой код не будет работать:
void foo(void)
{
int i = 0;
__try
{
bool something_wrong = true;
if (something_wrong)
throw 1;

}
__except(1)
{
//we will always be here and never in the outside catch()
i = 1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
try
{
foo();
}
catch(...)
{
//we will anever be here :(
int i = 1;
}

return 0;
}


Такой код будет работать корректно:
void foo(void)
{
int i = 0;
int filter = 1;
__try
{
bool something_wrong = true;
if (something_wrong)
{
filter = 0;
throw 1;
}

}
__except(filter)
{
// OK. We will never be here and we will be in the outside catch()
i = 1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{

int i = 0;
try
{
foo();
}
catch(...)
{
//OK
//we are overhere
int i = 1;
}
return 0;
}


2) Из __except ты можешь нормально и легально throw C++ CE.


>>Ловить надо в try-catch, а установленный se_translator (который при >>необходимости будет вызван обработчиком фрейма) должен перебросить SE в виде >>CE (вот здесь двойной оверхэд и по памяти и по времени обработки).

Об этом и речь. Но только вначале надо транслировать SE 2 C++.
<programming> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach