Форум: "Прочее";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c