जावा के लिए पीवीएस-स्टूडियो

जावा के लिए पीवीएस-स्टूडियो

पीवीएस-स्टूडियो स्थैतिक विश्लेषक के सातवें संस्करण में, हमने जावा भाषा के लिए समर्थन जोड़ा। यह इस बारे में थोड़ी बात करने का समय है कि हमने जावा भाषा के लिए समर्थन कैसे करना शुरू किया, हमने क्या किया और भविष्य की क्या योजना है। और, ज़ाहिर है, लेख खुली परियोजनाओं पर विश्लेषक के पहले परीक्षणों को दिखाएगा।

पी वी एस-स्टूडियो


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

पीवीएस-स्टूडियो सी, सी ++, सी # और जावा में लिखे गए कार्यक्रमों के स्रोत कोड में त्रुटियों और संभावित कमजोरियों का पता लगाने के लिए एक उपकरण है। यह विंडोज, लिनक्स और मैकओएस पर चलता है।

PVS-Studio स्थैतिक कोड विश्लेषण करता है और एक रिपोर्ट बनाता है जो प्रोग्रामर को दोषों को खोजने और ठीक करने में मदद करता है। उन लोगों के लिए जो वास्तव में पीवीएस-स्टूडियो त्रुटियों की तलाश में हैं, मैं सुझाव देता हूं कि आप " एरर्स और संभावित कमजोरियों को खोजने के लिए पीवीएस-स्टूडियो कोड विश्लेषक में प्रयुक्त टेक्नोलॉजीज " लेख पढ़ें।

शुरुआत


मैं एक स्मार्ट कहानी के साथ आ सकता हूं, जैसा कि हम दो साल से सोच रहे हैं कि पीवीएस-स्टूडियो में किस भाषा का समर्थन करना है। तथ्य यह है कि जावा इस भाषा की उच्च लोकप्रियता और इतने पर आधारित एक उचित विकल्प है।

हालांकि, जैसा कि जीवन में होता है, सब कुछ गहराई से विश्लेषण द्वारा नहीं, बल्कि प्रयोग द्वारा तय किया गया था :)। हां, हम सोच रहे थे कि पीवीएस-स्टूडियो विश्लेषक को किस दिशा में और विकसित किया जाना चाहिए। प्रोग्रामिंग भाषाओं जैसे: जावा, पीएचपी, पायथन, जावास्क्रिप्ट, आईबीएम आरपीजी पर विचार किया गया। और हम जावा भाषा के लिए इच्छुक थे, लेकिन अंतिम विकल्प अभी तक नहीं बनाया गया है। जिनकी नजर एक अपरिचित आईबीएम आरपीजी पर अटक गई है, मैं यहां इस नोट का उल्लेख करता हूं, जहां से सब कुछ स्पष्ट हो जाएगा।

2017 के अंत में, सहकर्मी ईगोर ब्रेडिकिन ने देखा कि पार्सिंग कोड (दूसरे शब्दों में, पार्सर) के लिए तैयार पुस्तकालय क्या नई दिशाओं के लिए उपलब्ध हैं जो हमारे लिए रुचि के हैं। और मैं जावा कोड को पार्स करने के लिए कई परियोजनाओं में आया था। चम्मच के आधार पर, वह जल्दी से निदान के एक जोड़े के साथ एक प्रोटोटाइप विश्लेषक बनाने में कामयाब रहा। इसके अलावा, यह स्पष्ट हो गया कि हम जावा विश्लेषक में SWIG की मदद से C ++ विश्लेषक के कुछ तंत्र का उपयोग कर सकते हैं। हमने देखा कि क्या हुआ और महसूस किया कि हमारा अगला पार्सर जावा के लिए होगा।

जावा विश्लेषक पर उनके द्वारा किए गए उपक्रम और सक्रिय कार्य के लिए Egor का धन्यवाद। " एक नए स्टेटिक विश्लेषक का विकास: पीवीएस-स्टूडियो जावा " लेख में उन्होंने बताया कि विकास कैसे हुआ।

प्रतियोगियों?


दुनिया में जावा के लिए कई स्वतंत्र और वाणिज्यिक स्थिर कोड विश्लेषक हैं। यह उन सभी को लेख में सूचीबद्ध करने के लिए समझ में नहीं आता है, और मैं सिर्फ " स्थैतिक कोड विश्लेषण के लिए उपकरणों की सूची " के लिए एक लिंक छोड़ता हूं (जावा और बहु ​​भाषा अनुभाग देखें)।

हालाँकि, मुझे पता है कि सबसे पहले हमें IntelliJ IDEA, FindBugs और SonarQube (सोनारजेब) के बारे में पूछा जाएगा।

इंटेलीज आईडिया

IntelliJ IDEA में एक बहुत शक्तिशाली स्थिर कोड विश्लेषक बनाया गया है। इसके अलावा, विश्लेषक विकसित हो रहा है, और इसके लेखक हमारी गतिविधियों की बारीकी से निगरानी कर रहे हैं। इंटेलीज आईडीईए के साथ हम सबसे कठिन होंगे। हम कम से कम अभी के लिए, नैदानिक ​​क्षमताओं में इंटेलीज आईडीईए को पार नहीं कर पाएंगे। इसलिए, हम अपने अन्य लाभों पर ध्यान केंद्रित करने की कोशिश करेंगे।

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

पीवीएस-स्टूडियो में बड़ी पुरानी परियोजनाओं के विकास चक्र में इसे एकीकृत करने की कई संभावनाएं हैं। यह सोनारक्यूब के साथ एकीकरण है । यह विश्लेषक संदेशों का एक विशाल दमन है , जो आपको केवल नए या परिवर्तित कोड में त्रुटियों को ट्रैक करने के लिए एक बड़ी परियोजना में विश्लेषक का उपयोग शुरू करने की अनुमति देता है। पीवीएस-स्टूडियो निरंतर एकीकरण प्रक्रिया में एकीकृत है। मुझे लगता है कि ये और अन्य विशेषताएं हमारे विश्लेषक को जावा दुनिया में सूरज के नीचे एक जगह खोजने में मदद करेगी।

FindBugs

FindBugs प्रोजेक्ट को छोड़ दिया गया है । लेकिन यह इस कारण से याद किया जाना चाहिए कि यह शायद जावा कोड का सबसे प्रसिद्ध मुक्त स्थिर विश्लेषक है।

फाइंडबग्स का उत्तराधिकारी स्पॉटबग्स प्रोजेक्ट है। हालांकि, वह कम लोकप्रिय है, और उसके साथ क्या होगा यह भी अभी पूरी तरह से स्पष्ट नहीं है।

सामान्य तौर पर, हम मानते हैं कि यद्यपि फाइंडबग्स बेहद लोकप्रिय थे और एक निशुल्क विश्लेषक भी थे, लेकिन हमें इसके बारे में नहीं सोचना चाहिए। यह परियोजना केवल चुपचाप और शांति से अतीत की बात है।

PS वैसे, अब खुले प्रोजेक्ट्स के साथ काम करने पर पीवीएस-स्टूडियो को मुफ्त में भी इस्तेमाल किया जा सकता है

सोनारक्यूब (सोनराजवा)

हम मानते हैं कि हम सोनारक्यूब के साथ प्रतिस्पर्धा नहीं करते हैं, लेकिन इसके पूरक हैं। पीवीएस-स्टूडियो सोनारक्यूब के साथ एकीकृत है, जो डेवलपर्स को अपनी परियोजनाओं में अधिक त्रुटियों और संभावित कमजोरियों को खोजने की अनुमति देता है। सोनारक्यूब में पीवीएस-स्टूडियो टूल और अन्य विश्लेषणकर्ताओं को कैसे एकीकृत किया जाए, हम नियमित रूप से मास्टर कक्षाओं में बात करते हैं जो हम विभिन्न सम्मेलनों ( उदाहरण ) में रखते हैं।

जावा के लिए पीवीएस-स्टूडियो कैसे शुरू करें


हमने उपयोगकर्ताओं को असेंबली सिस्टम में विश्लेषक को एकीकृत करने के सबसे लोकप्रिय तरीकों के लिए उपलब्ध कराया है:

  • मावेन के लिए प्लगइन;
  • ग्रैडल के लिए प्लगिन;
  • IntelliJ आईडिया के लिए प्लगइन

परीक्षण के चरण में, हम कई उपयोगकर्ताओं से मिले, जिनके पास स्व-लिखित विधानसभा प्रणाली है, खासकर मोबाइल विकास में। उन्हें सूत्रों और क्लासपैथ को सूचीबद्ध करते हुए, विश्लेषक को सीधे चलाने की क्षमता पसंद थी।

आप प्रलेखन पृष्ठ " पीवीएस-स्टूडियो जावा कैसे शुरू करें " पर विश्लेषक शुरू करने के सभी तरीकों के बारे में विस्तृत जानकारी पा सकते हैं।

हम सोनारक्यूब कोड गुणवत्ता नियंत्रण प्लेटफ़ॉर्म को अनदेखा नहीं कर सकते हैं, जावा डेवलपर्स के बीच इतना लोकप्रिय है, इसलिए हमने अपने सोनारक्यूब प्लगइन में जावा भाषा समर्थन जोड़ा।

आगे की योजना


हमारे पास कई विचार हैं, जिन्हें और अध्ययन की आवश्यकता है, लेकिन हमारे किसी भी विश्लेषक के लिए कुछ योजनाएँ इस तरह दिखती हैं:

  • नए निदान और मौजूदा लोगों के शोधन का निर्माण;
  • डेटाफ्लो विश्लेषण का विकास;
  • विश्वसनीयता और प्रयोज्य में सुधार।

हमें CLION के लिए IntelliJ IDEA प्लगइन को अनुकूलित करने का समय मिल सकता है। जावा विश्लेषक के बारे में पढ़ने वाले डेवलपर्स को हाय सी ++ :-)

ओपन सोर्स प्रोजेक्ट्स में पाई गई त्रुटियों के उदाहरण


यदि मैं लेख में नए विश्लेषक का उपयोग करके पाया गया कोई त्रुटि नहीं दिखाता हूं तो मैं नहीं रहूंगा। हम कुछ बड़े खुले स्रोत जावा प्रोजेक्ट ले सकते हैं और त्रुटि विश्लेषण के साथ एक क्लासिक लेख लिख सकते हैं, जैसा कि हम आमतौर पर करते हैं

हालाँकि, मैं तुरंत इस सवाल का पूर्वाभास करता हूं कि क्या हम इंटेलीज आईडीईए, फाइंडबग्स और इस तरह की परियोजनाओं में कुछ पा सकते हैं। इसलिए, मेरे पास बस एक रास्ता नहीं है, और मैं इन परियोजनाओं के साथ सटीक शुरुआत करूंगा। इसलिए, मैंने निम्नलिखित परियोजनाओं से त्रुटियों के कुछ दिलचस्प उदाहरणों को जल्दी से देखने और लिखने का निर्णय लिया:

  • इंटेलीज आईडिया कम्युनिटी एडिशन । मुझे लगता है कि यह समझाने की कोई आवश्यकता नहीं है कि इस परियोजना को क्यों चुना गया :)।
  • SpotBugs । जैसा कि मैंने पहले लिखा था, फाइंडबग्स प्रोजेक्ट विकसित नहीं हो रहा है। तो स्पॉटबग्स परियोजना पर एक नज़र डालें, जो फाइंडबग्स का उत्तराधिकारी है। स्पॉटबग्स एक क्लासिक स्टैटिक जावा कोड विश्लेषक है।
  • सोनारसोर्स की कुछ परियोजनाएं, जो निरंतर कोड गुणवत्ता नियंत्रण के लिए सॉफ्टवेयर विकसित करती हैं। सोनारक्यूब और सोनारजवा परियोजनाओं पर एक नज़र डालें।

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

इन सब के बावजूद, मुझे इन परियोजनाओं के साथ शुरुआत करनी है। मेरे पास उनके बारे में कुछ लिखने का दूसरा मौका नहीं होगा। मुझे यकीन है कि जावा के लिए पीवीएस-स्टूडियो जारी होने के बाद, इन परियोजनाओं के डेवलपर्स पीवीएस-स्टूडियो को सेवा में ले लेंगे और अपने कोड के नियमित या कम से कम आवधिक चेक के लिए इसका उपयोग करना शुरू कर देंगे। उदाहरण के लिए, मुझे पता है कि टैगबिर वलयेव ( lany ), जेटबरीन्स डेवलपर्स में से एक, जो इंटेलीजे आईडीईए स्टेटिक कोड विश्लेषक में लगे हुए हैं, पहले से ही पीवीएस-स्टूडियो के बीटा संस्करण के साथ खेल रहे हैं, जब मैं लेख लिख रहा था। उन्होंने बग रिपोर्ट और सिफारिशों के साथ लगभग 15 पत्र पहले ही हमें लिखे हैं। थैंक यू टैगीर!

सौभाग्य से, मुझे एक विशेष परियोजना में अधिक से अधिक त्रुटियां खोजने की जरूरत नहीं है। अब मेरा काम यह दिखाना है कि जावा के लिए पीवीएस-स्टूडियो विश्लेषक व्यर्थ नहीं दिखाई दिए और कोड की गुणवत्ता में सुधार करने के लिए डिज़ाइन किए गए अन्य उपकरणों की लाइन को फिर से भरने में सक्षम होंगे। मैंने विश्लेषक की रिपोर्टों को देखा और कुछ त्रुटियां लिखीं जो मुझे रोचक लगीं। जब भी संभव हो, मैंने विभिन्न प्रकार की त्रुटियों को लिखने का प्रयास किया। आइए देखें क्या हुआ।

इंटेलीज आईडीईए इंटेगर डिवीजन


private static boolean checkSentenceCapitalization(@NotNull String value) { List<String> words = StringUtil.split(value, " "); .... int capitalized = 1; .... return capitalized / words.size() < 0.2; // allow reasonable amount of // capitalized words } 

PVS-Studio चेतावनी: V6011 [CWE-682] 'डबल' प्रकार के '0.2' शाब्दिक की तुलना 'int' प्रकार के मान से की जाती है। टाइटलकैपिटलाइज़ेशनइन्स्पेक्शन.जावा 169

जैसा कि इरादा है, एक फ़ंक्शन को सही लौटना चाहिए यदि 20% से कम शब्द एक बड़े अक्षर से शुरू होते हैं। वास्तव में, चेक काम नहीं करता है, क्योंकि पूर्णांक विभाजन होता है। विभाजन के परिणामस्वरूप, केवल दो मान प्राप्त किए जा सकते हैं: 0 या 1।

फ़ंक्शन तभी गलत मान लौटाएगा जब सभी शब्द एक कैपिटल लेटर से शुरू होंगे। अन्य सभी मामलों में, विभाजन 0 का उत्पादन करेगा, और फ़ंक्शन सही मान लौटाएगा।

इंटेलीज आईडीईए संदिग्ध चक्र


 public int findPreviousIndex(int current) { int count = myPainter.getErrorStripeCount(); int foundIndex = -1; int foundLayer = 0; if (0 <= current && current < count) { current--; for (int index = count - 1; index >= 0; index++) { // <= int layer = getLayer(index); if (layer > foundLayer) { foundIndex = index; foundLayer = layer; } } .... } 

पीवीएस-स्टूडियो चेतावनी: V6007 [CWE-571] अभिव्यक्ति 'सूचकांक> = 0' हमेशा सच होता है। अपडेटर.जावा 184

सबसे पहले, स्थिति को देखें (0 <= current && current <count) । इसे केवल तभी निष्पादित किया जाता है जब गणना चर का मान 0 से अधिक हो।

अब लूप को देखें:

 for (int index = count - 1; index >= 0; index++) 

वैरिएबल इंडेक्स की गणना अभिव्यक्ति संख्या - 1 से होती है । चूँकि गणना चर 0 से अधिक है, सूचकांक चर का प्रारंभिक मान हमेशा 0 से अधिक या बराबर होता है। यह पता चलता है कि लूप को तब तक क्रियान्वित किया जाएगा, जब तक कि सूचकांक चर अधिक नहीं हो जाता।

सबसे अधिक संभावना है, यह सिर्फ एक टाइपो है और वेतन वृद्धि को निष्पादित नहीं किया जाना चाहिए, लेकिन चर का घटाव:

 for (int index = count - 1; index >= 0; index--) 

इंटेलीज आईडिया, कॉपी-पेस्ट


 @NonNls public static final String BEFORE_STR_OLD = "before:"; @NonNls public static final String AFTER_STR_OLD = "after:"; private static boolean isBeforeOrAfterKeyword(String str, boolean trimKeyword) { return (trimKeyword ? LoadingOrder.BEFORE_STR.trim() : LoadingOrder.BEFORE_STR).equalsIgnoreCase(str) || (trimKeyword ? LoadingOrder.AFTER_STR.trim() : LoadingOrder.AFTER_STR).equalsIgnoreCase(str) || LoadingOrder.BEFORE_STR_OLD.equalsIgnoreCase(str) || // <= LoadingOrder.BEFORE_STR_OLD.equalsIgnoreCase(str); // <= } 

PVS-Studio चेतावनी: V6001 [CWE-570] समान उप-अभिव्यक्तियाँ हैं 'LoadingOrder.BEFORE_STR_OLD.equalsIgnoreCase (str)' बाईं और दाईं ओर '' || ऑपरेटर। चेक लाइनें: 127, 128. एक्सटेंशनऑडरक्रोनरेटर.जावा 127

अंतिम पंक्ति का अच्छा पुराना प्रभाव । प्रोग्रामर ने जल्दबाजी की और कोड की एक पंक्ति को गुणा किया, इसे ठीक करना भूल गया। परिणामस्वरूप, दो बार स्ट्रिंग स्ट्रिंग की तुलना BEFORE_STR_OLD से की जाती है । सबसे अधिक संभावना है, तुलना में से एक AFTER_STR_OLD के साथ होना चाहिए।

इंटेलीज आईडिया टाइपो


 public synchronized boolean isIdentifier(@NotNull String name, final Project project) { if (!StringUtil.startsWithChar(name,'\'') && !StringUtil.startsWithChar(name,'\"')) { name = "\"" + name; } if (!StringUtil.endsWithChar(name,'"') && !StringUtil.endsWithChar(name,'\"')) { name += "\""; } .... } 

PVS-Studio चेतावनी: V6001 [CWE-571] समान उप-अभिव्यक्तियाँ हैं '! StringUtil.endsWithChar (नाम,' '') 'बाईं ओर' और 'ऑपरेटर' के दाईं ओर। JsonNamesValidator.java 27

कोड का यह टुकड़ा सत्यापित करता है कि नाम एकल या दोहरे उद्धरण चिह्नों में है। यदि ऐसा नहीं होता है, तो दोहरे उद्धरण चिह्नों को स्वचालित रूप से जोड़ दिया जाता है।

एक टाइपो के कारण, नाम की समाप्ति केवल दोहरे उद्धरण चिह्नों के लिए जाँच की जाती है। परिणामस्वरूप, एकल उद्धरणों में लिया गया नाम सही ढंग से संसाधित नहीं होगा।

पहला नाम

 'Abcd' 

अतिरिक्त दोहरे उद्धरणों को जोड़ने के कारण यह इसमें बदल जाएगा:

 'Abcd'" 

IntelliJ IDEA, गलत सरणी अतिप्रवाह सुरक्षा


 static Context parse(....) { .... for (int i = offset; i < endOffset; i++) { char c = text.charAt(i); if (c == '<' && i < endOffset && text.charAt(i + 1) == '/' && startTag != null && CharArrayUtil.regionMatches(text, i + 2, endOffset, startTag)) { endTagStartOffset = i; break; } } .... } 

पीवीएस-स्टूडियो चेतावनी: V6007 [CWE-571] अभिव्यक्ति 'i <endOffset' हमेशा सच होती है। EnterAfterJavadocTagHandler.java 183

यदि कथन का कोई अर्थ नहीं है, तो सब- इंप्रेशन i <endOffset चर हमेशा iOffset से कम होता है, जैसा कि लूप को निष्पादित करने की स्थिति से होता है।

सबसे अधिक संभावना है, प्रोग्रामर कॉल करने के दौरान खुद को लाइन से बाहर जाने से बचाना चाहता था:

  • text.charAt (i + 1)
  • CharArrayUtil.regionMatches (टेक्स्ट, i + 2, एंडऑफ़सेट, स्टार्टटैग)

इस मामले में, सूचकांक की जांच करने के लिए उपप्रकार इस तरह होना चाहिए: i <endOffset - 2

इंटेलीज आईडीईए रिपीट चेक


 public static String generateWarningMessage(....) { .... if (buffer.length() > 0) { if (buffer.length() > 0) { buffer.append(" ").append( IdeBundle.message("prompt.delete.and")).append(" "); } } .... } 

PVS-Studio चेतावनी: V6007 [CWE-571] अभिव्यक्ति 'बफर .length ()> 0' हमेशा सच है। DeleteUtil.java 62

यह एक हानिरहित निरर्थक कोड या गंभीर गलती हो सकती है।

उदाहरण के लिए, यदि कोई डुप्लिकेट जांच, उदाहरण के लिए, रिफैक्टरिंग के दौरान दिखाई देती है, तो इसमें कुछ भी गलत नहीं है। दूसरा चेक बस हटाया जा सकता है।

लेकिन एक और परिदृश्य संभव है। दूसरा चेक पूरी तरह से अलग होना चाहिए और कोड इरादा के अनुसार व्यवहार नहीं करता है। फिर यह एक वास्तविक गलती है।

नोट। वैसे, बहुत सारे निरर्थक चेक हैं। इसके अलावा, यह अक्सर देखा जाता है कि यह कोई गलती नहीं है। हालाँकि, विश्लेषक संदेशों को गलत सकारात्मकता नहीं कहा जा सकता है। स्पष्ट करने के लिए, यहाँ एक उदाहरण है, जिसे IntelliJ IDEA से भी लिया गया है:

 private static boolean isMultiline(PsiElement element) { String text = element.getText(); return text.contains("\n") || text.contains("\r") || text.contains("\r\n"); } 

विश्लेषक कहता है कि text.contains ("\ r \ n") फ़ंक्शन हमेशा गलत होता है। वास्तव में, अगर प्रतीक "\ n" और "\ r" नहीं मिला है, तो "\ r \ n" की तलाश में कोई मतलब नहीं है। यह कोई गलती नहीं है, और कोड केवल खराब है क्योंकि यह थोड़ा धीमा काम करता है, एक विकल्प के लिए अर्थहीन खोज का प्रदर्शन करता है।

इस तरह के कोड से कैसे निपटना है, प्रत्येक मामले में, यह तय करने के लिए प्रोग्रामर पर निर्भर है। एक नियम के रूप में, लेख लिखते समय, मैं बस ऐसे कोड पर ध्यान नहीं देता।

इंटेलीज आईडिया, कुछ गलत है


 public boolean satisfiedBy(@NotNull PsiElement element) { .... @NonNls final String text = expression.getText().replaceAll("_", ""); if (text == null || text.length() < 2) { return false; } if ("0".equals(text) || "0L".equals(text) || "0l".equals(text)) { return false; } return text.charAt(0) == '0'; } 

पीवीएस-स्टूडियो चेतावनी: V6007 [CWE-570] अभिव्यक्ति '"0"। असमान (पाठ)' हमेशा गलत है। ConvertIntegerToDecimalPredicate.java 46

इस कोड में निश्चित रूप से एक तार्किक त्रुटि है। लेकिन मुझे यह कहना मुश्किल है कि प्रोग्रामर क्या जांचना चाहता था, और दोष को कैसे ठीक किया जाए। इसलिए, यहाँ मैं केवल एक निरर्थक जाँच को इंगित करूँगा।

शुरुआत में, यह जांचा जाता है कि स्ट्रिंग में कम से कम दो अक्षर होने चाहिए। यदि ऐसा नहीं है, तो फ़ंक्शन गलत है

निम्नलिखित एक "0" है। असमान (पाठ) जाँच। यह अर्थहीन है, क्योंकि एक तार में केवल एक वर्ण नहीं हो सकता है।

सामान्य तौर पर, यहां कुछ गलत है और कोड तय होना चाहिए।

स्पॉटबग्स (फाइंडबग्स के उत्तराधिकारी), पुनरावृत्ति सीमा त्रुटि


 public static String getXMLType(@WillNotClose InputStream in) throws IOException { .... String s; int count = 0; while (count < 4) { s = r.readLine(); if (s == null) { break; } Matcher m = tag.matcher(s); if (m.find()) { return m.group(1); } } throw new IOException("Didn't find xml tag"); .... } 

पीवीएस-स्टूडियो चेतावनी: V6007 [CWE-571] अभिव्यक्ति 'गिनती <4' हमेशा सच होती है। उत्पल.जावा 394

जैसा कि योजना बनाई गई है, xml टैग की खोज केवल फ़ाइल की पहली चार पंक्तियों में की जानी चाहिए। लेकिन इस तथ्य के कारण कि वे चर गणना में वृद्धि करना भूल गए, पूरी फाइल पढ़ी जाएगी।

सबसे पहले, यह एक बहुत ही धीमी गति से ऑपरेशन हो सकता है, और दूसरी बात, कहीं न कहीं फ़ाइल के बीच में कुछ ऐसा पाया जा सकता है जिसे एक्सएमएल टैग के रूप में व्याख्या किया जाएगा, लेकिन यह ऐसा नहीं होगा।

स्पॉटबग्स (फाइंडबग्स के उत्तराधिकारी), ओवरराइटिंग मूल्यों


 private void reportBug() { int priority = LOW_PRIORITY; String pattern = "NS_NON_SHORT_CIRCUIT"; if (sawDangerOld) { if (sawNullTestVeryOld) { priority = HIGH_PRIORITY; // <= } if (sawMethodCallOld || sawNumericTestVeryOld && sawArrayDangerOld) { priority = HIGH_PRIORITY; // <= pattern = "NS_DANGEROUS_NON_SHORT_CIRCUIT"; } else { priority = NORMAL_PRIORITY; // <= } } bugAccumulator.accumulateBug( new BugInstance(this, pattern, priority).addClassAndMethod(this), this); } 

PVS-Studio चेतावनी: V6021 [CWE-563] मान को 'प्राथमिकता' चर को सौंपा गया है, लेकिन इसका उपयोग नहीं किया गया है। FindNonShortCircuit.java 197

प्राथमिकता चर का मान चर sawNullTestVeryOld के मूल्य के आधार पर निर्धारित किया जाता है । हालांकि, यह कोई भूमिका नहीं निभाता है। इसके अलावा, प्राथमिकता चर को किसी भी मामले में एक अलग मूल्य सौंपा जाएगा। फ़ंक्शन के तर्क में एक स्पष्ट त्रुटि।

सोनारक्यूब, कॉपी-पेस्ट


 public class RuleDto { .... private final RuleDefinitionDto definition; private final RuleMetadataDto metadata; .... private void setUpdatedAtFromDefinition(@Nullable Long updatedAt) { if (updatedAt != null && updatedAt > definition.getUpdatedAt()) { setUpdatedAt(updatedAt); } } private void setUpdatedAtFromMetadata(@Nullable Long updatedAt) { if (updatedAt != null && updatedAt > definition.getUpdatedAt()) { setUpdatedAt(updatedAt); } } .... } 

PVS-Studio: V6032 यह विचित्र है कि विधि 'setUpdatedAtFromDefinition' का शरीर किसी अन्य विधि 'setUpdatedAtFromMetadata' के शरीर के समतुल्य है। चेक लाइन्स: 396, 405. RuleDto.java 396

SetUpdatedAtFromMetadata विधि परिभाषा फ़ील्ड का उपयोग करती है। सबसे अधिक संभावना है, मेटाडेटा फ़ील्ड का उपयोग किया जाना चाहिए। यह असफल कॉपी-पेस्ट के परिणामों के समान है।

सोनारजवा, मानचित्र आरंभीकरण पर डुप्लिकेट


 private final Map<JavaPunctuator, Tree.Kind> assignmentOperators = Maps.newEnumMap(JavaPunctuator.class); public KindMaps() { .... assignmentOperators.put(JavaPunctuator.PLUSEQU, Tree.Kind.PLUS_ASSIGNMENT); .... assignmentOperators.put(JavaPunctuator.PLUSEQU, Tree.Kind.PLUS_ASSIGNMENT); .... } 

PVS-Studio चेतावनी: V6033 [CWE-462] समान कुंजी 'JavaPunctuator.PLUSEQU' के साथ एक आइटम पहले ही जोड़ा जा चुका है। चेक लाइनें: 104, 100. KindMaps.java 104

कार्ड में एक ही कुंजी-मूल्य जोड़ी को दो बार रखा गया है। सबसे अधिक संभावना है, यह असावधान हो गया, और वास्तव में कोई वास्तविक गलती नहीं है। हालांकि, किसी भी मामले में, इस कोड को जांचने की आवश्यकता है, क्योंकि आप किसी अन्य जोड़ी को जोड़ना भूल गए होंगे।

निष्कर्ष


लेकिन क्या निष्कर्ष हो सकता है ?! मैं बिना देरी किए, पीवीएस-स्टूडियो डाउनलोड करने और जावा में अपने काम करने की परियोजनाओं का परीक्षण करने की कोशिश करता हूं! पीवीएस-स्टूडियो डाउनलोड करें

ध्यान देने के लिए आप सभी का धन्यवाद। मुझे उम्मीद है कि जल्द ही हम विभिन्न खुले जावा परियोजनाओं की जांच के लिए समर्पित लेखों की एक श्रृंखला के साथ पाठकों को प्रसन्न करेंगे।



यदि आप इस लेख को अंग्रेजी बोलने वाले दर्शकों के साथ साझा करना चाहते हैं, तो कृपया अनुवाद के लिंक का उपयोग करें: एंड्रे कारपोव। जावा के लिए पीवीएस-स्टूडियो

Source: https://habr.com/ru/post/hi436434/


All Articles