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 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм ред рдХреГрдкрдпрд╛ рд╕реВрдЪреА рджреЗрдЦреЗрдВред




All Articles