bugprone-multi-level-implicit-pointer-conversion

检测不同间接级别指针之间的隐式转换。

不同间接级别指针类型之间的转换可能是危险的,并且可能导致未定义的行为,尤其是在转换后的指针稍后被转换为具有不同间接级别的类型时。例如,将指向指向 int 的指针 (int**) 转换为 void* 可能导致丢失有关原始间接级别的信息,这在尝试使用转换后的指针时会导致问题。如果转换后的指针稍后被转换为具有不同间接级别的类型并被解除引用,则可能导致访问冲突、内存损坏或其他未定义行为。

考虑以下示例

void foo(void* ptr);

int main() {
  int x = 42;
  int* ptr = &x;
  int** ptr_ptr = &ptr;
  foo(ptr_ptr); // warning will trigger here
  return 0;
}

在此示例中,foo() 使用 ptr_ptr 作为其参数调用。但是,ptr_ptr 是一个 int** 指针,而 foo() 需要一个 void* 指针。这会导致隐式指针级别转换,如果 foo() 解除指针的引用并假设它是一个 int* 指针,则可能导致问题。

使用显式强制转换是防止隐式指针级别转换导致问题的推荐解决方案,因为它允许开发人员明确说明其意图并展示其类型转换的理由。此外,建议开发人员在使用显式强制转换之前彻底检查并验证转换的安全性。这种额外的谨慎可以帮助在开发过程的早期阶段发现潜在的问题,从而提高代码的整体可靠性和可维护性。