2016-07-15 3 views
6

내가 수행하는 전문화와 템플릿 기능이 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 
+1

'--p'은 이미 휘발성 T *'타입을 가지고 있으므로 캐스팅은 중복됩니다 –

+1

표준화되지 않은 버전에서는 표준을 무시하고 휘발성을 최적화 할 수 있습니다. 컴파일러는 이것을 memset 호출로 대체 할 수도 있습니다. (휘발성 객체에 대한 액세스를 유지하는 규칙은 바로 그 것이며, 휘발성 지정 포인터를 통한 액세스는 아닙니다.) –

+1

@MM - * "'--p'는 이미'volatile T *'타입을 가지고 있기 때문에 캐스트가 중복되어"* - 그렇게 생각할 수 있습니다. 그러나 GCC의 두 버전은 예상 한 것을하지 못합니다. 예기치 않은 일을하는 컴파일러가 그 루프를 역으로 실행해야하는 이유이기도합니다. 거의 모든 주요 플랫폼에서 20 년간의 컴파일러를 지원 한 기쁨 중 하나입니다. – jww

답변

2

에 Microsft 표준 라이브러리 코드에서이다 나는 억제하려고이 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); 

Silencing false positives in Coverity Prevent이고 다른 접근 방법은 여기에서 다룹니다. Coverity SA - excluding boost, stlport errors.


* 내가 만약 당신이 원하는 경우에 확실하지 않다,하지만 내가 가진 전부 야!

+2

감사합니다 gsamaras.나는 지금 몇 주 동안 이것을 뒤집어 썼다. (나는 몇 주 전 upvote이었다.) 해킹처럼 느껴지며 문제는 다른 방식으로 해결되어야한다고 생각합니다. 나는 Coverity 녀석 중 한 명에게 관심을 갖기를 바라고 질문에 현상금을 썼다. C++ 요소 수를 "바이트 수"로 분석하는 이유를 Coverity 직원이 설명 할 수 있기를 바랍니다. 그리고 해킹 (코드 주석, 모델링 등)없이 해결할 수있는 방법을 알려줄 것입니다. – jww

+1

위대한 @jww, 나는 호기심있다! :) – gsamaras

관련 문제