bugprone-casting-through-void

检测涉及 void* 的不安全或冗余的两步式强制类型转换操作,它等同于根据 C++ 标准reinterpret_cast

由于多种原因,不建议使用 void* 进行两步式类型转换。

总之,避免通过 void* 进行两步式类型转换,可以确保代码更清晰,维护必要的编译器警告,并防止歧义和潜在的运行时错误,尤其是在复杂的继承场景中。如果需要此类强制类型转换,则应通过 reinterpret_cast 进行,以更明确地表达意图。

注意:预计在应用建议的修复并使用 reinterpret_cast 之后,检查 cppcoreguidelines-pro-type-reinterpret-cast 将发出警告。这是故意的:reinterpret_cast 是一个危险的操作,在对强制类型转换的指针进行解引用时很容易破坏严格别名规则,从而调用未定义的行为。此警告是为了提醒用户仔细分析 reinterpret_cast 的使用是否安全,在这种情况下,可以抑制警告。

示例

using IntegerPointer = int *;
double *ptr;

static_cast<IntegerPointer>(static_cast<void *>(ptr)); // WRONG
reinterpret_cast<IntegerPointer>(reinterpret_cast<void *>(ptr)); // WRONG
(IntegerPointer)(void *)ptr; // WRONG
IntegerPointer(static_cast<void *>(ptr)); // WRONG

reinterpret_cast<IntegerPointer>(ptr); // OK, clearly expresses intent.
                                       // NOTE: dereferencing this pointer violates
                                       // the strict aliasing rules, invoking
                                       // Undefined Behavior.