2017-07-11 50 views
-2

我從PVS Studio收到以下錯誤 V669'fetch_mask'參數是非常量參考。分析器無法確定該參數被修改的位置。該函數可能包含錯誤。分析器無法確定位置

這是該行:

XXH64_state_t* hash_state, uint32_t& fetch_mask 

我盤算錯誤是&不fetch_mask的一部分,我固定它想:

XXH64_state_t* hash_state, uint32_t &fetch_mask 

錯誤消失。但是,travis.cl測試說我需要重新格式化並失敗。

我覺得發現問題原碼。

void TextureCache::HashTextureBindings(
XXH64_state_t* hash_state, uint32_t& fetch_mask, 
const std::vector<Shader::TextureBinding>& bindings) { 
for (auto& binding : bindings) { 
uint32_t fetch_bit = 1 << binding.fetch_constant; 
if (fetch_mask & fetch_bit) { 

void HashTextureBindings(XXH64_state_t* hash_state, uint32_t& fetch_mask, 
         const std::vector<Shader::TextureBinding>& bindings); 

我刪除了&,因爲我認爲這是應該uint32_t的,而不是uint32_t的fetch_mask & fetch_mask

+1

此代碼出現在什麼上下文中?這似乎很奇怪。 – tadman

+0

我認爲找到了解決方案,我用uint32_t fetch_mask刪除了uint32_t&fetch_mask。我現在正在編譯,看看是否能解決它。 –

+0

錯誤消失了,所以我猜這就是問題了。我猜程序員犯了一個錯誤 –

回答

0

的錯誤指示,要傳遞一個非const參考變量成函數,但PVS-Studio無法看到該變量是否實際得到修改。通過引用傳遞參數的目的是,函數可以修改原始值。如果函數不修改通過引用傳遞的值,則該引用應爲const(即uint32_t const& fetch_mask)。

通過值傳遞變量是另一種表達方式,即函數不會修改原始值(儘管我更願意通過const值傳遞,以免意外分配)。對於整型數據類型,通常通過(const)值傳遞它們。

診斷本質上是質疑,預期目的和代碼是否匹配。代碼的目的是通過fetch_mask形式參數傳遞的變量可以被修改,但實現不會嘗試這樣做(除非它是以PVS-Studio無法看到的方式進行的,例如通過別名來實現) 。


作爲參考,這裏是 V669官方文檔:

分析儀檢測到的參數是通過引用傳遞給函數的但功能體內部不會被修改。這可能表示例如由印刷錯誤造成的錯誤。

0

據我所知,我們正在談論this的代碼。我會寫一個函數的整個身體:

void TextureCache::HashTextureBindings(
    XXH64_state_t* hash_state, uint32_t& fetch_mask, 
    const std::vector<Shader::TextureBinding>& bindings) { 
    for (auto& binding : bindings) { 
    uint32_t fetch_bit = 1 << binding.fetch_constant; 
    if (fetch_mask & fetch_bit) { 
     // We've covered this binding. 
     continue; 
    } 

    auto& regs = *register_file_; 
    int r = XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0 + binding.fetch_constant * 6; 
    auto group = 
     reinterpret_cast<const xenos::xe_gpu_fetch_group_t*>(&regs.values[r]); 
    auto& fetch = group->texture_fetch; 

    XXH64_update(hash_state, &fetch, sizeof(fetch)); 
    } 
} 

正如你所看到的,變量fetch_mask僅用於在表達閱讀如果(fetch_mask & fetch_bit)。通過引用傳遞一個整型變量並且不要修改它是很奇怪的。這通常表示代碼包含錯誤。是的,這並不總是一個錯誤,但是這個代碼應該仔細驗證。

對於PVS-Studio的分析也不要緊,如果uint32_t的& fetch_maskuint32_t的& fetch_mask被寫入。無論如何,它會發出警告。

也許這裏沒有錯誤。您可以通過刪除鏈接&來消除警告。另一種選擇是使用抑制誤報的機制之一。