【问题标题】:Derefencing nullptr warning in c++在 C++ 中取消引用 nullptr 警告
【发布时间】:2023-12-26 13:24:01
【问题描述】:
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 读取

规则 A5-1-1(必需、实施、部分自动化) 字面量 除类型初始化外,不应使用值,否则 应使用符号名称。

我从没想过“nullptr”是一个字面值。如果是文字值,那么处理此警告的最佳方法是什么。

【问题讨论】:

  • 我不知道 autosar 是什么,但 if (timing_info) 是否删除了警告?它实际上做同样的事情,但谁知道...nullptr 是一个字面值,是的。
  • 当我简单地使用 ´´´ if (timing_info) ´´´ 时,我收到警告,if 语句仅用于处理布尔语句。所以我也做不到。
  • nullptr是如何定义的?
  • 如果将条件更改为if (timing_info != nullptr),它会起作用吗?顺便提一句。翻遍AR文档,我什至发现了一个和你类似的说法,而且没有标上合规和不合规。

标签: pointers c++14 warnings autosar


【解决方案1】:

正如你已经引用的那样,Rule A5-1-1

规则 A5-1-1(必需、实施、部分自动化)字面量 除类型初始化外,不得使用值, 否则应使用符号名称。

(source)

这条规则背后的想法是你不应该使用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 用于“类型初始化”以外的其他内容,您的代码违反了该规则 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))。

【讨论】: