繁体   English   中英

32位值的位移位,随后扩展为64位类型

[英]Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type

我有以下代码从PVS Studio给出了V629的错误:

V629考虑检查'length << 32'表达式。 32位值的位移位,随后扩展为64位类型。 Circular_buffer.cc 84

bool CircularBuffer::AcquireCached(uint32_t key, size_t length,
                               Allocation* out_allocation) {
uint64_t full_key = key | (length << 32);

size_t是32位(实际上在任何现代的32位平台上)都宽的计算机上,此代码无法实现您想像的那样。

length为32位宽,并且没有整数提升,因此向左移32位会引起未定义的行为(UB向后移的距离大于类型大小)。 即使定义正确,它也会将所有位移出32位值,因此,这又不是作者期望的。

为了使其按预期工作,您必须移位之前将其uint64_t转换为uint64_t ,以便使用64位宽的类型完成移位,并且这些位实际上可以用于某些有用的地方。

uint64_t full_key = key | (uint64_t(length) << 32);

请注意,这恰好在64位平台上工作(其中size_t已经为64位宽,因此可以很好地进行移位),因此我想这可能是为什么较早才发现的原因。

正确的答案早已给出。 如果size_t类型为32位,则将发出此警告。 如果size_t为64位,则不会有错误,分析器也不会抱怨。

我想补充几件事。 首先,我想提供一个指向文档的链接: V629 其次,我要求在与PVS-Studio分析仪有关的问题上使用标签pvs-studio

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM