如何训练覆盖率进行"suspicious sizeof"或SIZEOF_MISMATCH发现?

How to train Coverity for "suspicious sizeof" or SIZEOF_MISMATCH finding?

本文关键字:SIZEOF MISMATCH 发现 suspicious 覆盖率 何训练 sizeof      更新时间:2023-10-16

我有一个模板函数,其专用化可以执行零化:

template <class T>
void SecureWipeBuffer(T *buf, size_t n)
{
    volatile T *p = buf+n;
    while (n--)
        *((volatile T*)(--p)) = 0;
}
...
template <>
void SecureWipeBuffer(word64* p, size_t n)
{
   asm volatile("rep stosq" : "+c"(n), "+D"(p) : "a"(0) : "memory");
}

Coverity正在产生一个关于SecureWipeBuffer的发现:

word64 val;
...
SecureWipeBuffer(&val, 1);

调查结果是:

>>>     CID 164713:  Incorrect expression  (SIZEOF_MISMATCH)
>>>     Passing argument "&val" of type "word64 *" and argument "1UL" to function "SecureWipeBuffer" is suspicious because "sizeof (word64)" /*8*/ is expected.
275             SecureWipeBuffer(&val, 1);

如何训练SecureWipeBuffer的覆盖率需要元素计数,而不是字节计数?


编辑:我们在Windows代码中发现了两个类似的发现。此外,Coverity正在对标准库功能进行发现。就好像它没有意识到C++处理元素计数,而不是字节计数。

以下是来自Microsft标准库代码的<xmemory>

 25    if (_Count == 0)
 26        ;
 27    else if (((size_t)(-1) / sizeof (_Ty) < _Count)
    CID 12348 (#1 of 1): Wrong sizeof argument (SIZEOF_MISMATCH)
    suspicious_sizeof: Passing argument _Count * 4U /* sizeof (std::allocator<void *>::value_type) */
    to function operator new which returns a value of type std::allocator<void *>::value_type is suspicious.
 28        || (_Ptr = ::operator new(_Count * sizeof (_Ty))) == 0)
 29            _Xbad_alloc();  // report no memory

我找到了这个Github,它试图通过这样做来抑制它*

  std::fill_n(out, spec_.width_ - 1, fill);
  out += spec_.width_ - 1;
} else if (spec_.align_ == ALIGN_CENTER) {
  // coverity[suspicious_sizeof]
  out = writer_.fill_padding(out, spec_.width_, 1, fill);
} else {
  std::fill_n(out + 1, spec_.width_ - 1, fill);
在 Coverity

Prevention 中的 Silentencing 误报中也建议这样做,此处介绍了另一种方法:Coverity SA - 不包括 boost、stlport 错误。


*我不确定这是否是你想要的,但这就是我得到的!