PVS-Studio OpenMW की जाँच करता है: Morrowind ब्रह्मांड में सब कुछ आसानी से नहीं चल रहा है


मैंने PVM- स्टूडियो के साथ OpenMW परियोजना का परीक्षण किया और इस छोटे लेख को लिखा। बहुत कम त्रुटियां थीं। लेकिन मुझे इस परियोजना के सत्यापन के बारे में एक लेख लिखने के लिए कहा गया था, और यहाँ यह है।

OpenMW


OpenMW लोकप्रिय आरपीजी मॉरोविंड को फिर से बनाने का एक प्रयास है, जो एक ओपन सोर्स गेम की सभी विशेषताओं का एक पूर्ण कार्यान्वयन है। OpenMW को चलाने के लिए आपको मूल Morrowind डिस्क की आवश्यकता होगी।

स्रोत कोड यहां उपलब्ध है: https://code.google.com/p/openmw/

संदिग्ध स्थान मिले


टुकड़े टुकड़े करना N १
std::string getUtf8(unsigned char c, ToUTF8::Utf8Encoder& encoder, ToUTF8::FromType encoding) { .... conv[0xa2] = 0xf3; conv[0xa3] = 0xbf; conv[0xa4] = 0x0; conv[0xe1] = 0x8c; conv[0xe1] = 0x8c; <<<<==== conv[0xe3] = 0x0; .... } 

PVS- स्टूडियो चेतावनी: V519 'कनव [0xe1]' चर को क्रमिक रूप से दो बार मान दिया गया है। शायद यह एक गलती है। जाँच लाइनें: 103, 104. openmw fontloader.cpp 104

यह शायद एक टाइपो है। हाइलाइट की गई रेखा में, सूचकांक 0xe2 का सबसे अधिक उपयोग किया जाना चाहिए।

टुकड़ा करना N2
 enum Flags { .... NoDuration = 0x4, .... } bool CastSpell::cast (const ESM::Ingredient* ingredient) { .... if (!magicEffect->mData.mFlags & ESM::MagicEffect::NoDuration) .... } 

PVS-Studio चेतावनी: V564 'और' ऑपरेटर को बूल प्रकार के मूल्य पर लागू किया जाता है। आप शायद कोष्ठकों को शामिल करना भूल गए हैं या '&&' ऑपरेटर का उपयोग करना चाहते हैं। openmw स्पेलकास्टिंग .pp 717

त्रुटि संचालन की प्राथमिकता से संबंधित है। शुरुआत में, कार्रवाई (! MagicEffect-> mData.mFlags) निष्पादित की जाती है। परिणाम: 0 या 1. तब कार्रवाई की जाती है: 0 और 4 या 1 & 4. यह कोई व्यावहारिक अर्थ नहीं है। सबसे अधिक संभावना है, कोड इस तरह दिखना चाहिए:
 if ( ! (magicEffect->mData.mFlags & ESM::MagicEffect::NoDuration) ) 

टुकड़ा करना N3
 void Clothing::blank() { mData.mType = 0; mData.mWeight = 0; mData.mValue = 0; mData.mEnchant = 0; mParts.mParts.clear(); mName.clear(); mModel.clear(); mIcon.clear(); mIcon.clear(); mEnchant.clear(); mScript.clear(); } 

PVS-Studio चेतावनी: V586 'स्पष्ट' फ़ंक्शन को एक ही संसाधन से निपटने के लिए दो बार कहा जाता है। जाँच लाइनें: 48, 49. घटक loadclot.cpp 49

MIcon ऑब्जेक्ट को दो बार साफ़ किया जाता है। दूसरी सफाई अनावश्यक है या कुछ और सफाई करनी थी।

टुकड़ा करना N4
 void Storage::loadDataFromStream( ContainerType& container, std::istream& stream) { std::string line; while (!stream.eof()) { std::getline( stream, line ); .... } .... } 

PVS-Studio चेतावनी: V663 अनंत लूप संभव है। लूप से टूटने के लिए 'Cin.eof ()' स्थिति अपर्याप्त है। सशर्त अभिव्यक्ति के लिए 'cin.fail ()' फ़ंक्शन कॉल जोड़ने पर विचार करें। घटक अनुवाद। सीसी 45

जब क्लास 'std :: istream' के साथ काम करते हैं, तो लूप को समाप्त करने के लिए फ़ंक्शन 'eof ()' को कॉल करना पर्याप्त नहीं है। डेटा पढ़ते समय विफलता की स्थिति में, 'ईओफ़ ()' फ़ंक्शन को कॉल करने से मान हमेशा 'गलत' वापस आएगा। इस मामले में लूप को पूरा करने के लिए, फ़ंक्शन 'फेल ()' द्वारा लौटाए गए मान की एक अतिरिक्त जांच आवश्यक है।

टुकड़े करना N5
 class Factory { .... bool getReadSourceCache() { return mReadSourceCache; } bool getWriteSourceCache() { return mReadSourceCache; } .... bool mReadSourceCache; bool mWriteSourceCache; .... }; 

PVS-Studio चेतावनी: V524 यह अजीब है कि 'getWriteSourceCache' फ़ंक्शन का शरीर 'getReadSourceCache' फ़ंक्शन के शरीर के समतुल्य है। घटकों का कारखाना। Shpp 209

यह मुझे लगता है कि getWriteSourceCache () फ़ंक्शन इस तरह होना चाहिए:
 bool getWriteSourceCache() { return mWriteSourceCache; } 

खंडन N6, N7, N8
 std::string rangeTypeLabel(int idx) { const char* rangeTypeLabels [] = { "Self", "Touch", "Target" }; if (idx >= 0 && idx <= 3) return rangeTypeLabels[idx]; else return "Invalid"; } 

PVS- स्टूडियो चेतावनी: V557 ऐरे ओवररन संभव है। 'Idx' इंडेक्स का मान 3. esmtool label.cpp 502 तक पहुंच सकता है

गलत एरे इंडेक्स चेक। यदि चर 'idx' 3 के बराबर है, तो सरणी पार हो जाएगी।

सही:
 if (idx >= 0 && idx < 3) 

इसी तरह की स्थिति दो और स्थानों पर हुई:
टुकड़े टुकड़े करना N9
 enum UpperBodyCharacterState { UpperCharState_Nothing, UpperCharState_EquipingWeap, UpperCharState_UnEquipingWeap, .... }; bool CharacterController::updateWeaponState() { .... if((weaptype != WeapType_None || UpperCharState_UnEquipingWeap) && animPlaying) .... } 

PVS-Studio चेतावनी: V560 सशर्त अभिव्यक्ति का एक हिस्सा हमेशा सही होता है: UpperCharState_UnEquipingWeap। openmw character.cpp 949

यह हालत बहुत संदिग्ध है। अब इसे सरल किया जा सकता है: "अगर (एनिमप्लिंग)"। जाहिर है कुछ गलत है।

फ्रैगमेंट एन 10, एन 11
 void World::clear() { mLocalScripts.clear(); mPlayer->clear(); .... if (mPlayer) .... } 

PVS-Studio चेतावनी: V595 'mPlayer' पॉइंटर को nullptr के खिलाफ सत्यापित होने से पहले उपयोग किया गया था। चेक लाइन्स: 234, 245. ओपनमव वल्र्डइम्प.कैप 234

इसी तरह: V595 'mBody' पॉइंटर को nullptr के खिलाफ सत्यापित होने से पहले उपयोग किया गया था। चेक लाइनें: 95, 99. ओपनमॉ फिजिक.कैप 95

विखंडन N12
 void ExprParser::replaceBinaryOperands() { .... if (t1==t2) mOperands.push_back (t1); else if (t1=='f' || t2=='f') mOperands.push_back ('f'); else std::logic_error ("failed to determine result operand type"); } 

PVS-Studio चेतावनी: V596 ऑब्जेक्ट बनाया गया था, लेकिन इसका उपयोग नहीं किया जा रहा है। 'थ्रो' कीवर्ड गायब हो सकता है: थ्रू लॉजिक_रोर (FOO); घटकों exprparser.cpp 101

कीवर्ड 'थ्रो' को भूल गए। कोड इस तरह होना चाहिए:
 throw std::logic_error ("failed to determine result operand type"); 

निष्कर्ष


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

यह लेख अंग्रेजी में है।


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

क्या आपने लेख पढ़ा है और एक प्रश्न है?
अक्सर हमारे लेखों से वही प्रश्न पूछे जाते हैं। हमने यहां उनके उत्तर एकत्र किए हैं: पीवीएस-स्टूडियो और कैप्पकैट, संस्करण 2014 के बारे में लेखों के पाठकों के सवालों के जवाब । कृपया सूची देखें।

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


All Articles