मुझे कुछ अक्षमता से बचने के लिए निम्नलिखित की तरह कोड की शुद्धता को साबित करने के लिए कैसे दृष्टिकोण करना चाहिए, मॉड्यूलर अंकगणित पर निर्भर करता है?कोड के लिए सबूत जो हस्ताक्षरित पूर्णांक ओवरफ़्लो पर निर्भर करता है?
#include <stdint.h>
uint32_t my_add(uint32_t a, uint32_t b) {
uint32_t r = a + b;
if (r < a)
return UINT32_MAX;
return r;
}
मैं WP के "पूर्णांक" मॉडल के साथ प्रयोग किया गया है, लेकिन, अगर मैं सही ढंग से समझ, कि मॉडल पीओ में तार्किक पूर्णांकों का अर्थ विज्ञान, नहीं सी कोड की औपचारिक मॉडल कॉन्फ़िगर करता है। उदाहरण के लिए, "int" मॉडल का उपयोग करते समय ऊपर दिए गए हस्ताक्षर किए गए अतिरिक्त के लिए WP और RTE प्लगइन्स को अभी भी ओवरफ़्लो दावा पीओ की आवश्यकता होती है और इंजेक्ट करता है।
इस तरह के मामलों में, क्या मैं एक कथन या मूल ब्लॉक के लिए लॉजिकल मॉडल को निर्धारित करने वाली टिप्पणियां जोड़ सकता हूं, इसलिए मैं फ्रैमा-सी को बता सकता हूं कि एक विशेष कंपाइलर वास्तव में एक कथन का अर्थ कैसे देता है? यदि ऐसा है, तो मैं परिभाषित-लेकिन-अक्सर-दोष-प्रेरक व्यवहार जैसी चीजों के लिए अन्य सत्यापन तकनीकों का उपयोग कर सकता हूं जैसे हस्ताक्षरित रैप-आस-पास, कंपाइलर-परिभाषित व्यवहार, गैर-मानक व्यवहार (इनलाइन assy?), आदि, और उसके बाद शुद्धता साबित करें आसपास के कोड। मैं कुछ स्थिर विश्लेषकों को सूचित करने के लिए उपयोग किए जाने वाले "जोरदार फिक्स" से कुछ (लेकिन अधिक शक्तिशाली) के समान चित्रण कर रहा हूं कि कुछ गुण तब होते हैं जब वे अपने लिए गुण प्राप्त नहीं कर सकते हैं।
मैं संदर्भ के लिए, Frama-C Fluorine-20130601 के साथ काम कर रहा हूं, alt-ergo 95.1 के साथ।
एक: यह
frama-c -rte -pp-annot file.c -then -wp
द्वारा किया जाता है डिफ़ॉल्ट रूप से, आरटीई ताकि ऊपर कमांड लाइन के साथ, मैं साबित करने के लिए अपने कार्य निम्नलिखित विनिर्देश का सम्मान करता है कि सक्षम हूँ, कोई त्रुटि है पर विचार नहीं करता अहस्ताक्षरित अतिप्रवाह अपने कोड में समस्या: '' 'UINT32_MIN' होने दें और' b' '-1' होने दें। यह कैसे संभाला जाता है? (मेरे पास आपके टूल्स/विशिष्ट कंपाइलर के साथ कोई पृष्ठभूमि नहीं है) – BLaZuRE@BLaZuRE: बी हस्ताक्षरित है, और इसलिए -1 नहीं हो सकता है। –