Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 06:03
Оценка: 35 (9)
Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.

Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).

void foo(const string&);

void test_eh1(const vector<string> & v)
{
  try
  {
    for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
      foo(*i);
  }
  catch(...)
  {
    __asm int 3
  }
}

void test_eh2(const vector<string> & v)
{
  for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
  {
    try
    {
      foo(*i);
    }
    catch(...)
    {
      __asm int 3
    }
  }
}


Вот что создаёт компилятор, инструкции для поддержки C++ EH выделены:

_TEXT   SEGMENT
__$EHRec$ = -16                     ; size = 16
_v$ = 8                         ; size = 4
?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z PROC ; test_eh1, COMDAT

; 62   : {

    push    ebp
    mov ebp, esp
    push    -1 ; состояние для обработчика SEH
    ;; установка SEH фрейма OS - регистрируется обработчик понимающий C++ исключения 
    push    __ehhandler$?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z
    mov eax, DWORD PTR fs:0
    push    eax
    mov DWORD PTR fs:0, esp
    push    ecx
    push    ebx
    push    esi
    push    edi

; 63   :   try
; 64   :   {
; 65   :     for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    mov edi, DWORD PTR _v$[ebp]
    mov esi, DWORD PTR [edi]
    mov DWORD PTR __$EHRec$[ebp], esp
    mov DWORD PTR __$EHRec$[ebp+12], 0 ; состояние для обработчика SEH
    npad    5
$LL3@test_eh1:
    cmp esi, DWORD PTR [edi+4]
    je  SHORT $LN10@test_eh1

; 66   :       foo(*i);

    push    esi
    call    ?foo@@YGXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z ; foo
    add esi, 16                 ; 00000010H
    jmp SHORT $LL3@test_eh1
__catch$?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z$0:

; 67   :   }
; 68   :   catch(...)
; 69   :   {
; 70   :     __asm int 3

    int 3

; 71   :   }

    mov eax, $LN10@test_eh1
    ret 0
$LN10@test_eh1:

; 72   : }

    mov ecx, DWORD PTR __$EHRec$[ebp+4] ;; снатие SEH frame 
    pop edi
    pop esi
    mov DWORD PTR fs:0, ecx             ;;
    pop ebx
    mov esp, ebp
    pop ebp
    ret 4
_TEXT   ENDS


_TEXT   SEGMENT
_i$21988 = -20                      ; size = 4
__$EHRec$ = -16                     ; size = 16
_v$ = 8                         ; size = 4
?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z PROC ; test_eh2, COMDAT

; 75   : {

    push    ebp
    mov ebp, esp
    push    -1
    push    __ehhandler$?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z
    mov eax, DWORD PTR fs:0
    push    eax
    mov DWORD PTR fs:0, esp
    sub esp, 8

; 76   :   for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    mov eax, DWORD PTR _v$[ebp]
    push    ebx
    push    esi
    mov esi, DWORD PTR [eax]
    push    edi
    mov DWORD PTR __$EHRec$[ebp], esp
$LN23@test_eh2:
    mov ecx, DWORD PTR _v$[ebp]
    mov DWORD PTR _i$21988[ebp], esi
    cmp esi, DWORD PTR [ecx+4]
    je  SHORT $LN2@test_eh2

; 77   :   {
; 78   :     try
; 79   :     {
; 80   :       foo(*i);

    push    esi
    mov DWORD PTR __$EHRec$[ebp+12], 0
    call    ?foo@@YGXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z ; foo
    mov DWORD PTR __$EHRec$[ebp+12], -1

; 76   :   for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    add esi, 16                 ; 00000010H
    jmp SHORT $LN23@test_eh2
__catch$?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z$0:

; 81   :     }
; 82   :     catch(...)
; 83   :     {
; 84   :       __asm int 3

    int 3

; 85   :     }

    mov DWORD PTR __$EHRec$[ebp+12], -1
    mov eax, $LN21@test_eh2
    ret 0
$LN21@test_eh2:
    mov esi, DWORD PTR _i$21988[ebp]
    add esi, 16                 ; 00000010H
    jmp SHORT $LN23@test_eh2
$LN2@test_eh2:

; 86   :   }
; 87   : }

    mov ecx, DWORD PTR __$EHRec$[ebp+4]
    pop edi
    pop esi
    mov DWORD PTR fs:0, ecx
    pop ebx
    mov esp, ebp
    pop ebp
    ret 4
_TEXT   ENDS


Если откинуть мусор, останется соль — команды вида
mov DWORD PTR __$EHRec$[ebp+12], 0
mov DWORD PTR __$EHRec$[ebp+12], -1

Это неявно вводимая компилятором переменная (типа ehstate) — состояние, по которому, в случае выброса исключения, обработчик определит, где оно произошло. "Оверхед" от этих команд очень мал по сравнению, например, с вызовом функции — на скорости цикла не скажется.

SEH фрейм регистрируется один раз — в прологе и снимается один раз — в эпилоге функции. В этом примере не видно, но можете проверять сами — картина останется неизменной независимо от количества вложенных try catch блоков. Будет лишь меняться значение ehstate — по сути, уровень вложенности. Если интересно, как работает обработчик, можно почитать статью Matt Pitreck в MSDN (есть перевод на wasm.ru) об обработке обычных (SEH) исключений компилятором MSVC. C++ EH работает примерно так же, только структура на стеке чуть меньше

Из принципиальных отличий от кода без исключений, я бы выделил невозможность инлайна:
1. дестракторов объектов из try блока;
2. самих функций с try блоком.
но тут еще вопрос, является ли это оверхедом, учитывая, что функция вызывается более одного раза...


Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Правда об оверхеде исключений.
От: StevenIvanov США  
Дата: 18.07.08 07:39
Оценка: 10 (2) +2
Здравствуйте, gear nuke, Вы писали:

GN>Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.


GN>...


вроде еще никто не писал про arm+gcc.
Мне приходилось писать для embedded devices с ARM процессором. Компилятор — gcc 3.4.3
Так вот, со включенной поддержкой исключений -fexceptions размер бинарников вырастал на 20-30% (я так понял из-за таблиц раскрутки стека).
Одна эта причина заставила отказаться от них (и заодно от rtti, но это уже не столь печально и вообще это совсем другая история). Это повлекло за собой отказ от части бустовских либ

Вот теперь и у нас coding standard запрещает использование исключений и rtti...
Re[4]: Правда об оверхеде исключений.
От: remark Россия http://www.1024cores.net/
Дата: 14.07.08 19:20
Оценка: 9 (1) :))
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, IID, Вы писали:


IID>>В любом случае будет расход кучи тактов.


GN>А главное, что это будет в исключительной ситуации


Меня интересует с какой скоростью сервер будет обрабатывать запросы, меня не интересует с какой скоростью он не будет обрабатывать запросы.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Правда об оверхеде исключений.
От: remark Россия http://www.1024cores.net/
Дата: 15.07.08 08:47
Оценка: +2 :)
Здравствуйте, Roman Odaisky, Вы писали:

M>>Дык обычно кричат о накладных расходах именно те кто не знает как реализованны механизмы исключений.


RO>Вот я не знаю. Где об этом хорошо написано?


В дизассемблере


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Правда об оверхеде исключений.
От: IceStudent Украина  
Дата: 15.07.08 08:21
Оценка: 6 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Вы тут не упомянули самую малость

А>А конкретно то что бросание исключения это вызов ядра, и последующий callback из ядра user-mode обработчика (ntdll!KiUserExceptionDispatcher) который уже начнет бродить по структурам в TEB'е вызывая обрабочики. И пара тысяч тактов CPU на всю эту мудотень.
Никто не запрещает реализовать поддержку исключений С++ без SEH (то есть, без поддержки OS фактически). Это очень положительно скажется на быстродействии при возникновении исключительной ситуации.
Re[2]: Правда об оверхеде исключений.
От: IID Россия  
Дата: 14.07.08 13:55
Оценка: +2
Здравствуйте, Аноним, Вы писали:

GN>>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.

А>Вы тут не упомянули самую малость
А>А конкретно то что бросание исключения это вызов ядра, и последующий callback из ядра user-mode обработчика (ntdll!KiUserExceptionDispatcher) который уже начнет бродить по структурам в TEB'е вызывая обрабочики. И пара тысяч тактов CPU на всю эту мудотень.

Дык он разбирал накладные расходы в случае, если исключение не будет брошено. А ежели оно будет брошено — то какая разница где стоит try/catch ? В любом случае будет расход кучи тактов.
kalsarikännit
Re[7]: DoS
От: Аноним  
Дата: 15.07.08 22:45
Оценка: :))
GN>То есть, для отказоустойчивой системы, обработка таких запросов должна быть штатной ситуацией. От некорректных нагрузки обычно не много — исключение быстрее обработается, чем бизнес-логика (запросы к БД, ФC и тп.)
Бизнес логика она обычно после авторизации клиента идет. return false из процедуры логина будет работать быстрее throw IncorrectLogin(); в исполнении MSVS и сервер будет менее чувствителен к DDoS'у рандомными логинами.
Re[21]: DoS
От: Аноним  
Дата: 17.07.08 16:09
Оценка: -1 :)
А>>Я уже не про син флуд, раз он вам не понравился парой мессаг выше, а про фазинг.

GN>

Results 1 — 1 of 1 for ddos фазинг

http://en.wikipedia.org/wiki/Fuzz_testing
Re[23]: DoS
От: Аноним  
Дата: 18.07.08 09:08
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>>>>Я уже не про син флуд, раз он вам не понравился парой мессаг выше, а про фазинг.

А>Всегда прикалывало как народ ставит плюисик и минусики анонимам. Не стоит оно таких усилий по передвижени мышки, нам же пофиг
не всё только для нас драгоценных

А>А вот вы бы написали два тупых сервера теста ради. Один делает accept, recv strcmp(data, "password") и closesocket, а другой тоже самое, но со throw.

А>А натравили бы на них что нить отсюда например http://www.computerdefense.org/2007/01/15/fuzzing-tools/
А>И подумали бы крепко.
А>Хотя если конечно вы работаете исключительно на одного какого корпоративного то заказчика.. то вам это пофиг. Это оправдано с экономической точки зрения.
тут вроде уже выяснили что неверный логин не есть исключительная ситуация, поэтому если кто-то в этом случае бросает исключения, то это не проблема исключений, а проблема кадров, покупаемых систем и т.д и т.п
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 12:04
Оценка: 4 (1)
Здравствуйте, Alexander G, Вы писали:

AG>А почему MSVC x86 — самый плохой случай из промышленных компиляторов ?


В нём C++ EH реализован поверх SEH OS, генерируются дополнительные машинные команды для инициализации хендлеров (см. пролог функции). ICC для Win32 тоже попадает сюда, т.к. он бинарно совместим. Это разумная плата за возможность ловить и низкоуровневые исключения + возможность трансляции их в C++.

В GCC, если не ошибаюсь, сделано как и в Win64, без оверхеда в рантайме на инициализацию (data approach согласно TR 18015).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Правда об оверхеде исключений.
От: quodum  
Дата: 15.07.08 11:20
Оценка: 1 (1)
Здравствуйте, Максим2006, Вы писали:

М>На on-line MSDN для MapViewOfFile нет вроде упоминаний о __try/__catch


Внимательнее.

To guard against EXCEPTION_IN_PAGE_ERROR exceptions, use structured exception handling to protect any code that writes to or reads from a memory mapped view of a file other than the page file. For more information, see Reading and Writing From a File View.


М>Ага, ограничение, ограничивающее использование исключений поэтому и отказываются


COM запрещает только передачу исключений через границу компонента. Внутри можно использовать, если это удобно с точки зрения дизайна конкретного компонента. Отказываются же, зачастую, из "религиозных" соображений, а отнюдь не из технических или архитектурных.
Re: Правда об оверхеде исключений.
От: Аноним  
Дата: 14.07.08 12:36
Оценка: +1
GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.
Вы тут не упомянули самую малость
А конкретно то что бросание исключения это вызов ядра, и последующий callback из ядра user-mode обработчика (ntdll!KiUserExceptionDispatcher) который уже начнет бродить по структурам в TEB'е вызывая обрабочики. И пара тысяч тактов CPU на всю эту мудотень.
Re[6]: DoS
От: gear nuke  
Дата: 15.07.08 12:07
Оценка: +1
Здравствуйте, jazzer,

Отказ в обслуживании обычно происходит как раз из-за корректных (с точки зрения сервера) запросов, которые таковыми на самом деле не являются (эксплуатация уязвимости), либо их слишком много (DDoS — всего лишь способ усложнить политику отброса запросов).

То есть, для отказоустойчивой системы, обработка таких запросов должна быть штатной ситуацией. От некорректных нагрузки обычно не много — исключение быстрее обработается, чем бизнес-логика (запросы к БД, ФC и тп.)

R>>

J>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[12]: DoS
От: VoidEx  
Дата: 16.07.08 15:15
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Но тезис "исключения мона юзать, если их не юзать" несколько нелогичен, не правда ли?


У вас подушка безопасности в машине есть?
Это я к вопросу логичности тезиса.
Re[19]: DoS
От: Аноним  
Дата: 18.07.08 07:43
Оценка: -1
VE>Не надо удаляться. С доказательствами на аналогиях что?
VE>А то сдаётся мне, верность исходного утверждения теперь зависит от того, достоин ли аноним звания "специалист" на РСДН.
Сдается мне вам в форум по филологии нужно. Вас это больше интересует.
Re: Правда об оверхеде исключений.
От: Were  
Дата: 14.07.08 08:09
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.


Особенно упертых даже этим не убедишь )
Re: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 08:55
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.


[skip]

GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.


Не сдержался?
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 09:47
Оценка:
Здравствуйте, Were,

Например, я — сверхупёртый Поэтому, если что-то расходится с моими взглядами (а если я что-то не знаю, то любая информация расходится), стараюсь проверить сам.

Предыстория поста: прочитал в MSDN, что C++ EH (стало быть и вообще C++ в общем случае) невозможно в ядре Windows. Одна из причин — огромный оверхед. Разобрался — на самом деле потому, что рантайм хранит немного хлама в TLS, которых в ядре нет, реализовал без него
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 09:53
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Не сдержался?


Когда-то, в MSDN я читал в основном только первую половину описания функций — о параметрах. Потом заметил, что в какой-то вполне повседневной, в ремарках написано о необходимости __try.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Правда об оверхеде исключений.
От: merk Россия  
Дата: 14.07.08 10:19
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.


GN>Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).


GN>
GN>void foo(const string&);

GN>void test_eh1(const vector<string> & v)
GN>{
GN>  try
GN>  {
GN>    for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
GN>      foo(*i);
GN>  }
GN>  catch(...)
GN>  {
GN>    __asm int 3
GN>  }
GN>}

GN>void test_eh2(const vector<string> & v)
GN>{
GN>  for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
GN>  {
GN>    try
GN>    {
GN>      foo(*i);
GN>    }
GN>    catch(...)
GN>    {
GN>      __asm int 3
GN>    }
GN>  }
GN>}
GN>



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

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

типа псевдокод.


extern void f(int fx); //генерит исключение 1 и 2

int test()
{
  int x=0;
  try 
  {
    while (x<100)
    {
       f(x); x++;
    }
   }
   catch( исключение 1) {return 1; };
   catch( исключение 2) {return 2; };
   return 0;
}
Re[3]: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 10:45
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Максим2006, Вы писали:


М>>Не сдержался?


GN>Когда-то, в MSDN я читал в основном только первую половину описания функций — о параметрах. Потом заметил, что в какой-то вполне повседневной, в ремарках написано о необходимости __try.


Напиши, плиз, в какой, если вспомнишь.
А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 10:55
Оценка:
Здравствуйте, merk, Вы писали:

M>пример не очень показательный.


Пример такой, что бы было похоже на пост по ссылке.

M>сделайте так

M>есть функция, что кидает 2 разных исключения
M>вызиывется в простом цикле.
M>после цикла есть обработчик одного и другого исключения.

Вот сам бы сделал, и увидел бы, что количество throw и catch не повлияет на размер лишнего кода (рузумеется, будет добавлен код для каждого catch и по вызову 2х аргументной функции на каждый throw). Хендлер будет всё равно один (он вообще один на всю программу и вызывается через переходники, см. ниже) и искать нужный catch в статической таблице (по типу брошенного объекта).

__ehhandler$?blah-blah:
    mov eax, OFFSET __ehfuncinfo$?blah-blah
    jmp ___CxxFrameHandler3


В простых случаях, с /EHs, компилятор вообще может разрулить все без SEH, на условных переходах.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 11:11
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Напиши, плиз, в какой, если вспомнишь.


Написал в "какой-то", потому что она не одна. Например, MapViewOfFile.

М>А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.


Я мало знаком с COM, вот что нашел:

COM will not propagate a C++ exception from the callee to the caller, even when both the caller and the callee are written in C++. This catches some COM newcomers off guard, but it should be no surprise if you recall that COM is language-independent. COM boundaries are language boundaries. After all, if the caller is written in C and the callee is written in C++, what would COM do with the C++ exception? If your code throws an exception, the caller will see a failure with an HRESULT of 0x80010105 (RPC_E_SERVERFAULT). Interestingly enough, this is the same error the caller sees if the callee attempts an illegal memory access. In both cases, the COM runtime isolates the caller of the object from runtime errors inside the object and presents them as server errors.

Это ведь не запрет, а ограничение?
Кстати, С++ рантайм зачем-то понимает исключение с NTSTATUS 0xE0000000|'MOC' (C++ имеют код 0xE0000000|'msc')
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Правда об оверхеде исключений.
От: varnie  
Дата: 14.07.08 11:29
Оценка:
Здравствуйте, merk, Вы писали:

M>сделайте так

M>есть функция, что кидает 2 разных исключения
M>вызиывется в простом цикле.
M>после цикла есть обработчик одного и другого исключения.

M>типа псевдокод.


подумалось еще вот что -- интересно, а как влияет на быстродействие "вложенность" try/catch?
try{
   try{
    //...code
    //...code
   }catch(const ExceptionKindOne &e){
     //do smth
   }
}catch(const ExceptionKindTwo &e){
  //do smth
}
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: Правда об оверхеде исключений.
От: Alexander G Украина  
Дата: 14.07.08 11:30
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).


А почему MSVC x86 — самый плохой случай из промышленных компиляторов ?
Русский военный корабль идёт ко дну!
Re[5]: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 12:12
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Максим2006, Вы писали:


М>>Напиши, плиз, в какой, если вспомнишь.


GN>Написал в "какой-то", потому что она не одна. Например, MapViewOfFile.

На on-line MSDN для MapViewOfFile нет вроде упоминаний о __try/__catch

М>>А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.


GN>Я мало знаком с COM, вот что нашел:

GN>

COM will not propagate a C++ exception from the callee to the caller, even when both the caller and the callee are written in C++. This catches some COM newcomers off guard, but it should be no surprise if you recall that COM is language-independent. COM boundaries are language boundaries. After all, if the caller is written in C and the callee is written in C++, what would COM do with the C++ exception? If your code throws an exception, the caller will see a failure with an HRESULT of 0x80010105 (RPC_E_SERVERFAULT). Interestingly enough, this is the same error the caller sees if the callee attempts an illegal memory access. In both cases, the COM runtime isolates the caller of the object from runtime errors inside the object and presents them as server errors.

GN>Это ведь не запрет, а ограничение?
GN>Кстати, С++ рантайм зачем-то понимает исключение с NTSTATUS 0xE0000000|'MOC' (C++ имеют код 0xE0000000|'msc')

Ага, ограничение, ограничивающее использование исключений поэтому и отказываются
Re[3]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 12:17
Оценка:
Здравствуйте, varnie, Вы писали:

V>подумалось еще вот что -- интересно, а как влияет на быстродействие "вложенность" try/catch?


Практически никак не влияет. Я уже упоминал выше про ehstate — грубо, каждому try присвается свой номер и он сохраняется на входе в блок командами
mov DWORD PTR __$EHRec$[ebp+12], 0

Количество catch влияет на размер данных (по 16 байт на каждый). В рантайме оверхед == 0 — затраты только если возникло исключение.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Правда об оверхеде исключений.
От: merk Россия  
Дата: 14.07.08 13:09
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, merk, Вы писали:


M>>пример не очень показательный.


GN>Пример такой, что бы было похоже на пост по ссылке.


M>>сделайте так

M>>есть функция, что кидает 2 разных исключения
M>>вызиывется в простом цикле.
M>>после цикла есть обработчик одного и другого исключения.

GN>Вот сам бы сделал, и увидел бы, что количество throw и catch не повлияет на размер лишнего кода (рузумеется, будет добавлен код для каждого catch и по вызову 2х аргументной функции на каждый throw). Хендлер будет всё равно один (он вообще один на всю программу и вызывается через переходники, см. ниже) и искать нужный catch в статической таблице (по типу брошенного объекта).


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

а критиковал я пример только потому, что он не иллюстрирует реальное применение исключений, когда происходит обработка какого-то конкретного исключения, а не ВСЕХ. что есть просто перехват трэпа.
Re[4]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 15:19
Оценка:
Здравствуйте, merk, Вы писали:

M>честно говоря, я настолько морально устойчив, что не применяю некие прынципы, только исходя из кода, что генерит для них компилятор.


Значит этот пост был адресован другим.

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


В "философии програмирования" я бы охотно согласился, а, например, ISO/IEC составили Technical Report on C++ Performance где Exception Handling посвещен десяток страниц. Там люди штаны просиживают.

M>а критиковал я пример только потому, что он не иллюстрирует реальное применение исключений, когда происходит обработка какого-то конкретного исключения, а не ВСЕХ.


Что бы более-менее раскрыть тему C+ EH в MSVC, нужно минимум статью по объёму как у Pietrek (эх, опесатался выше ) и Jorgon, да 1K+ LOC. Без учета Re: Правда об оверхеде исключений.
Автор:
Дата: 14.07.08
Только чукча не писатель, чукча лесом едет, лес поёт
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 15:19
Оценка:
Здравствуйте, IID, Вы писали:

IID>В любом случае будет расход кучи тактов.


А главное, что это будет в исключительной ситуации

P.S. ты куда пропал
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Правда об оверхеде исключений.
От: jazzer Россия Skype: enerjazzer
Дата: 15.07.08 00:44
Оценка:
Здравствуйте, remark, Вы писали:

R>

R>Меня интересует с какой скоростью сервер будет обрабатывать запросы, меня не интересует с какой скоростью он не будет обрабатывать запросы.


В разумных пределах, иначе это прямая допога в DDOS.
Негоже, если все корректные запросы должны сидеть и курить трубку, пока сервер не разберется с одним залетевшим некорректным.

R>

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Правда об оверхеде исключений.
От: minorlogic Украина  
Дата: 15.07.08 04:38
Оценка:
Дык обычно кричат о накладных расходах именно те кто не знает как реализованны механизмы исключений.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[6]: Правда об оверхеде исключений.
От: remark Россия http://www.1024cores.net/
Дата: 15.07.08 07:25
Оценка:
Здравствуйте, jazzer, Вы писали:

R>>

R>>Меня интересует с какой скоростью сервер будет обрабатывать запросы, меня не интересует с какой скоростью он не будет обрабатывать запросы.


J>В разумных пределах, иначе это прямая допога в DDOS.

J>Негоже, если все корректные запросы должны сидеть и курить трубку, пока сервер не разберется с одним залетевшим некорректным.

Ну это так... больше для красного словца


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Правда об оверхеде исключений.
От: Roman Odaisky Украина  
Дата: 15.07.08 08:27
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Дык обычно кричат о накладных расходах именно те кто не знает как реализованны механизмы исключений.


Вот я не знаю. Где об этом хорошо написано?
До последнего не верил в пирамиду Лебедева.
Re[3]: Правда об оверхеде исключений.
От: Аноним  
Дата: 15.07.08 08:52
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, minorlogic, Вы писали:


M>>Дык обычно кричат о накладных расходах именно те кто не знает как реализованны механизмы исключений.


RO>Вот я не знаю. Где об этом хорошо написано?


http://www.microsoft.com/msj/0197/Exception/Exception.aspx
Re: Правда об оверхеде исключений.
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 15.07.08 11:39
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN> ...Пропущенно...


Вы приводите заведомо элементарный код... проблемма в том что не всегда (тривиальные случаи не берем) понятно что является исключительной ситуацией, а что нет.
Приветду свой пример из жизни:
Есть сервер, на котором запущено некоторое количество сервисов которые обрабатывают запросы пользователей. Сервисы разрабатывались отдельно друг от друга. Задача каждого сервиса(сервера) как можно быстреее восстановиться после сбоя. Естественно разработчики каждого сервера исходили из того что разрыв соединения это исключительная ситуация которая никогда не происходит и кидали всяческие Exceptionы. Так вот с одним из сервисов, по техническим причинам стало постоянно рваться соедининие. Остальные могли работать как ни в чем не бывало, но из-за так называемых "небольших" накладных расходов, вся система встала р%%%ком да так что мышкорй даже нельзя было пошевелить.
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 15.07.08 12:07
Оценка:
Здравствуйте, <Аноним>,

Кстати, подобное может произойти и при тривиальном чтении байта из памяти, если страница выгружена. И мало кто обращает на это внимание, хотя еще и HDD придётся ждать
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 15.07.08 12:38
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>с одним из сервисов, по техническим причинам стало постоянно рваться соедининие.


Вроде бы, таймаут измеряется в секундах.

ATP>из-за так называемых "небольших" накладных расходов, вся система встала р%%%ком да так что мышкорй даже нельзя было пошевелить.


Странно, приоритет обработчика мыши выше, чем любого юзермодного кода (по крайней мере в Windows). Проблема могда быть из-за TCP стека (в ядре).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 15.07.08 14:17
Оценка:
Здравствуйте, quodum, Вы писали:

Q>Здравствуйте, Максим2006, Вы писали:


М>>На on-line MSDN для MapViewOfFile нет вроде упоминаний о __try/__catch


Q>Внимательнее.


Q>

Q>To guard against EXCEPTION_IN_PAGE_ERROR exceptions, use structured exception handling to protect any code that writes to or reads from a memory mapped view of a file other than the page file. For more information, see Reading and Writing From a File View.


Спасибо.


М>>Ага, ограничение, ограничивающее использование исключений поэтому и отказываются


Q>COM запрещает только передачу исключений через границу компонента. Внутри можно использовать, если это удобно с точки зрения дизайна конкретного компонента. Отказываются же, зачастую, из "религиозных" соображений, а отнюдь не из технических или архитектурных.


Хотел бы я посмотреть на такой компонент, где намешаны коды возвратов и исключения
Пользование какого-то инструмента определяется его надобностью.. зачастую
Re[8]: Правда об оверхеде исключений.
От: quodum  
Дата: 15.07.08 15:19
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Хотел бы я посмотреть на такой компонент, где намешаны коды возвратов и исключения

Да ну брось, неужели не сталкивался? Впрочем, я имел в виду не "намешивание", а последовательное использование одной схемы внутри реализации и трансляцию в другую схему на границе компонента (библиотеки).

М>Пользование какого-то инструмента определяется его надобностью.. зачастую

Бывает и так, и последнее время, к счастью, всё чаще. Но, увы, отнюдь не всегда...
Re[3]: Правда об оверхеде исключений.
От: Аноним  
Дата: 15.07.08 22:52
Оценка:
GN>Странно, приоритет обработчика мыши выше, чем любого юзермодного кода (по крайней мере в Windows).
Это в теории. На практике
void __cdecl trd(void*)
{
for(;;)_beginthread(trd, 0, 0);
}

замораживает мышь.
Re[4]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 16.07.08 04:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>void __cdecl trd(void*)
А>{
А>for(;;)_beginthread(trd, 0, 0);
А>}
А>


Запустил. Отправляю сообщение
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Правда об оверхеде исключений.
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 16.07.08 06:55
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>с одним из сервисов, по техническим причинам стало постоянно рваться соедининие.


GN>Вроде бы, таймаут измеряется в секундах.


Это в теории , на практике бывает что он практически отсутствует.

ATP>>из-за так называемых "небольших" накладных расходов, вся система встала р%%%ком да так что мышкорй даже нельзя было пошевелить.


GN>Странно, приоритет обработчика мыши выше, чем любого юзермодного кода (по крайней мере в Windows). Проблема могда быть из-за TCP стека (в ядре).


Ну это, так сказать, преувеличение. На самом деле мышь дергалась, а все ресурсы системы ушли на обработку исключений.
Re[4]: Правда об оверхеде исключений.
От: Roman Odaisky Украина  
Дата: 16.07.08 07:48
Оценка:
Здравствуйте, Аноним, Вы писали:

M>>>Дык обычно кричат о накладных расходах именно те кто не знает как реализованны механизмы исключений.

RO>>Вот я не знаю. Где об этом хорошо написано?

А>http://www.microsoft.com/msj/0197/Exception/Exception.aspx


Интересно. Ну это майкрософтовские. А остальные механизмы?
До последнего не верил в пирамиду Лебедева.
Re[8]: DoS
От: Roman Odaisky Украина  
Дата: 16.07.08 07:56
Оценка:
Здравствуйте, Аноним, Вы писали:

GN>>То есть, для отказоустойчивой системы, обработка таких запросов должна быть штатной ситуацией. От некорректных нагрузки обычно не много — исключение быстрее обработается, чем бизнес-логика (запросы к БД, ФC и тп.)


А>Бизнес логика она обычно после авторизации клиента идет. return false из процедуры логина будет работать быстрее throw IncorrectLogin(); в исполнении MSVS и сервер будет менее чувствителен к DDoS'у рандомными логинами.


Так тебе же и пытаются сказать, что даже в исполнении MSVS этот throw будет только чуть-чуть медленнее.

Хотя ошибка авторизации — это вовсе не исключительная ситуация.
До последнего не верил в пирамиду Лебедева.
Re[9]: DoS
От: Аноним  
Дата: 16.07.08 09:30
Оценка:
RO>Хотя ошибка авторизации — это вовсе не исключительная ситуация.
Вы хотите сказать что вызов ядра — это чуть чуть медленнее retn 'а?
Боюсь я вас разочарую.
__declspec(dllexport) void __cdecl func_throw()
{

    throw (int)0;
}

#pragma optimize("", off)
__declspec(dllexport) int __cdecl func_ret()
{
    return 0;
}
#pragma optimize("", on)

int main(int argc, char * argv[])
{   
#define LOOP_COUNT 0x100000
    ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    __int64 i;
    LARGE_INTEGER tm0, tm1 ,tm2 ,tm3, freq;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&tm0);

    for(i=0;i<LOOP_COUNT;i++)
    {
        try
        {
            func_throw();
        }
        catch(int)
        {

        }    
    }
    QueryPerformanceCounter(&tm1);
    
    for(i=0;i<LOOP_COUNT;i++)
    {
        try
        {
            func_ret();
        }
        catch(int)
        {
            
        }    
    }
    QueryPerformanceCounter(&tm2);
    for(i=0;i<LOOP_COUNT;i++)
    {
        func_ret();
    }    
    QueryPerformanceCounter(&tm3);
    printf("throw: %I64u (%I64u msec)\nno throw: %I64u (%I64u msec)\nreturn: %I64u (%I64u msec)\n", 
        tm1.QuadPart-tm0.QuadPart, (tm1.QuadPart-tm0.QuadPart)*1000/freq.QuadPart,
        tm2.QuadPart-tm1.QuadPart, (tm2.QuadPart-tm1.QuadPart)*1000/freq.QuadPart,
        tm3.QuadPart-tm2.QuadPart, (tm3.QuadPart-tm2.QuadPart)*1000/freq.QuadPart);

    return 0;
};

MSVS6:

throw: 24922021515 (8277 msec)
no throw: 7474005 (2 msec)
return: 5956568 (1 msec)



MSVS8 (2005):

throw: 22129733512 (7350 msec)
no throw: 25230900 (8 msec)
return: 20586413 (6 msec)

Re[10]: DoS
От: gear nuke  
Дата: 16.07.08 10:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вы хотите сказать что вызов ядра — это чуть чуть медленнее retn 'а?


Нет, что в так называемом "обычно" до авторизации дойдёт, если пользовать prolexic.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: DoS
От: Roman Odaisky Украина  
Дата: 16.07.08 14:27
Оценка:
Здравствуйте, Аноним, Вы писали:

RO>>Хотя ошибка авторизации — это вовсе не исключительная ситуация.

А>Вы хотите сказать что вызов ядра — это чуть чуть медленнее retn 'а?

Я хотел сказать, что при ошибке авторизации нечего бросаться исключениями.

А>MSVS6:


А>

А>throw: 24922021515 (8277 msec)
А>no throw: 7474005 (2 msec)
А>return: 5956568 (1 msec)



А>MSVS8 (2005):


А>

А>throw: 22129733512 (7350 msec)
А>no throw: 25230900 (8 msec)
А>return: 20586413 (6 msec)


Интересно.

Вот что получается у GCC 4.2:
#include <iostream>

void success();
void failure();

inline volatile unsigned long long rdtsc()
{
    register unsigned long long tsc asm("eax");
    asm volatile (".byte 15, 49" : : : "eax", "edx");
    return tsc;
}

int main()
{
    unsigned const n = 1000;

    unsigned long long const start1 = rdtsc();
    for(unsigned i = 0; i < n; ++i)
    {
        success();
    }
    unsigned long long const finish1 = rdtsc();

    unsigned long long const start2 = rdtsc();
    for(unsigned i = 0; i < n; ++i)
    {
        try
        {
            success();
        }
        catch(...)
        {
        }
    }
    unsigned long long const finish2 = rdtsc();

    unsigned long long const start3 = rdtsc();
    for(unsigned i = 0; i < n; ++i)
    {
        try
        {
            failure();
        }
        catch(...)
        {
        }
    }
    unsigned long long const finish3 = rdtsc();


    std::cout << (finish1 - start1) << std::endl;
    std::cout << (finish2 - start2) << std::endl;
    std::cout << (finish3 - start3) << std::endl;
}

Получается, если с -O3, так:

12210 (эта не бросается)
12180 (эта не бросается, но ее ловят)
24958478 (а эта еще и как бросается)

Так что, исходный тезис — исключения, пока их никто не бросает, дают очень малый оверхед — принимается?
До последнего не верил в пирамиду Лебедева.
Re[11]: DoS
От: Аноним  
Дата: 16.07.08 14:48
Оценка:
RO>Так что, исходный тезис — исключения, пока их никто не бросает, дают очень малый оверхед — принимается?
Ну да. Но если в проекте появляются исключения их обычно начинают бросать все по любому поводу. Вы не подумайте что я против них, проекты разные бывают, многим это пофиг (те же СУБД, UI). Но тезис "исключения мона юзать, если их не юзать" несколько нелогичен, не правда ли?
Re[13]: DoS
От: Аноним  
Дата: 16.07.08 15:18
Оценка:
VE>У вас подушка безопасности в машине есть?
VE>Это я к вопросу логичности тезиса.
Как мне самому когдато сказали — доказательства построенные на аналогиях идут далеко и лесом
Re[14]: DoS
От: VoidEx  
Дата: 16.07.08 22:02
Оценка:
Здравствуйте, Аноним, Вы писали:

VE>>У вас подушка безопасности в машине есть?

VE>>Это я к вопросу логичности тезиса.
А>Как мне самому когдато сказали — доказательства построенные на аналогиях идут далеко и лесом
А вы приняли на веру. Похвально.
Re[14]: DoS
От: gear nuke  
Дата: 17.07.08 05:27
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как мне самому когдато сказали — доказательства построенные на аналогиях идут далеко и лесом


Программа — абстракция мира; случай с подушками — не аналогия, а частный случай. Конечно, верность в частном случае не доказывает верность утверждения в общем, если не применить индукцию. Но это и не требуется, мы же понимаем, что серебрянной пули нет. Достаточно посмотреть, подходит ли какой-то конкретный частный случай под правило. Если да, то в этом случае можно им пользоваться.

А вот пример с авторизацией, извините, ерунда полная. Что он доказывает, что в сферическом коне нельзя использовать исключения? Глупо с этим спорить. Нужно взять этот конкретный случай и разобраться в нем.

Если есть специфические требования, в которых прикладник не силён — этим должны заниматься специалисты. Повторю — ни до какой авторизации дело не дойдёт, гораздо проще убьют сервер синфлудом, т.к мощностей для этого требуется на порядки меньше. Любой вменяемый HTTP сервер имеет ограничения на кол-во коннектов с одного IP, так что предположение о рандомных логинах — нонсенс. Если у кого-то есть достаточное кол-во хостов, что бы выполнить количество запросов, с которым не справится сервер — это значит что сервер не расчитан на такую нагрузку; нельзя заранее отличить эти запросы от легальных, сервер упадёт независимо от правильностей паролей.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[15]: DoS
От: Roman Odaisky Украина  
Дата: 17.07.08 08:25
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Повторю — ни до какой авторизации дело не дойдёт, гораздо проще убьют сервер синфлудом, т.к мощностей для этого требуется на порядки меньше.


А разве современные серверные ОС подвержены таким примитивным атакам?
До последнего не верил в пирамиду Лебедева.
Re[14]: DoS
От: VoidEx  
Дата: 17.07.08 08:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как мне самому когдато сказали — доказательства построенные на аналогиях идут далеко и лесом

Вы, кстати, доказательство с опровержением не спутали?
Re[16]: DoS
От: gear nuke  
Дата: 17.07.08 09:19
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А разве современные серверные ОС подвержены таким примитивным атакам?


Если с одного хоста идут пакеты — то нет, а есть ведь IP spoofing... MS даже предпринял специальные усилия, что бы было невозможно слать с Windows-хостов.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[17]: DoS
От: Roman Odaisky Украина  
Дата: 17.07.08 11:41
Оценка:
Здравствуйте, gear nuke, Вы писали:

RO>>А разве современные серверные ОС подвержены таким примитивным атакам?


GN>Если с одного хоста идут пакеты — то нет, а есть ведь IP spoofing... MS даже предпринял специальные усилия, что бы было невозможно слать с Windows-хостов.


Так сама суть SYN flood — заставить ОС выделить слишком много ресурсов на полуоткрытые сокеты. Вроде современные ОС, получив SYN, просто делают маленькую заметку где-нибудь, а начинают шевелиться уже позже? Пусть себе шлют SYN тысячами, ядро потолстеет на сколько-то килобайт, и всё.
До последнего не верил в пирамиду Лебедева.
Re[15]: DoS
От: Аноним  
Дата: 17.07.08 11:51
Оценка:
VE>>>У вас подушка безопасности в машине есть?
VE>>>Это я к вопросу логичности тезиса.
А>>Как мне самому когдато сказали — доказательства построенные на аналогиях идут далеко и лесом
VE>А вы приняли на веру. Похвально.
Да. Не люблю демагогов, спорящих на основе постулатов женской логики. Мы про софт говорим, а не про машины.
Re[15]: DoS
От: Аноним  
Дата: 17.07.08 11:58
Оценка:
GN>А вот пример с авторизацией, извините, ерунда полная. Что он доказывает, что в сферическом коне нельзя использовать исключения? Глупо с этим спорить. Нужно взять этот конкретный случай и разобраться в нем.

GN>Если есть специфические требования, в которых прикладник не силён — этим должны заниматься специалисты. Повторю — ни до какой авторизации дело не дойдёт, гораздо проще убьют сервер синфлудом, т.к мощностей для этого требуется на порядки меньше. Любой вменяемый HTTP сервер имеет ограничения на кол-во коннектов с одного IP, так что предположение о рандомных логинах — нонсенс. Если у кого-то есть достаточное кол-во хостов, что бы выполнить количество запросов, с которым не справится сервер — это значит что сервер не расчитан на такую нагрузку; нельзя заранее отличить эти запросы от легальных, сервер упадёт независимо от правильностей паролей.


Разница есть. Она измеряется N запросов/в секунду которые требуется послать хакеру для того чтобы (N+1)й запрос в туже секунду получил отлуп от сервера. В случае большего количества накладных расходов на обработку некорректного запроса — N будет меньше. Соответственно это определяет количество $$$, которые потребуется заплатить нехорошему человеку владельцам ботсети для успешной атаки. И если эта сумма будет больше потециальной выгоды нехорошего человека от вашему мертвого в течении часа сервера, он этого делать не будет. Рассуждать надо понятиями немного более общими, нежели "все равно ниче не поможет".
Кстати ХР и 2к3 спокойно выносят флуд syn пакетами от совершенно рандомных ипшников по 100мбит локалке. Загрузка ЦП ( в пару ггц) выше десятка процентов даже не поднимается, если сервер хорошо написан. Попробуйте подосить стандартные виндовые сервисы, висящие на портах 135, 445 etc. Более того они при этом умудряются принимать и обрабатывать новые коннекты. Подумайте на досуге как у них это получилось.
Re[16]: DoS
От: gear nuke  
Дата: 17.07.08 13:21
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Рассуждать надо понятиями немного более общими, нежели "все равно ниче не поможет".


Именно так я и делаю, рекомендуя использовать пролексик и не морочить голову.

А>Кстати ХР и 2к3 спокойно выносят флуд syn пакетами от совершенно рандомных ипшников по 100мбит локалке. Загрузка ЦП ( в пару ггц) выше десятка процентов даже не поднимается, если сервер хорошо написан. Попробуйте подосить стандартные виндовые сервисы, висящие на портах 135, 445 etc. Более того они при этом умудряются принимать и обрабатывать новые коннекты. Подумайте на досуге как у них это получилось.


Что там было насчёт "доказательств на аналогиях"? Dedicated servers обычно расположены не в локалке, а интернете на 10Mb канале (даже в ряде случаев, где пишут 100). И специалисты утверждают, что достаточно сотни-другой хостов. Я верю им, а не анониман на rsdn. Стандартные виндовые сервисы не знают о SYN пакетах.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[18]: DoS
От: gear nuke  
Дата: 17.07.08 13:23
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO> Пусть себе шлют SYN тысячами, ядро потолстеет на сколько-то килобайт, и всё.


А как быть с забиванием канала?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[17]: DoS
От: Аноним  
Дата: 17.07.08 13:26
Оценка:
GN>Что там было насчёт "доказательств на аналогиях"? Dedicated servers обычно расположены не в локалке, а интернете на 10Mb канале (даже в ряде случаев, где пишут 100). И специалисты утверждают, что достаточно сотни-другой хостов. Я верю им, а не анониман на rsdn.
По вашему мнению специалисты отличаются от неспициалистов наличием логина на рсдн и накручиванием на нем рейтинга?

GN>Стандартные виндовые сервисы не знают о SYN пакетах.

Сделайте флуд коннектам с рандомных адресов и последующими рандомными данными на виндовый сервис и на ваш, построенный на throw на инвалидный пакет. Сравните загрузку CPU.
Re[18]: DoS
От: gear nuke  
Дата: 17.07.08 14:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>По вашему мнению специалисты отличаются от неспициалистов наличием логина на рсдн и накручиванием на нем рейтинга?


Логин на RSDN нужен, что бы можно было не тратить время на отслеживание ответов

GN>>Стандартные виндовые сервисы не знают о SYN пакетах.

А>Сделайте флуд коннектам с рандомных адресов и последующими рандомными данными на виндовый сервис и на ваш, построенный на throw на инвалидный пакет. Сравните загрузку CPU.

Какие данные Мне, даже как неспециалисту в этой области, понятно, что будет пакет SYN и все. TCP соединение не установлено.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[16]: DoS
От: VoidEx  
Дата: 17.07.08 14:45
Оценка:
Здравствуйте, Аноним, Вы писали:

VE>>А вы приняли на веру. Похвально.

А>Да. Не люблю демагогов, спорящих на основе постулатов женской логики. Мы про софт говорим, а не про машины.

Про женскую логику:

В женской логике каждое утверждение может быть не только опровергнуто, но и отвергнуто. Отвергая высказывание, вы признаете его бессмысленным и оставляете без внимания. Если вы отвергли последнее высказывание собеседницы, ваше предпоследнее утверждение остается без ответа и, таким образом, становится доказанным. Например, самые основательные соображения можно отвергнуть словами "Ну и что?" или "А больше ничего не смог придумать?".

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


Вы сделали частное утверждение "исключения мона юзать, если их не юзать".
Я его обобщил до "что-то мона юзать, если его не юзать" и опроверг примером его "нелогичность".
Таким образом, у меня нет оснований считать это (обобщенноё) утверждение нелогичным, так как хотя бы один логичный пример есть. Это не говорит, что исходное утверждение логично, но в исходном сообщении нет никакой привязки к "исключениям". Упор сделан именно на "мона юзать, если не юзать", или я что-то упустил?
Вопрос: чем исключения в данном случае особенны (чтобы обобщение исключить) и почему исходное утверждение должно казаться нелогичным?
Re[19]: DoS
От: Аноним  
Дата: 17.07.08 14:48
Оценка:
GN>Логин на RSDN нужен, что бы можно было не тратить время на отслеживание ответов
Во первых у анонимов есть номера. Во вторых — слабо отвечать на конкретную мессагу, не вспоминая что этот человек писал 10 дней назад?

GN>Какие данные Мне, даже как неспециалисту в этой области, понятно, что будет пакет SYN и все. TCP соединение не установлено.

Я уже не про син флуд, раз он вам не понравился парой мессаг выше, а про фазинг.
Re[18]: DoS
От: VoidEx  
Дата: 17.07.08 15:19
Оценка:
Здравствуйте, Аноним, Вы писали:

GN>>Что там было насчёт "доказательств на аналогиях"? Dedicated servers обычно расположены не в локалке, а интернете на 10Mb канале (даже в ряде случаев, где пишут 100). И специалисты утверждают, что достаточно сотни-другой хостов. Я верю им, а не анониман на rsdn.

А>По вашему мнению специалисты отличаются от неспициалистов наличием логина на рсдн и накручиванием на нем рейтинга?

В наиболее пpимитивной фоpме пеpеход в дpyгyю плоскость имеет вид того, что pимляне называли кватеpнио теpминоpyм, а pyсские обозначают пословицей: В огоpоде бyзина, а в Киеве дядька. В более pазвитой фоpме, вместо некотоpого, весьма споpного yтвеpждения вам с блеском докажyт дpyгое — бесспоpное. Попpобyйте возpазить! Для этого пpидется возвpащаться к давно отзвyчавшим словам собеседницы, что, как мы видели, невозможно.


Не надо удаляться. С доказательствами на аналогиях что?
А то сдаётся мне, верность исходного утверждения теперь зависит от того, достоин ли аноним звания "специалист" на РСДН.
Re[20]: DoS
От: gear nuke  
Дата: 17.07.08 16:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

GN>>Логин на RSDN нужен, что бы можно было не тратить время на отслеживание ответов

А>Во первых у анонимов есть номера. Во вторых — слабо отвечать на конкретную мессагу, не вспоминая что этот человек писал 10 дней назад?

Теперь ясно, что я непонятно выражаюсь. Логин нужен мне, что бы получать ответы, а не сидеть и рефрешить браузер почем зря.

GN>>Какие данные Мне, даже как неспециалисту в этой области, понятно, что будет пакет SYN и все. TCP соединение не установлено.


Объясню подробнее. Сотня хостов может отправить SYN пакеты со всего возможного диапазона IP адресов. Для флуда по установленному TCP соединению нужно на порядки больше хостов с разными адресами, иначе можно рвать соединения с конкретными IP.

А>Я уже не про син флуд, раз он вам не понравился парой мессаг выше, а про фазинг.


Results 1 — 1 of 1 for ddos фазинг

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[19]: DoS
От: Roman Odaisky Украина  
Дата: 17.07.08 19:22
Оценка:
Здравствуйте, gear nuke, Вы писали:

RO>>Пусть себе шлют SYN тысячами, ядро потолстеет на сколько-то килобайт, и всё.


GN>А как быть с забиванием канала?


А канал можно забить чем угодно, хоть ресетами несуществующих соединений, или просто случайными байтами. Это не связано с DoSостойкостью системы.
До последнего не верил в пирамиду Лебедева.
Re[20]: DoS
От: gear nuke  
Дата: 17.07.08 23:29
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А канал можно забить чем угодно, хоть ресетами несуществующих соединений, или просто случайными байтами.


Так ведь эти данные невалидны, их можно отбросить на роутере (или что там используется) в точке соединения с толстым каналом.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[21]: DoS
От: Roman Odaisky Украина  
Дата: 18.07.08 08:02
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Так ведь эти данные невалидны, их можно отбросить на роутере (или что там используется) в точке соединения с толстым каналом.


Роутер обычно соединяет толстый внешний канал с еще более толстым внутренним. Например, 100 МБит/с снаружи и гигабит внутри.

Ну, а проблема собственно SYN flood уже 10 лет как решена с помощью SYN cookies.
До последнего не верил в пирамиду Лебедева.
Re[20]: DoS
От: VoidEx  
Дата: 18.07.08 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сдается мне вам в форум по филологии нужно. Вас это больше интересует.

Опять увернулся
Re[21]: DoS
От: Аноним  
Дата: 18.07.08 08:30
Оценка:
А>>Сдается мне вам в форум по филологии нужно. Вас это больше интересует.
VE>Опять увернулся
Причем тут увернулся. Это офтопик. В IRC на канале програминг я сразу баню в таких случаях. Тут увы нравы более демократичные, да и прав у меня тут нету.
Re[22]: DoS
От: Аноним  
Дата: 18.07.08 08:41
Оценка:
А>>>Я уже не про син флуд, раз он вам не понравился парой мессаг выше, а про фазинг.
Всегда прикалывало как народ ставит плюисик и минусики анонимам. Не стоит оно таких усилий по передвижени мышки, нам же пофиг
А вот вы бы написали два тупых сервера теста ради. Один делает accept, recv strcmp(data, "password") и closesocket, а другой тоже самое, но со throw.
А натравили бы на них что нить отсюда например http://www.computerdefense.org/2007/01/15/fuzzing-tools/
И подумали бы крепко.
Хотя если конечно вы работаете исключительно на одного какого корпоративного то заказчика.. то вам это пофиг. Это оправдано с экономической точки зрения.
Re[24]: DoS
От: Аноним  
Дата: 18.07.08 09:25
Оценка:
А>>Хотя если конечно вы работаете исключительно на одного какого корпоративного то заказчика.. то вам это пофиг. Это оправдано с экономической точки зрения.
А>тут вроде уже выяснили что неверный логин не есть исключительная ситуация, поэтому если кто-то в этом случае бросает исключения, то это не проблема исключений, а проблема кадров, покупаемых систем и т.д и т.п
Т.е. вы считаете что все, положим 100 человек, которые работают над проектом, прекрасно понимают где стоит бросать исключения, а где достаточно кода возврата? Я завидую вашей вере в людей
Re[25]: DoS
От: Аноним  
Дата: 18.07.08 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Хотя если конечно вы работаете исключительно на одного какого корпоративного то заказчика.. то вам это пофиг. Это оправдано с экономической точки зрения.

А>>тут вроде уже выяснили что неверный логин не есть исключительная ситуация, поэтому если кто-то в этом случае бросает исключения, то это не проблема исключений, а проблема кадров, покупаемых систем и т.д и т.п
А>Т.е. вы считаете что все, положим 100 человек, которые работают над проектом, прекрасно понимают где стоит бросать исключения, а где достаточно кода возврата? Я завидую вашей вере в людей
На то есть муравьишки покрупнее — code reviewer'ы и им подобные (в зависимости от организации труда). Проект без ошибок невозможен, и нужны инструменты по их выялению на разных стадиях. Есть, в крайнем случае, тестирование. В других ветках про это наверняка много чего написано. Смысл в том, чтобы не грешить на исключения при неправильном их использовании. Отказ от исключений — радикальная для этого (описанного вами) случая мера, оправданная слабым составом участников и/или организации труда.. имхо
Re[26]: DoS
От: Аноним  
Дата: 18.07.08 10:18
Оценка:
А>На то есть муравьишки покрупнее — code reviewer'ы и им подобные (в зависимости от организации труда). Проект без ошибок невозможен, и нужны инструменты по их выялению на разных стадиях. Есть, в крайнем случае, тестирование. В других ветках про это наверняка много чего написано. Смысл в том, чтобы не грешить на исключения при неправильном их использовании. Отказ от исключений — радикальная для этого (описанного вами) случая мера, оправданная слабым составом участников и/или организации труда.. имхо
Отказ от исключений — это экономически оправданная жесткая мера, уменьшающая издержки на поддержку кода низкооплачиваемыми индусами. А что вы думали, везде гении работают?
Re[27]: DoS
От: Аноним  
Дата: 18.07.08 11:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>На то есть муравьишки покрупнее — code reviewer'ы и им подобные (в зависимости от организации труда). Проект без ошибок невозможен, и нужны инструменты по их выялению на разных стадиях. Есть, в крайнем случае, тестирование. В других ветках про это наверняка много чего написано. Смысл в том, чтобы не грешить на исключения при неправильном их использовании. Отказ от исключений — радикальная для этого (описанного вами) случая мера, оправданная слабым составом участников и/или организации труда.. имхо

А>Отказ от исключений — это экономически оправданная жесткая мера, уменьшающая издержки на поддержку кода низкооплачиваемыми индусами. А что вы думали, везде гении работают?
А теперь взглянем на название форума и топика, и прекратим этот бессмысленный флейм
Re[22]: DoS
От: VoidEx  
Дата: 18.07.08 14:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Сдается мне вам в форум по филологии нужно. Вас это больше интересует.

VE>>Опять увернулся
А>Причем тут увернулся. Это офтопик. В IRC на канале програминг я сразу баню в таких случаях. Тут увы нравы более демократичные, да и прав у меня тут нету.
За офтопик в баню добровольно должны идти вы.
Я пытаюсь у вас узнать, на основании чего фраза "исключения мона юзать, если их не юзнать" должна казаться нелогичной, в ответ только слышу демагогию о женской логике и о ходьбе лесом доказательств на аналогиях.

П.С. поэтому на том канале я уже 3 года как не сижу, потому что банят там по поводу и без повода, и толку никакого, если это IrcNET, конечно.
Re: Правда об оверхеде исключений.
От: CreatorCray  
Дата: 21.07.08 09:42
Оценка:
Здравствуйте, gear nuke, Вы писали:

Хорошо написано здесь: http://blog.not-a-kernel-guy.com/2007/07/19/213
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[23]: О плюсиках...
От: Erop Россия  
Дата: 21.07.08 17:35
Оценка:
А>Всегда прикалывало как народ ставит плюисик и минусики анонимам. Не стоит оно таких усилий по передвижени мышки, нам же пофиг
Вообще-то форумы RSDN -- это такая хитрая справочная система. Соотвественно система рейтингования сообщений имеет смысл, в первую очередь, для читателей RSDN. Если много людей не согласны с каким-то сообщением. Да ещё к тому же, остальные оценки этих людей тебе кажутся адекватными, то стоит задуматься насколько стоит верить сообщению, с котороым есть несогласие...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 22.07.08 05:37
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Хорошо написано здесь: http://blog.not-a-kernel-guy.com/2007/07/19/213


Вот только упоминания об O(n), вероятно, может смутить, хотя это дешевле, чем вызов диспетчера исключений в ядре.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.