Re[3]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 26.01.23 16:03
Оценка:
ЕМ>Бред. В чем тогда смысл assert'ов, которые всю жизнь использовались для проверки инвариантов, но это никогда не предполагало обязательного аварийного завершения? В стандартной реализации VC++ он выкидывает запрос вида "abort/debug/ignore".
ассерт проверит в дебаге а в релизе всё пойдет попизде, вот и предупреждает
Re[4]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.01.23 17:44
Оценка:
Здравствуйте, Wawan, Вы писали:

W>ассерт проверит в дебаге а в релизе всё пойдет попизде


С чего бы?
Re[5]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 26.01.23 18:50
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Wawan, Вы писали:
W>>ассерт проверит в дебаге а в релизе всё пойдет попизде
ЕМ>С чего бы?

не принято среди джентльменов писАть по нулевому адресу
Re[6]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.01.23 18:55
Оценка:
Здравствуйте, Wawan, Вы писали:

W>>>ассерт проверит в дебаге а в релизе всё пойдет попизде

ЕМ>>С чего бы?

W>не принято среди джентльменов писАть по нулевому адресу


Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?
Re[7]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 26.01.23 19:01
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Wawan, Вы писали:
W>>>>ассерт проверит в дебаге а в релизе всё пойдет попизде
ЕМ>>>С чего бы?
W>>не принято среди джентльменов писАть по нулевому адресу
ЕМ>Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?

это разный код, в релизе нет половины кода который был в дебаге
если ребенок при родителях матом не ругается то это не значит он не ругается матом
Re[8]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.01.23 19:47
Оценка:
Здравствуйте, Wawan, Вы писали:

W>это разный код, в релизе нет половины кода который был в дебаге


Вам знакомо слово "инвариант"?
Re[9]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 26.01.23 20:14
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Wawan, Вы писали:
W>>это разный код, в релизе нет половины кода который был в дебаге
ЕМ>Вам знакомо слово "инвариант"?

указатель подразумевает NULL как валидное значение
замени указатель на ссылку
Re: Предупреждение анализатора "Dereferencing NULL pointer"
От: ononim  
Дата: 26.01.23 20:58
Оценка:
ЕМ> if (p == nullptr) Break ();
ну сделай так:
ЕМ> if (p == nullptr) Break (&p);
из того что я понял в ветке — это даже сделает проще твою жизнь (то есть отладку через Break().. хм.. что нажа жииииизнь?... дебаг!)
Как много веселых ребят, и все делают велосипед...
Re[7]: Предупреждение анализатора "Dereferencing NULL pointer"
От: AleksandrN Россия  
Дата: 26.01.23 21:26
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

W>>не принято среди джентльменов писАть по нулевому адресу


ЕМ>Что не принято, я в курсе. А вот с чего бы, будучи отлаженным в дебаге, оно поломается в релизе?


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

Поэтому указатель лучше проверить и если он не валидный, то проинформировать пользователя об ошибке. Это лучше, чем падение программы.
Re[2]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.01.23 21:37
Оценка:
Здравствуйте, ononim, Вы писали:

O>ну сделай так:


Да я уже запилил через __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 оформляется в вызываемую функцию, и в ней код тоже правильный.
Re[8]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 26.01.23 21:43
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Поэтому указатель лучше проверить и если он не валидный, то проинформировать пользователя об ошибке.


Тогда почему ограничиваться указателем? При таком подходе нужно проверять все подряд, в пределе — на каждом шаге прогонять полный тест правильности всего набора данных.

AN>Это лучше, чем падение программы.


Если падение происходит раз в несколько лет, у одного из десятков тысяч пользователей — чем это лучше? Программа один черт прервется аварийно. Вся необходимая информация будет в аварийном дампе. На кой эта предельная вежливость на всякий случай?
Re[9]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 26.01.23 22:53
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Wawan, Вы писали:
W>>это разный код, в релизе нет половины кода который был в дебаге
ЕМ>Вам знакомо слово "инвариант"?

в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break()
в релизе при p == nullptr происходит попытка записи по нулевому адресу

эти поведения не "инвариант"
Re[10]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.01.23 08:56
Оценка:
Здравствуйте, Wawan, Вы писали:

W>в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break()

W>в релизе при p == nullptr происходит попытка записи по нулевому адресу

Этого не происходит.

W>эти поведения не "инвариант"


Конечно, ведь Вам виднее, как работает код у других.
Re[11]: Предупреждение анализатора "Dereferencing NULL pointer"
От: Wawan Россия http://www.wawan.ru/resume
Дата: 27.01.23 11:56
Оценка: +2
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Wawan, Вы писали:
W>>в дебаге при p == nullptr происходит выход из функции через механизм исключений в функции Break()
W>>в релизе при p == nullptr происходит попытка записи по нулевому адресу
ЕМ>Этого не происходит.
W>>эти поведения не "инвариант"
ЕМ>Конечно, ведь Вам виднее, как работает код у других.
да, телепатия мой конёк, рад был помочь
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.