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.