2016-12-20 7 views
6

मैटलैब कोड-विश्लेषक में त्रुटियों और अक्षमताओं को सही करने के तरीके पर बहुत अच्छे सुझाव हैं, लेकिन मुझे कभी-कभी ऐसी स्थितियों का सामना करना पड़ता है जिन्हें मैं विश्लेषक द्वारा पकड़ा जाना चाहता हूं। विशेष रूप से मैं निम्नलिखित की तरह कोड की सोच रहा हूँ:क्या मैं कस्टम मैटलैब कोड-विश्लेषक चेतावनियां कर सकता हूं?

if numel(list > x) 
    ... 
end 

मैं नहीं बंद मेरे सिर के ऊपर किसी भी स्थिति है जहाँ मैं ऊपर कोड का उपयोग करने की आवश्यकता है के बारे में सोच सकता है जबकि निम्न कोड:

if numel(list) > x 
    ... 
end 

अक्सर उपयोग किया जाता है।

मैंने संभावित चीजों की सूची को देखा जो कोड-विश्लेषक मुझे चेतावनी दे सकता था और मुझे यह संभावना नहीं मिली।

तो मेरा सवाल है: क्या कोड-विश्लेषक को अपनी चेतावनियां जोड़ना संभव है, और यदि हां, तो कैसे?

मुझे एहसास है कि यदि यह संभव है तो यह एक कठिन कार्य हो सकता है, इसलिए विशिष्ट समस्या के लिए किसी भी विकल्प या कामकाज सुझावों की भी सराहना की जाएगी!

+0

आपको इस [लेख] (http://undocumentedmatlab.com/blog/parsing-mlint-code-analyzer-output) पर एक नज़र रखना चाहिए – obchardon

उत्तर

2

मुझे विश्वास नहीं है कि MATLAB Code Analyzer के लिए नए कोड पैटर्न जोड़ने के लिए कोई तरीका है। आप बस इतना कर सकते हैं कि मौजूदा चेतावनियां प्रदर्शित या दबा दी गई हैं।

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

यह अक्सर मुश्किल हो सकता है, लेकिन करने योग्य। उदाहरण के तौर पर, मैंने कोड का यह टुकड़ा लिखा है जो ऊपर वर्णित पैटर्न की तलाश में है। बातें अक्सर जब कुछ इस तरह कर रही enclosing कोष्ठकों के सेट के लिए लेखांकन है प्रबंधित किया जा नहीं है, जो मैं पहले कोष्ठकों के गैर दिलचस्प जोड़े और उनकी सामग्री को हटाने के द्वारा संभाल में से एक:

function check_code(filePath) 

    % Read lines from the file: 
    fid = fopen(filePath, 'r'); 
    codeLines = textscan(fid, '%s', 'Delimiter', '\n'); 
    fclose(fid); 
    codeLines = codeLines{1}; 

    % Remove sets of parentheses that do not encapsulate a logical statement: 
    tempCode = codeLines; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    while ~isequal(modCode, tempCode) 
    tempCode = modCode; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    end 

    % Match patterns using regexp: 
    matchIndex = regexp(modCode, 'numel\([^\(\)]+[<>=~\|\&]+[^\(\)]+\)'); 

    % Format return information: 
    nMatches = cellfun(@numel, matchIndex); 
    index = find(nMatches); 
    lineNumbers = repelem(index, nMatches(index)); 
    fprintf('Line %d: Potential incorrect use of NUMEL in logical statement.\n', ... 
      lineNumbers); 

end 
% Test cases: 
% if numel(list < x) 
% if numel(list) < x 
% if numel(list(:,1)) < x 
% if numel(list(:,1) < x) 
% if (numel(list(:,1)) < x) 
% if numel(list < x) & numel(list < y) 
% if (numel(list) < x) & (numel(list) < y) 

सूचना मैं कुछ जोड़ा फ़ाइल के नीचे टिप्पणियों में परीक्षण मामलों। जब मैं अपने आप पर इस कोड को चलाने के लिए, मैं इस मिल:

>> check_code('check_code.m') 
Line 28: Potential incorrect use of NUMEL in logical statement. 
Line 31: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 

सूचना है कि एक संदेश पहले, चौथे और छठे परीक्षण मामलों है कि छठे टेस्ट केस के लिए दो बार अपने गलत कोड से मेल खाते हैं (के लिए सूचीबद्ध किया गया है, वहाँ के बाद से उस रेखा पर दो त्रुटियां हैं)।

क्या यह सभी संभावित स्थितियों के लिए काम करेगा? मैं नहीं मानूंगा। अतिरिक्त परिस्थितियों को संभालने के लिए आपको रेगेक्स पैटर्न की जटिलता में वृद्धि करना होगा। लेकिन कम से कम यह कोड को पार्स करते समय आपको जिन चीजों पर विचार करना है, उनके उदाहरण के रूप में कार्य कर सकते हैं।

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