Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1238778258
Kos
2009-04-03 21:04
2009.06.07
отрисовка в image


15-1238836531
rnts
2009-04-04 13:15
2009.06.07
С днём web-программиста!


3-1222155624
ViToTiV
2008-09-23 11:40
2009.06.07
DBExpress. Теряется коннект с MySQL


2-1240403175
devidart
2009-04-22 16:26
2009.06.07
Сортировка таблици


15-1238775478
Garfunkel
2009-04-03 20:17
2009.06.07
TMidiGen - модуль для создания midi звуков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский