2016-07-15 8 views
6

मैं एक विशेषज्ञता है कि प्रदर्शन के साथ एक टेम्पलेट समारोह है zeroization:"संदिग्ध आकार" या 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 तत्वों की एक गिनती लेता है, और बाइट्स की गिनती नहीं है?


संपादित: हम अपने विंडोज कोड के साथ दो इसी तरह के निष्कर्षों उठाया गया है। इसके अलावा, कवरिटी मानक लाइब्रेरी कार्यों पर निष्कर्ष निकाल रही है। ऐसा लगता है कि यह सी ++ तत्वों की संख्या के साथ सौदों का एहसास नहीं करता है, और बाइट्स की गणना नहीं करता है।

नीचे <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' में पहले से ही 'अस्थिर टी *' प्रकार है, इसलिए कास्ट अनावश्यक है –

+1

यदि आप अनजान हैं, तो गैर-विशिष्ट संस्करण में, मानक' अस्थिर 'को अनुकूलित करने की अनुमति देता है और कंपाइलर इसे एक मेमसेट कॉल के साथ भी बदल सकता है। (अस्थिर वस्तुओं तक पहुंच को संरक्षित करने के बारे में नियम केवल यही है; अस्थिर-योग्य पॉइंटर्स के माध्यम से नहीं पहुंचता है)। –

+1

@ एमएम - * "' --p' में पहले से ही 'अस्थिर टी * 'प्रकार है, इसलिए कास्ट अनावश्यक है" * - आपको लगता है कि, लेकिन जीसीसी के दो संस्करणों की अपेक्षा करने में असफल रहा है। अप्रत्याशित चीजें करने वाले कंपाइलर्स यही कारण है कि हमें उस लूप को रिवर्स में भी चलाने की ज़रूरत है। यह लगभग हर प्रमुख मंच पर 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।मैं इस पर कई हफ्तों के लिए उलझा हुआ हूं (मैं कुछ हफ्ते पहले ऊपर उठ गया था)। यह एक हैक की तरह लगता है, और मुझे लगता है कि इस मुद्दे को किसी अन्य तरीके से संबोधित किया जाना चाहिए। मैंने दिलचस्पी रखने वाले लोगों में से एक को प्राप्त करने की उम्मीद में सवाल पर एक बक्षीस डाला। उम्मीद है कि कवरिटी लोगों में से एक यह समझाएगा कि क्यों विश्लेषण सी ++ तत्वों की गणना करता है "बाइट्स की गिनती" के रूप में; और उम्मीद है कि वे हमें बताएंगे कि इसे हैक के बिना कैसे संबोधित किया जाए (कोड एनोटेशन, मॉडलिंग, इत्यादि)। – jww

+1

ग्रेट @ jww, मैं उत्सुक हूँ! :) – gsamaras

संबंधित मुद्दे