8

मैं सी # का उपयोग कर एक गणना मॉड्यूल पर काम कर रहा हूँ, और मैं इस पर टकरा:टाइप रूपांतरण के कारण संभावित अंकगणितीय त्रुटियों के बारे में चेतावनी कैसे दी जाए?

double v = 4/100; 

मैं जानता हूँ कि यह एक गलत आरंभीकरण कि v = 0.0 के बजाय v = 0.04

C# नियम रिटर्न कहता है कि मैं यह सुनिश्चित करना चाहिए है सदस्य कम से कम एक एक डबल है, इस तरह:

double v = (double) 4/100; 
double v = 4.0/100; 

हालांकि, मैं उस तरह के कई कई initializations है पूर्णांक चर संचालन शामिल है, और मुझे ऐसी गलतियों का पता लगाने के लिए लाइन द्वारा मेरी कोड लाइन ब्राउज़ करने के लिए आलसी लग रहा है।

इसके बजाय, क्या इस बारे में संकलक द्वारा चेतावनी प्राप्त करना संभव है?

+0

यह इस बात पर निर्भर करता है कि आप किस कंपाइलर का उपयोग कर रहे हैं। त्रुटि संदेश और चेतावनियां भाषा की एक अंतर्निहित विशेषता नहीं है, लेकिन कुछ ऐसा है जो संकलक जोड़ता है। यदि आप जिस कंपाइलर का उपयोग कर रहे हैं वह इसका समर्थन नहीं करता है, तो नहीं, यह संभव नहीं है। – Hoeloe

+1

एक [uservoice टिकट] है (http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2813345-add-a-warning-when-promoting-the-result-of-integer) पूछना इस सुविधा के लिए। –

+0

मैं .NET 4.0, और विजुअल स्टूडियो 2010 के साथ प्रदान किए गए सी # कंपाइलर का उपयोग कर रहा हूं। – Larry

उत्तर

4

ठीक है, कुछ के आसपास खेल रहे हैं और क्या नहीं के बाद, मैं एक समाधान है। मैंने इस समाधान पर आने के लिए this article का उपयोग किया। मैं StyleCop का उपयोग करता हूं, इसलिए आपको इसे प्राप्त करने और इंस्टॉल करने की आवश्यकता होगी। फिर, आप मेरी सी # परियोजना MathematicsAnalyzer डाउनलोड कर सकते हैं।

सबसे पहले, मैं सभी प्रकार के रूपांतरण विसंगतियों के लिए जिम्मेदार नहीं था। वास्तव में, मैं केवल एक भाग को समायोजित करता हूं।

असल में, मैं यह देखने के लिए जांच करता हूं कि रेखा में "डबल" एक स्थान के बाद है या नहीं। मुझे पता है कि झूठी चेतावनियां हो सकती हैं, क्योंकि कक्षा का अंत डबल या अन्य चीजों की संख्या हो सकता है, लेकिन मैं इस प्रकार को सही तरीके से अलग करने के तरीके के बारे में जानने के लिए आपको छोड़ दूंगा।

तो मिलान हो जाता है, मुझे लगता है कि यह इस regex से मेल खाता देखने के लिए जाँच:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;) 

यह -not- इस रेगुलर एक्सप्रेशन से मेल खाता है, तो फिर मैं उल्लंघन जोड़ें। यह रेगेक्स किस पर मेल खाएगा निम्न में से कोई भी है:

  • डबल i = 4d/100;
  • डबल i = 4d/100;
  • डबल i = 4/100d;
  • डबल i = 4/100d;
  • डबल i = 4/100d;
  • डबल i = 4/100d;
  • डबल i = 4d/100;
  • डबल i = 4/100d;
  • डबल i = 4/100d;

उपरोक्त में से कोई भी उल्लंघन नहीं करेगा। जैसा कि वर्तमान में लिखा गया है, अगर 'डी' का उपयोग नहीं किया जाता है, तो यह बहुत अधिक उल्लंघन करेगा। एक ऑपरेंड को स्पष्ट रूप से कास्टिंग करने के अन्य संभावित तरीकों के लिए आपको अतिरिक्त तर्क जोड़ने की आवश्यकता होगी। जैसा कि मैं इसे लिख रहा हूं, मुझे अभी एहसास हुआ है कि दोनों ऑपरेटरों पर 'डी' होने से अधिकतर अपवाद फेंक दिया जाएगा। ओह।

और आखिरकार, मैं स्टाइलकॉप को अपना उल्लंघन ठीक से प्रदर्शित नहीं कर सका। यह मुझे मौजूदा नियम के बारे में एक त्रुटि दे रहा है, और यहां तक ​​कि दूसरी आंखों के साथ भी, हमें समाधान नहीं मिला, इसलिए मैंने इसे हैक किया। त्रुटि उस नियम का नाम दिखाती है जिसे आप ढूंढने का प्रयास कर रहे थे, इसलिए मैंने नियम का नाम कुछ वर्णनात्मक के रूप में रखा और इसमें लाइन नंबर शामिल किया।

कस्टम नियम स्थापित करने के लिए, गणितीय विश्लेषक परियोजना का निर्माण करें। विजुअल स्टूडियो को बंद करें और DLL को StyleCop इंस्टॉल निर्देशिका में कॉपी करें। जब आप विजुअल स्टूडियो खोलते हैं, तो आपको स्टाइलकॉप सेटिंग्स में नियम देखना चाहिए। मैंने जो आलेख इस्तेमाल किया है, उसका चरण 5 और 6 दिखाता है कि यह कहां करना है।

यह केवल समाधान के दौरान एक बार उल्लंघन का उल्लंघन करता है, इसलिए आपको इसे दिखाए गए उल्लंघन को ठीक करना होगा, और अगले को ढूंढने के लिए स्टाइलकॉप को फिर से चलाएं। उसके चारों ओर एक रास्ता हो सकता है, लेकिन मैं रस से बाहर भाग गया और यहां रुक गया।

का आनंद लें!

+0

बहुत बहुत धन्यवाद। यह सही नहीं है, लेकिन यह बहुत मदद करता है। – Larry

3

यह आलेख बताता है कि कस्टम कोड विश्लेषण नियम कैसे सेट अप करें, जब आप कोड विश्लेषण चलाते हैं, तो चेतावनियां दिखा सकते हैं और क्या नहीं।

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

+0

इस जानकारी के लिए आपको बहुत बहुत धन्यवाद। दुर्भाग्यवश, उस कस्टम नियम को लागू करना आसान नहीं होगा जो उस प्रकार के रूपांतरण मिलान के लिए मेरे कोड को पार्स करता है। – Larry

+0

मैं पूरी तरह से समझता हूं। मैंने इसके बारे में सोचा, लेकिन यह एकमात्र तरीका है जिसे मैं अपने शोध में पा सकता हूं। – seekerOfKnowledge