Разыменование NULL указателя предупреждения при проверке, является ли char * нулевым или пустым - PullRequest
1 голос
/ 13 апреля 2020

Проще говоря, я проверяю, являются ли два символа char * nullptr или пустыми через оператор if, но я получаю предупреждение о том, что разыменовываю нулевой указатель.

// mplate is a reference to a class
if ((mplate.m_plate != nullptr || mplate.m_plate[0] != '\0') || (plate != nullptr || plate[0] != '\0')) {
// Do something
}
else {
// do something else
}

Так что в основном я Я пытаюсь сказать в операторе if, если либо mplate.mplate, либо plate пусто, либо nullptr, в противном случае сделайте что-нибудь еще.

Severity    Code    Description Project File    Line    Suppression State
Warning C6011   Dereferencing NULL pointer 'make'.
Warning C6011   Dereferencing NULL pointer 'model'.
Warning C6011   Dereferencing NULL pointer 'mplate.m_plate'.
Warning C6011   Dereferencing NULL pointer 'plate'.
Warning C6011   Dereferencing NULL pointer 'plate'.

Ответы [ 2 ]

8 голосов
/ 13 апреля 2020

Вы делаете что-то вроде

if (p != nullptr || *p)

, т.е. вы разыменовываете только если указатель nullptr. Это означает, что вы ничего не делаете, если указатель действителен, или разыменовываете, если он недействителен (то есть UB).

Вместо этого вам нужно сделать логический and, например

if (p != nullptr && *p)

то есть только разыменование, если указатель не nullptr.

1 голос
/ 13 апреля 2020

В вашем вопросе говорится, что вы хотите выполнить блок if, если указатель равен NULL или указывает на '\0', поэтому вы действительно хотите это:

// mplate is a reference to a class
if (mplate.m_plate == nullptr || mplate.m_plate[0] == '\0' || plate == nullptr || plate[0] == '\0') {
// Do something (Block entered on the FIRST true test...)
}
else {
// do something else ( Block entered ONLY if all four tests are false...)
}

В этом коде тесты в оператор if будет «закорочен», как только любой из тестов будет true, поэтому вы никогда не разыменуете nullptr.

...