簡體   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