检查 char* 是否为 null 或空时取消引用 NULL 指针警告

Dereferencing NULL pointer warning when checking if char* is null or empty

简单地说,我正在通过 if 语句检查两个 char* 是否为 nullptr 或为空,但我收到一条警告,说我正在取消引用空指针。

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

所以基本上我想在 if 语句中说的是,如果 mplate.mplateplate 为空,或者 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'.

你正在做类似的事情

if (p != nullptr || *p)

即仅当 指针为 nullptr 时,您才取消引用 。这意味着如果指针有效则什么都不做,或者如果指针无效(即 UB)则取消引用。

你需要做一个合乎逻辑的and,像这样

if (p != nullptr && *p)

即仅在指针为 not nullptr.

时取消引用

你的问题表明你想在指针为 NULL 或指向 '[=12=]' 时执行 if 块,所以你真的想要这个:

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

在此代码中,if 语句中的测试将 'short-circuit' 只要其中任何一个测试是 true,因此您永远不会取消引用 nullptr.