ЕМ>Бред. В чем тогда смысл assert'ов, которые всю жизнь использовались для проверки инвариантов, но это никогда не предполагало обязательного аварийного завершения? В стандартной реализации VC++ он выкидывает запрос вида "abort/debug/ignore".
ассерт проверит в дебаге а в релизе всё пойдет попизде, вот и предупреждает
Здравствуйте, Wawan, Вы писали:
W>>>ассерт проверит в дебаге а в релизе всё пойдет попизде ЕМ>>С чего бы?
W>не принято среди джентльменов писАть по нулевому адресу
Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Здравствуйте, Wawan, Вы писали: W>>>>ассерт проверит в дебаге а в релизе всё пойдет попизде ЕМ>>>С чего бы? W>>не принято среди джентльменов писАть по нулевому адресу ЕМ>Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?
это разный код, в релизе нет половины кода который был в дебаге
если ребенок при родителях матом не ругается то это не значит он не ругается матом
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Здравствуйте, Wawan, Вы писали: W>>это разный код, в релизе нет половины кода который был в дебаге ЕМ>Вам знакомо слово "инвариант"?
указатель подразумевает NULL как валидное значение
замени указатель на ссылку
ЕМ> if (p == nullptr) Break ();
ну сделай так: ЕМ> if (p == nullptr) Break (&p);
из того что я понял в ветке — это даже сделает проще твою жизнь (то есть отладку через Break().. хм.. что нажа жииииизнь?... дебаг!)
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Евгений Музыченко, Вы писали:
W>>не принято среди джентльменов писАть по нулевому адресу
ЕМ>Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?
Ошибки бывают не только на этапе разработки, но и на этапе тестирования. И вероятность того, что тест-кейсы не покрывают всех возможных сценариев использования, выше нуля. Поэтому тестирование может доказать, что баг есть, но не может доказать, что багов нет.
Поэтому указатель лучше проверить и если он не валидный, то проинформировать пользователя об ошибке. Это лучше, чем падение программы.
Да я уже запилил через __declspec (noreturn). И все равно пришлось сделать так, чтобы этот атрибут добавлялся только в режиме анализа, поскольку он ломает генерацию кода, съедая переход по условию. Вот такое:
bool __fastcall RunningUnderDebugger ();
void __debugbreak ();
void __forceinline __declspec (noreturn) BreakToDbg () {
if (RunningUnderDebugger ()) __debugbreak ();
}
void f (int a) {
if (a == 5) {
BreakToDbg ();
}
}
компиляторы VC++ от 15.00 до 19.29 компилируют в
; 8 : void f (int a) {
push ebp
mov ebp, esp
; 9 : if (a == 5) {
cmp DWORD PTR _a$[ebp], 5
jne SHORT $LN3@f
; 5 : if (RunningUnderDebugger ()) __debugbreak ();
call ?RunningUnderDebugger@@YI_NXZ ; RunningUnderDebugger
int 3
$LN3@f:
; 10 : BreakToDbg ();
; 11 : }
; 12 : }
pop ebp
ret 0
Это не совсем то, что у меня — этакий минимальный пример.
Если убрать __declspec (noreturn) — генерируется нормальный код. Если вместо этого убрать __forceinline — BreakToDbg оформляется в вызываемую функцию, и в ней код тоже правильный.
Здравствуйте, AleksandrN, Вы писали:
AN>Поэтому указатель лучше проверить и если он не валидный, то проинформировать пользователя об ошибке.
Тогда почему ограничиваться указателем? При таком подходе нужно проверять все подряд, в пределе — на каждом шаге прогонять полный тест правильности всего набора данных.
AN>Это лучше, чем падение программы.
Если падение происходит раз в несколько лет, у одного из десятков тысяч пользователей — чем это лучше? Программа один черт прервется аварийно. Вся необходимая информация будет в аварийном дампе. На кой эта предельная вежливость на всякий случай?
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Здравствуйте, Wawan, Вы писали: W>>это разный код, в релизе нет половины кода который был в дебаге ЕМ>Вам знакомо слово "инвариант"?
в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break()
в релизе при p == nullptr происходит попытка записи по нулевому адресу
Здравствуйте, Wawan, Вы писали:
W>в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break() W>в релизе при p == nullptr происходит попытка записи по нулевому адресу
Этого не происходит.
W>эти поведения не "инвариант"
Конечно, ведь Вам виднее, как работает код у других.
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Здравствуйте, Wawan, Вы писали: W>>в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break() W>>в релизе при p == nullptr происходит попытка записи по нулевому адресу ЕМ>Этого не происходит. W>>эти поведения не "инвариант" ЕМ>Конечно, ведь Вам виднее, как работает код у других.
да, телепатия мой конёк, рад был помочь