मैंने 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)
इसी तरह की स्थिति दो और स्थानों पर हुई:
- V557 ऐरे ओवररन संभव है। 'Idx' इंडेक्स का मान 143 तक पहुंच सकता है। esmtool लेबल.cpp 391
- V557 ऐरे ओवररन संभव है। 'Idx' इंडेक्स का मान 27 तक पहुंच सकता है। esmtool लेबल.cpp 475
टुकड़े टुकड़े करना 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");
निष्कर्ष
पीवीएस-स्टूडियो के अधिग्रहण और विकास प्रक्रिया में इस उपकरण की शुरुआत से विकास प्रक्रिया में तेजी आएगी, एक प्रारंभिक चरण में त्रुटियों का पता लगाया जाएगा और, परिणामस्वरूप, परियोजना को बेहतर बना सकते हैं।
यह लेख अंग्रेजी में है।
यदि आप इस लेख को अंग्रेजी बोलने वाले दर्शकों के साथ साझा करना चाहते हैं, तो कृपया अनुवाद के लिंक का उपयोग करें: एंड्री कारपोव।
पीवीएस-स्टूडियो चेक ओपनएमडब्ल्यू: मोरोविंड यूनिवर्स में सभी ठीक नहीं है ।