在 C++ 中取消引用 nullptr 警告
Derefencing nullptr warning in c++
if (nullptr!=timing_info)
{
timing_info->h = start_time;
}
我收到以下警告
autosar_cpp14 a5-1-1 violation
Using literal "NULL" other than type initialization, where symbolic names shall be used instead.
autosar 规则 a5-1-1 读取
Rule A5-1-1 (required, implementation, partially automated) Literal
values shall not be used apart from type initialization, otherwise
symbolic names shall be used instead.
我从没想过 "nullptr" 是字面值。如果它是文字值,那么处理此警告的最佳方法是什么。
正如你已经引用的那样,Rule A5-1-1
说
Rule A5-1-1 (required, implementation, partially automated)Literal
values shall not be used apart from type initialization,
otherwise symbolic names shall be used instead.
这条规则背后的想法是你不应该使用 magic constants,即不要写类似
的东西
// 100 is a magic constant. It's not clear what the next line means without comments.
if (list.size() > 100) {
std::cout << "error!";
} else {
std::cout << "everything ok!";
}
而是写
static constexpr auto maximum_allowed_size = 100;
// The next line speaks for itself: "if list is bigger than allowed ..."
if (list.size() > maximum_allowed_size) {
std::cout << "error!";
} else {
std::cout << "everything ok!";
}
这个额外的常量在大多数情况下提高了可读性。
Since nullptr
is a literal 并且您将文字 nullptr
用于 "type initialization" 以外的其他内容,您的代码违反了规则 A5-1-1。
我不知道 autosar 是否有意不鼓励使用文字 nullptr
,我个人认为没有理由这样做。也许它已经被监督了(应该是一个例外)。
您可以改写代码以使检查器静音:
if (timing_info) // implicitly convert pointer to bool
由于该变体显然也让检查员不高兴,这里是另一个变体:
if (!!timing_info) // convert pointer to bool using double negation
您也可以使用强制转换,但我不会那样做。说实话,我最喜欢原版(if (nullptr != timing_info)
)
if (nullptr!=timing_info)
{
timing_info->h = start_time;
}
我收到以下警告
autosar_cpp14 a5-1-1 violation
Using literal "NULL" other than type initialization, where symbolic names shall be used instead.
autosar 规则 a5-1-1 读取
Rule A5-1-1 (required, implementation, partially automated) Literal values shall not be used apart from type initialization, otherwise symbolic names shall be used instead.
我从没想过 "nullptr" 是字面值。如果它是文字值,那么处理此警告的最佳方法是什么。
正如你已经引用的那样,Rule A5-1-1
说
Rule A5-1-1 (required, implementation, partially automated)Literal values shall not be used apart from type initialization, otherwise symbolic names shall be used instead.
这条规则背后的想法是你不应该使用 magic constants,即不要写类似
的东西// 100 is a magic constant. It's not clear what the next line means without comments.
if (list.size() > 100) {
std::cout << "error!";
} else {
std::cout << "everything ok!";
}
而是写
static constexpr auto maximum_allowed_size = 100;
// The next line speaks for itself: "if list is bigger than allowed ..."
if (list.size() > maximum_allowed_size) {
std::cout << "error!";
} else {
std::cout << "everything ok!";
}
这个额外的常量在大多数情况下提高了可读性。
Since nullptr
is a literal 并且您将文字 nullptr
用于 "type initialization" 以外的其他内容,您的代码违反了规则 A5-1-1。
我不知道 autosar 是否有意不鼓励使用文字 nullptr
,我个人认为没有理由这样做。也许它已经被监督了(应该是一个例外)。
您可以改写代码以使检查器静音:
if (timing_info) // implicitly convert pointer to bool
由于该变体显然也让检查员不高兴,这里是另一个变体:
if (!!timing_info) // convert pointer to bool using double negation
您也可以使用强制转换,但我不会那样做。说实话,我最喜欢原版(if (nullptr != timing_info)
)