Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.07;
Скачать: CL | DM;

Вниз

Microsoft уроды со своей VS.   Найти похожие ветки 

 
Городской Шаман   (2009-04-01 20:26) [0]

Имеем VS2005 C++ такой код с явной ошибкой


string tstr;

try{

 tstr[20] = "\n";

}catch(...){
 MessageBox("exception", "exception", 0);
}


Версия релиз, 32 бита.
Опция Yes With SEH Exceptions (/EHa) - включена.

И что они делают. Сносят все обработчики SEH исключений и устанавливают dr.Watson, после чего без спроса прибивают процесс.

Тоесть в данном случае отрабатывает конструкция не в catch(...) а в
invarg.c
_CRTIMP void __cdecl _invalid_parameter_noinfo(void)

А далее вот такое:

   /* Make sure any filter already in place is deleted. */
   SetUnhandledExceptionFilter(NULL);

   ret = UnhandledExceptionFilter(&ExceptionPointers);

   // if no handler found and no debugger previously attached
   // the execution must stop into the debugger hook.
   if (ret == EXCEPTION_CONTINUE_SEARCH && !wasDebuggerPresent) {
       _CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_INVALIDPARAMETER);
   }

   TerminateProcess(GetCurrentProcess(), STATUS_INVALID_PARAMETER);


Ну не сволочи?


 
palva ©   (2009-04-01 21:10) [1]


> Тоесть в данном случае отрабатывает конструкция не в catch(...)

А она должна обрабатываться в catch ? Что у вас стоит вместо ... ?


 
жж   (2009-04-01 22:59) [2]

размещать такой топик в форуме по delphi в свете выхода версии 2009 - просто кощунственно


 
Городской Шаман   (2009-04-01 23:58) [3]


> жж   (01.04.09 22:59) [2]
>
> размещать такой топик в форуме по delphi в свете выхода
> версии 2009 - просто кощунственно


Там то же самое. Это не баг, это фича.


 
guav ©   (2009-04-04 23:03) [4]


> Имеем VS2005 C++ такой код с явной ошибкой

А ты пиши по возможности без ошибок, а не полагайся на определённое поведение при неопределённом поведении :-)

Ты можешь сделать #define _SECURE_SCL 0 (в самом начале stdafx.h всех библиотек) и наслаждаться  возможностями UB в полном объёме. Ещё при этом получишь ускорение STL (некоторых контейнеров - в разы). И ничего не потеряешь, т.к. отладчик и др.Ватсон готовить не умеешь ;-)

А вот мне реализация __cdecl _invalid_parameter_noinfo в том виде как она есть только помогает. И, кстати, catch с троеточием в моём коде тоже нет.


 
TUser ©   (2009-04-05 00:10) [5]

Интересно, а Д такую явную ошибку, кажется, тоже пропустит (влом проверять).


 
guav ©   (2009-04-05 00:20) [6]

Во-первых, почему "то же", VS как раз не пропустил, а своевременно отловил (чем Городской Шаман почему-то возмущен). С #define _SECURE_SCL 0 таки да, может пропустить.

Во-вторых, тоже влом проверять, но в Delphi пустая строка реализована как NULL строка, что даст AV. Если же строка не пустая, то может произойти порча кучи. Насколько хороши средтсва отладки в Delphi чтобы отловить эту порчу - уже надо проверять.


 
Городской Шаман   (2009-04-05 20:10) [7]


> guav ©   (04.04.09 23:03) [4]


А у вас все программисты только сеньоры? Это делается чтобы ошибку можно было отловить (в клиентском приложении) и залогировать (с отсылкой по email). Потому что пользователю данная ошибка ничего не скажет и при поведении Microsoft разработчику тоже ничего.

Кроме того баги часто бывают в системных библиотеках. Был один случай, когда у пользователя на XP создания объекта Graphic из GDI+ гарантированно приводило к краху программы(библиотека терминировала процесс). Причём баг был не в программе.


 
guav ©   (2009-04-05 20:47) [8]

> А у вас все программисты только сеньоры?
Я не могу ответить на этот вопрос и к теме он вряд ли относится.


> Это делается чтобы
> ошибку можно было отловить (в клиентском приложении) и залогировать
> (с отсылкой по email). Потому что пользователю данная ошибка
> ничего не скажет и при поведении Microsoft разработчику
> тоже ничего.

Как раз при стандартном поведении пользователю будет предложено отправить отчёт в Майкрософт (начиная с ХР SP2, начиная c Vista предолжение более настойчивое). Мы пользуемся Windows Error Reporting и это выгоднее своего велосипеда.


> Кроме того баги часто бывают в системных библиотеках. Был
> один случай, когда у пользователя на XP создания объекта
> Graphic из GDI+ гарантированно приводило к краху программы(библиотека
> терминировала процесс). Причём баг был не в программе.

Бывает. Это ещё один повод пользоваться именно Майкрософтовской службой отчётов об ошибках, чтобы отчёты об крэшах внутри gdiplus.dll были доступны не только тебе, но и им.

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

#include <stdlib.h>
#include <iostream>
#include <string>

void shaman_parameter(
  const wchar_t * expression,
  const wchar_t * function,
  const wchar_t * file,
  unsigned int line,
  uintptr_t pReserved)
{
 std::cout << "Invalid parameter.\nNobody cares.\n";
}

int main()
{
 _set_invalid_parameter_handler(shaman_parameter);
 std::string s;
 s[20] = "\n";
 std::cout << "Hello Undefined Behaviour World!\n";
}


 
Городской Шаман   (2009-04-05 22:01) [9]


> guav ©   (05.04.09 20:47) [8]


За это спасибо. Просто с C++ имею очень мало дела. В основном для обслуживания 64-битного кода, где обработка идёт в программах на Delphi.



Страницы: 1 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1238586006
Interior
2009-04-01 15:40
2009.06.07
Блокировка порносайтов


3-1221992597
DAdd
2008-09-21 14:23
2009.06.07
Ограничение длины строки


2-1240246030
alex989
2009-04-20 20:47
2009.06.07
Странности с математикой (real, extended)


15-1238605370
Кто б сомневался
2009-04-01 21:02
2009.06.07
April 01: с праздником друзья!


15-1238908559
charodey_mag
2009-04-05 09:15
2009.06.07
Ошибки Delphi при компиляции