2017-07-11 8 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 fetch_maskことになっていると思うので、私は& fetch_mask

+1

このコードはどのコンテキストに表示されますか?それは本当に奇妙に思える。 – tadman

+0

私はuint32_tとfetch_maskをuint32_t fetch_maskで削除したと思う。私は今それを修正するかどうかを確認するためにコンパイルしています。 –

+0

エラーが消えてしまったので、それは問題だと思います。私はプログラマーがエラーを起こしたと思います –

答えて

0

エラーがあなたに変数に非const参照を渡していることを示し、代わりのuint32_tの&を削除PVS-Studioはその変数が実際に変更されたかどうかを見ることができません。参照で引数を渡す目的は、関数が元の値を変更できることです。関数が参照渡しの値を変更しない場合は、その参照はconst(つまりuint32_t const& fetch_mask)になります。

変数を値渡しすることは、関数が元の値を変更しないことを表現するもう一つの方法です(私はconst値も渡して偶然割り当てられないようにしたいと思います)。整数データ型の場合、(const)値で渡すのが一般的です。

診断は、目的とコードが一致するかどうかにかかわらず、本質的に疑問です。コードの目的は、fetch_mask仮パラメータを通って渡された変数を変更することができますが、実装は試みません(PVS-Studioが見ることができない場合(エイリアシングなど) 。

アナライザは引数が関数に参照によって渡されたが、関数本体の内部に変更されないされていることが検出されました:


参考のため、ここで V669の公式文書です。これは、誤った印刷などによって発生したエラーを示している可能性があります。

0

私が理解しているように、我々はthisコードについて話しています。あなたが見ることができるように(& fetch_bitをfetch_mask)場合、変数fetch_maskしか表現に読み取るために使用され

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)); 
    } 
} 

:私は、関数の全身を書きます。整数変数を参照で渡し、それを変更しないことは奇妙です。これは、コードにエラーが含まれていることが多いことを示しています。はい、必ずしも間違いではありませんが、このコードは慎重に検証する必要があります。PVS-スタジオAnalyzerの

のuint32_t & fetch_maskまたはのuint32_t & fetch_maskが書かれているかどうかは、問題ではありません。いずれにせよ、警告を出すでしょう。

おそらく、エラーはありません。あなたはあなたがしたようにリンク&を削除することによって警告を排除することができます。別の選択肢は、偽陽性の抑制のメカニズムの1つを使用することです。

関連する問題