2011-03-16 29 views
5

हाय मुझे कुछ कोड मिला है जो Findbugs द्वारा NP_GUARANTEED_DEREF समस्या होने के रूप में रिपोर्ट किया गया है। अब मेरे कोड को देखकर मुझे समझ में नहीं आता कि इसमें क्या गलत है, क्या कोई सुझाव दे सकता है कि समस्या क्या है।Findbugs समस्या को ठीक करने के लिए कैसे करें "शून्य मान को संदर्भित करने की गारंटी है" NP_GUARANTEED_DEREF

public void test() { 
    String var = ""; 
    int index = 2; 
    if (index == -1) { 
    var = String.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } else { 
    var = Integer.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } 
    if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF 
    /* 
    * There is a statement or branch that if executed guarantees that a value 
    * is null at this point, and that value that is guaranteed to be 
    * dereferenced (except on forward paths involving runtime exceptions). 
    */ 
    throw new NullPointerException("NULL"); 
    } 
} 

अब त्रुटि FindBugs में यह बग के लिए कारण के रूप में var = null; करने के लिए दो कार्य पर प्रकाश डाला गया में ड्रिलिंग, लेकिन मैं काफी क्यों समझ में नहीं आता। ऐसा नहीं है कि मैं वास्तव में var ऑब्जेक्ट के साथ कुछ भी कर रहा हूं, मैं बस एक नल चेक कर रहा हूं। उदाहरण वास्तविक उत्पादन कोड से लिया गया है लेकिन त्रुटि को पुन: पेश करने के लिए आवश्यक कुछ भी छीन लिया गया है। मैं क्या सोच रहा हूं कि यह झूठी सकारात्मक है या नहीं। और यदि नहीं, तो उचित फिक्स क्या होगा। http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF

[अद्यतन] है इस मुद्दे को मैं अब इस एक झूठी सकारात्मक रूप में FindBugs बगट्रैकर में Sourceforge पर कड़ी लॉग इन किया है पर कुछ प्रतिक्रिया प्राप्त करने के बाद https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

:

यहाँ के FindBugs बग विस्तार से लिंक है

समस्या के बारे में बातचीत जारी रहेगी।

+0

क्या आपको किसी भी मौके से पहले 'var.equals (शून्य)' था? क्या आप वाकई उस फ़ाइल पर Findbugs को फिर से चला चुके हैं (जो मैं आमतौर पर करता हूं वह है कि मैं "क्लीन बग मार्कर" कहता हूं)। –

+0

हाँ मुझे यकीन है कि मैंने Findbugs को दोबारा शुरू कर दिया है, और नहीं, यह कभी भी 'var.equals (null)' नहीं था, अगर यह था कि यह आसानी से समझ में आता है। जैसा कि jzd ने कहा कि यह गलत नहीं लग रहा है। अगर मुझे और अधिक पुष्टि मिलती है कि यह गलत नहीं दिखता है तो मैं शायद फ़ायरबग – AGrunewald

+0

के साथ एक बग (गलत सकारात्मक) पोस्ट करूंगा। मैं अपने कंप्यूटर पर एक ही एफबी व्यवहार की पुष्टि कर सकता हूं। वास्तव में अजीब लग रहा है। मजाकिया बात यह है कि अगर आपने 'नया न्यूटाइंटर एक्सेप्शन' फेंक दिया है, तो 'नया रनटाइम अपवाद' फेंक दें, बग मार्कर गायब हो जाएगा। –

उत्तर

5

मैं देख रहा हूँ:

केवल एक चीज मैं बदल सकता है इसलिए की तरह पीछे की ओर तुलना में लिखने के लिए है। मैं अपने कंप्यूटर पर एक ही एफबी व्यवहार की पुष्टि कर सकता हूं। वास्तव में अजीब लग रहा है। मजाकिया बात यह है कि अगर आपने throw new NullPointerException को throw new RuntimeException के साथ बदल दिया है तो बग मार्कर गायब हो जाएगा।

अब मुझे लगता है कि मैं समझता हूं कि उनका क्या मतलब है। संदेश का शब्द सटीक नहीं है, लेकिन वे आपको एनपीई के खिलाफ चेतावनी दे रहे हैं। मुझे लगता है कि वे स्पष्ट रूप से एनपीई को खराब अभ्यास फेंकने पर विचार करते हैं।

0

त्रुटि संदेश here की परिभाषा में करीब देख रहे हैं, यह कहते हैं:

एक बयान या शाखा नहीं है कि अगर एक मूल्य के इस बिंदु पर अशक्त, और कहा कि मूल्य है निष्पादित गारंटी देता है कि कि dereferenced किए जाने की आप

कौन सा मुझे लगता है कि बनाता है यह या तो बस दे के.एन. ( क्रम अपवाद को शामिल आगे रास्तों को छोड़कर) की गारंटी है ओउ var शून्य होने जा रहा है या वास्तव में कुछ खोज कर रहा है लगता है कि var कथन के अंदर var संदर्भित है।

आपके द्वारा पोस्ट किया गया कोड ठीक दिखता है, मैं दोबारा जांच करूंगा कि var var को सही कोड में एक्सेस नहीं किया गया है।

if (null == var) 

इस तरह यह स्पष्ट है अगर आप = के में से एक को छोड़/

+0

उत्तर jzd के लिए धन्यवाद, जबकि मैं तुलना के स्वैपिंग पर आपके साथ सहमत हूं दुर्भाग्य से यह पता नहीं चलता कि Findbugs क्या रिपोर्ट कर रहा है। – AGrunewald

+0

@ एग्र्यून, मैंने परिभाषा को देखा और अब मैं अपने उत्तर के बारे में बेहतर महसूस करता हूं। मैंने परिभाषा को शामिल करने के लिए इसे अद्यतन किया है। – jzd

3

यह FindBugs में एक बग है, इस समस्या को उनके अंक ट्रैकर पृष्ठ पर पोस्ट करें। findbugs.sf.net

+0

धन्यवाद हाँ वास्तव में यह एक बग है, मेलिंगलिस्ट ने एक ही जवाब दिया। मैं इसे एक बग के रूप में फाइल करूंगा और तदनुसार अपना प्रश्न अपडेट करूंगा। – AGrunewald

2

ठीक है, क्या ढूँढें ढूँढें एक बयान या शाखा है जो एक शून्य सूचक अपवाद की ओर अग्रसर होने की गारंटी है। मूल रूप से, हम केवल शून्य मूल्यों के dereferences के लिए देखा।हम बाद में विश्लेषण संवर्धित

if (x == null) throw new NullPointerException()

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

तो हमारे त्रुटि संदेशों में से कुछ पाठ को अपडेट करने की आवश्यकता हो सकती है, लेकिन हमें वास्तव में कई यथार्थवादी मामले नहीं मिले हैं जहां यह भ्रम पैदा करता है।

मुझे पूरा यकीन नहीं है कि उपर्युक्त कोड का उद्देश्य क्या है। उन बिंदुओं पर जहां आप var को शून्य कर रहे हैं, आप एक ऐसी स्थिति बना रहे हैं जो एक शून्य सूचक अपवाद के स्पष्ट फेंक को आगे बढ़ाएगी। क्या वास्तव में वह व्यवहार है जिसे आप चाहते हैं?

+0

SourceForge बगट्रैक में वार्तालाप जारी रहता है https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693 – AGrunewald