Cpp 核心指南:“const char *”到“const uint8_t *”没有reinterpret_cast和 C 样式转换?

Cpp Core Guidelines: "const char *" to "const uint8_t *" without reinterpret_cast and C-style cast?

提问人:user1244932 提问时间:5/4/2023 更新时间:5/4/2023 访问量:121

问:

对于这样的代码:

#include <cstdint>

extern const char *f();
extern void g(const uint8_t *);

int main()
{
    const char *p = f();
    g(reinterpret_cast<const uint8_t *>(p));
}

clang-tidy -checks='cppcoreguidelines-*'生成警告:

do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]

CppCoreGuidelines中确实有这样的段落。

但是,对于像 -> 这样的情况,如何避免或 C 型投射呢?reinterpret_castconst char *const uint8_t *

这是 CppCoreGuidelines 中的错误吗?

C++ C++17 cpp-core-guidelines

评论

6赞 ChrisMM 5/4/2023
g( static_cast<const uint8_t*>( static_cast<const void*>( p ) ) );?
3赞 André 5/4/2023
通过虚空施法也应该发出警告,因为它同样不安全。
1赞 André 5/4/2023
问题是可以签名,因此不可能简单地进行铸造。如果您负担得起复制内存的费用,一个简单的解决方法也是charstd::memcpy(f_ui8, f, size);
2赞 Konrad Rudolph 5/4/2023
@user1244932 这没有发出警告的原因纯粹是因为你欺骗了静态分析仪。这是一个假阴性。正如安德烈的第二条评论所解释的那样,这种演员通常并不安全。一般来说,使用是唯一的“保存”方式。您可以通过(静态)检查平台上的未签名类型来确保安全(...但事实并非如此)。std::memcpychar
3赞 doug 5/4/2023
从 c++17 开始,只要大小相同,就可以在没有问题的情况下来回分配(重新解释)有符号和无符号。这是因为现在要求有符号类型是 2 的赞美。

答: 暂无答案