내가 수행하는 전문화와 템플릿 기능이 zeroization :"의심스러운 sizeof"또는 SIZEOF_MISMATCH 찾기를 위해 Coverity를 훈련시키는 방법?
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");
}
커버 리티는
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++이 요소의 수를 다루고 바이트 수를 처리하지 않는다는 것을 알 수 있습니다.
아래는 <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
'--p'은 이미 휘발성 T *'타입을 가지고 있으므로 캐스팅은 중복됩니다 –
표준화되지 않은 버전에서는 표준을 무시하고 휘발성을 최적화 할 수 있습니다. 컴파일러는 이것을 memset 호출로 대체 할 수도 있습니다. (휘발성 객체에 대한 액세스를 유지하는 규칙은 바로 그 것이며, 휘발성 지정 포인터를 통한 액세스는 아닙니다.) –
@MM - * "'--p'는 이미'volatile T *'타입을 가지고 있기 때문에 캐스트가 중복되어"* - 그렇게 생각할 수 있습니다. 그러나 GCC의 두 버전은 예상 한 것을하지 못합니다. 예기치 않은 일을하는 컴파일러가 그 루프를 역으로 실행해야하는 이유이기도합니다. 거의 모든 주요 플랫폼에서 20 년간의 컴파일러를 지원 한 기쁨 중 하나입니다. – jww