Как подготовить Coverity для «подозрительного размера» или SIZEOF_MISMATCH находка?

У меня есть функция шаблона со специализацией, которая выполняет обнуление:

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

6

Решение

я нашел это 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 Prevent, и здесь рассматривается другой подход: Coverity SA — исключая ошибки Boost, Stlport.


*Я не уверен, что это то, что вы хотите, но это все, что я получил!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]