
Source SDK-Valve Corporationã«ãã£ãŠéçºãããããœãŒã¹ãšã³ãžã³ã®å€æŽãäœæããããã®ãŠãŒãã£ãªãã£ã®ã»ããã ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯ã2013幎ã®çµããã«ããŠã³ããŒãããã³æ€èšŒãããŸããã 幎æ«å¹Žå§ã«ãç§ã¯æ€æ»ã®çµæã«é¢ããèšäºãæžãã€ããã§ããã ããããæ ã¯åµé æ§ã«åã¡ãä»äºã«æ»ã£ããšãã ãèšäºãæžãå§ããŸããã ãã ãããã®æéäžã«ãœãŒã¹ã³ãŒããå€æŽãããå¯èœæ§ã¯äœããšæããŸãã PVS-Studioã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠèŠã€ããçãããå Žæãããç解ããããšããå§ãããŸãã
ãœãŒã¹SDKãšã¯
ãŠã£ãããã£ã¢ãããããžã§ã¯ãã®
説æãåããïŒ
Source SDK ïŒãœãããŠã§ã¢éçºãããïŒã¯ããœãŒã¹ãšã³ãžã³ã§å€æŽãäœæããããã®ãŠãŒãã£ãªãã£ã»ããã§ããValveã¯ãValveããSourceã²ãŒã ã賌å
¥ãããã¹ãŠã®ãã¬ã€ã€ãŒã«Steamãããã¯ãŒã¯ãä»ããŠç¡æã§é
åžããŸãã ãã®ã»ããã䜿çšãããšã15ããŒãžã§ã³ãšæŽæ°ããã7ããŒãžã§ã³ã®ãšã³ãžã³ã®2ã€ã®ããŒãžã§ã³ã§ããããç·šéã§ããŸãïŒHalf-Life 2ã§äœ¿çšããããšã³ãžã³ã®å€ãããŒãžã§ã³ã¯ãæ°ããããŒãžã§ã³ãšã®äºææ§ã®ãã䜿çšãããŸããïŒã
ãããžã§ã¯ããµã€ãïŒ
http :
//source.valvesoftware.com/sourcesdk.phpãã®ãããžã§ã¯ãã¯ååã«å€§ããããããããžã§ã¯ãã®æ¬ ç¹ãåžžã«ç¹å®ã§ããããšã¯é©ãããšã§ã¯ãããŸããã åæã¯
PVS-StudioããŒã«ã䜿çšããŠå®è¡ãããŸããã
çãããè¡šçŸ
å€æ°ãèªåèªèº«ã«åå²ãã
static void DrawPyroVignette(....) { .... Vector2D vMaxSize( ( float )nScreenWidth / ( float )nScreenWidth / NUM_PYRO_SEGMENTS * 2.0f, ( float )nScreenHeight / ( float )nScreenHeight / NUM_PYRO_SEGMENTS * 2.0f ); .... }
PVS-Studioã¯ãèŠå
V501ã次ã®ãã¡ã€ã«ã«çºè¡ããŸãïŒviewpostprocess.cpp 1888
ããã«æ³šæããŠãã ããïŒ
- ïŒãããŒãïŒnScreenWidth /ïŒãããŒãïŒnScreenWidth
- ïŒãããŒãïŒnScreenHeight /ïŒãããŒãïŒnScreenHeight
ãããã¯éåžžã«çãããè¡šçŸã§ãã ããã«äœãæžãã¹ãããèšãã®ã¯é£ãããšæããŸãããã»ãšãã©ã®å Žåãä»ã®äœããèšããŸãã
IsJoystickPOVCodeïŒïŒé¢æ°ã®äºéåŒã³åºã
void TextEntry::OnKeyCodePressed(KeyCode code) { .... if ( IsMouseCode(code) || IsNovintButtonCode(code) || IsJoystickCode(code) || IsJoystickButtonCode(code) || IsJoystickPOVCode(code) || IsJoystickPOVCode(code) || IsJoystickAxisCode(code) ) .... }
PVS-Studioã¯ãèŠå
V501ã次ã®ãã¡ã€ã«ã«çºè¡ããŸãïŒtextentry.cpp 1639
é¢æ° 'IsJoystickPOVCodeïŒcodeïŒ'ã2ååŒã³åºãããŸãã 2çªç®ã®åŒã³åºãã¯åé·ã§ããããå¥ã®é¢æ°ãåŒã³åºãããŠããå¿
èŠããããŸãã
åžžã«åœã®ç¶æ
unsigned numbounce = 100; int ParseCommandLine( int argc, char **argv, bool *onlydetail ) { .... numbounce = atoi (argv[i]); if ( numbounce < 0 ) { Warning( "Error: expected non-negative value after '-bounce'\n"); return 1; } .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«
V547èŠåãçºè¡ããŸãïŒvrad.cpp 2412ã
æ¡ä»¶ãnumbounce <0ããæºããããããšã¯ãããŸããã 笊å·ãªãå€æ°ã¯ãŒãããå°ããããããšã¯ã§ããŸããã
å¥åŠãªæååæ¯èŒ
void CMultiplayRules::DeathNotice( .... ) { .... else if ( strncmp( killer_weapon_name, "NPC_", 8 ) == 0 ) .... }
PVS-Studioã¯ããã¡ã€ã«
multiplay_gamerules.cpp 860ã«å¯ŸããŠ
V666èŠåãçºè¡ããŸãã
ç§ãç解ããŠããããã«ã圌ãã¯æŠåšã®ååãæåãNPC_ãã§å§ãŸãããšã確èªãããã£ãã®ã§ãã ãããããã®ã³ãŒãã«ã¯ã¿ã€ããã¹ãå«ãŸããŠããŸãã ããããæ£ãããªãã·ã§ã³ã¯ããã§ãïŒ
else if ( strncmp( killer_weapon_name, "NPC_", 4 ) == 0 )
é
åãæäœãããšãã®ãšã©ãŒ
é
åã®ãµã€ãºãæ£ãããããŸãã
#define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0])) #define _ARRAYSIZE(A) RTL_NUMBER_OF_V1(A) int GetAllNeighbors( const CCoreDispInfo *pDisp, int iNeighbors[512] ) { .... if ( nNeighbors < _ARRAYSIZE( iNeighbors ) ) iNeighbors[nNeighbors++] = pCorner->m_Neighbors[i]; .... }
PVS-Studioã¯ã
V511èŠåã次ã®ãã¡ã€ã«ã«çºè¡ããŸãïŒdisp_vrad.cpp 60
æ£åŒãªåŒæ°ãint iNeighbors [512]ãã¯é
åã§ã¯ãããŸããã ããã¯åãªããã€ã³ã¿ã§ãã æ°å€ã512ãã¯ããããããã€ã³ã¿ãŒã512èŠçŽ ã®é
åãæããŠããããšãããã°ã©ããŒã«äŒããŸãã ãããããã以äžã§ã¯ãããŸããã ãsizeofïŒiNeighborsïŒããšããè¡šçŸã¯éæ³ã§ãã é
åã®ãµã€ãºã§ã¯ãªãããã€ã³ã¿ãŒã®ãµã€ãºãè¿ããŸãã ã€ãŸããåŒãsizeofïŒiNeighborsïŒãã¯ãsizeofïŒvoid *ïŒãã«çãããªããŸãã
ãã®ãšã©ãŒã¯ãããå®å
šãªãã¯ãã䜿çšããããšã§åé¿ã§ããŸããã ããšãã°ãããïŒ
template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array)))
ãã€ã³ã¿ãŒã®ãµã€ãºãèšç®ããããšãããšãã³ã³ãã€ã«æ®µéã§ãšã©ãŒãçºçããŸãã ãã®ãããªãã¯ãã¯ãChromiumãããžã§ã¯ãã§äœ¿çšãããŸãã ãã®éæ³ã®æ§é ã®è©³çŽ°ã«ã€ããŠã¯ãã
PVS-Studio vs Chromium ãã®èšäºãã芧ãã ããã
æååã®é·ãã®èª€ã£ãå®çŸ©
typedef struct message_s { .... char *text; .... } message_t; int CMessageCharsPanel::AddText(....) { .... msg->text = new char[ Q_strlen( data ) + 1 ]; Assert( msg->text ); Q_strncpy( msg->text, data, sizeof( msg->text ) ); .... }
PVS-Studioã¯æ¬¡ã®ãã¡ã€ã«ã«èŠå
V579ãçºè¡ããŸãïŒvgui_messagechars.cpp 240
åŒãsizeofïŒmsg-> textïŒãã¯ãæååã®é·ãã§ã¯ãªãããã€ã³ã¿ãŒã®ãµã€ãºãèšç®ããŸãã ã»ãšãã©ã®å Žåãããã«æžã蟌ãå¿
èŠããããŸããQ_strcpyïŒmsg-> textãdataïŒ;
ç Žå£ãããé
åãæäœãã
static Activity DetermineExpressionMoveActivity( CChoreoEvent *event, CAI_BaseNPC *pNPC ) { .... const char *pszAct = Q_strstr( sParam2, " " ); if ( pszAct ) { char szActName[256]; Q_strncpy( szActName, sParam2, sizeof(szActName) ); szActName[ (pszAct-sParam2) ] = '\0'; pszAct = szActName; } .... }
PVS-Studioã¯æ¬¡ã®ãã¡ã€ã«ã«èŠå
V507ãçºè¡ããŸãïŒbaseflex.cpp 1326
äžæé
åã®ã¢ãã¬ã¹ã¯å€æ°ãpszActãã«é
眮ãããŸãã ãã®é
åã¯ç Žæ£ãããããããpszActãã«å«ãŸããã¢ãã¬ã¹ã䜿çšããããšã¯ã§ããŸããã ãã ããå®éã«ã¯ããã®ã³ãŒãã¯æ©èœããå¯èœæ§ããããã³ãŒãã®æ£ç¢ºæ§ã®èª€ã£ãå€èŠ³ãäœæããŸãã äžæé
å 'szActName'ã«ãã£ãŠå æãããŠããã¡ã¢ãªé åã¯ãã以äžäœ¿çšãããªãå¯èœæ§ãéåžžã«é«ããªããŸãã ãã®çµæãããã°ã©ã ã¯ããã°ã©ããæåŸ
ãããšããã«åäœããŸãã ããããããã¯éã§ããããã以äžã®ãã®ã§ã¯ãããŸããã
æµ·å€ã«è¡ã
#define MAX_WEAPON_SLOTS 6
PVS-Studioã¯æ¬¡ã®ãã¡ã€ã«ã«èŠå
V557ãçºè¡ããŸãïŒhud_weaponselection.cpp 632ã633ã
ã«ãŒãã«ãŠã³ã¿ãŒã¯0ã6ã®å€ãåããŸãããã ããxModifiersããã³yModifiersé
åã«ã¯4ã€ã®èŠçŽ ããå«ãŸããŠããŸããã ãã®çµæãé
åã®ãªãŒããŒãããŒãçºçããŸãã
æ°ãããªãã¬ãŒã¿ãŒã®å±éºãªäœ¿çšã
ç¡æå³ãªãã§ãã¯
void EmitDispLMAlphaAndNeighbors() { .... CCoreDispInfo *pDisp = new CCoreDispInfo; if ( !pDisp ) { g_CoreDispInfos.Purge(); return; } .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«å¯ŸããŠèŠå
V668ãçºè¡ããŸãïŒdisp_vbsp.cpp 532ã
ãCCoreDispInfoãã¿ã€ãã®ãªããžã§ã¯ããäœæã§ããªãå Žåãg_CoreDispInfos.PurgeïŒïŒé¢æ°ãåŒã³åºãå¿
èŠããããŸãã ãã ãããã®é¢æ°ã¯åŒã³åºãããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒãçºçãããšãäŸå€std :: bad_allocãã¹ããŒãããŸãã ãã®ã³ãŒãã¯éæšå¥šã§ããããnewãæŒç®åã®åäœã®å€æŽãåæ ããããã«å€æŽããå¿
èŠããããŸãã
ãnewãæŒç®åãè¿ãããããšã確èªãããä»ã®å Žæã¯ãä»é²ã®èšäºã®æåŸã«èšèŒãããŠããŸãã
ãã¹ãã©ã¯ã¿ã®æ°ããæŒç®å
CNewParticleEffect::~CNewParticleEffect(void) { .... KeyValues *msg = new KeyValues( "ParticleSystem_Destroy" ); .... }
PVS-Studioã¯æ¬¡ã®ãã¡ã€ã«ã«
V509èŠåãçºè¡ããŸãïŒparticles_new.cpp 92ã
äŸå€ã«ã€ãªããå¯èœæ§ã®ãããã¹ãã©ã¯ã¿ã§æ§é ã䜿çšããããšã¯å±éºã§ãã ããã¯ãŸãã«ãæ°ãããæŒç®åã®æ§ç¯ã§ãã ã¡ã¢ãªå²ãåœãŠãšã©ãŒãçºçããå ŽåãäŸå€ãã¹ããŒããŸãã
å±éºã«ã€ããŠèª¬æããŸãã ããã°ã©ã ã§äŸå€ãçºçãããšãã¹ã¿ãã¯ã®æãããã¿ãéå§ããããã®éããã¹ãã©ã¯ã¿ãåŒã³åºãããšã«ãããªããžã§ã¯ããç Žæ£ãããŸãã ã¹ã¿ãã¯ã厩å£ãããšãã«ç Žå£ããããªããžã§ã¯ãã®ãã¹ãã©ã¯ã¿ãå¥ã®äŸå€ãã¹ããŒãããã¹ãã©ã¯ã¿ããã®äŸå€ãæ®ããšãC ++ã©ã€ãã©ãªã¯terminateïŒïŒé¢æ°ãåŒã³åºããŠããã°ã©ã ãããã«ã¯ã©ãã·ã¥ãããŸãã
ã¿ã€ããã¹
ãã¹ããããã«ãŒãã®ãšã©ãŒ
void DrawTeslaSegs(....) { int i; .... for ( i = 0; i < segments; i++ ) { .... for ( int j = 0; i < iBranches; j++ ) { curSeg.m_flWidth *= 0.5; } .... } .... }
PVS-Studioã¯ããã¡ã€ã«beamdraw.cpp 592ã«å¯ŸããŠ
V534èŠåãçºè¡ããŸãã
2çªç®ã®ãµã€ã¯ã«ã«æ³šæããŠãã ããã
for ( int j = 0; i < iBranches; j++ )
ãã¹ããããã«ãŒããå®äºããããã®æ¡ä»¶ã§ã¯ãå€æ°ãiãã䜿çšãããŸããããã¯å€åŽã®ã«ãŒããæããŸãã ç§ãã¡ã¯ã¿ã€ããã¹ãæ±ã£ãŠãããšãã匷ãçãããããŸãã
誀ã£ãåæå
inline void SetX( float val ); inline void SetY( float val ); inline void SetZ( float val ); inline void SetW( float val ); inline void Init( float ix=0, float iy=0, float iz=0, float iw = 0 ) { SetX( ix ); SetY( iy ); SetZ( iz ); SetZ( iw ); }
PVS-Studioã¯æ¬¡ã®ãã¡ã€ã«ã«
V525èŠåãçºè¡ããŸãïŒnetworkvar.h 455ã
ç§ã«ã¯ãé¢æ°ã¯æ¬¡ã®ããã«æžãããŠããã¯ãã§ãïŒ
{ SetX( ix ); SetY( iy ); SetZ( iz ); SetW( iw ); }
æåŸã®é¢æ°åŒã³åºãã«æ³šæããŠãã ããã
ã³ããŒããŒã¹ãã®çµæ
class ALIGN16 FourVectors { public: fltx4 x, y, z; .... }; FourVectors BackgroundColor; void RayTracingEnvironment::RenderScene(....) { .... intens.x=OrSIMD(AndSIMD(BackgroundColor.x,no_hit_mask), AndNotSIMD(no_hit_mask,intens.x)); intens.y=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask), AndNotSIMD(no_hit_mask,intens.y)); intens.z=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask), AndNotSIMD(no_hit_mask,intens.z)); .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«å¯ŸããŠèŠå
V537ãçºè¡ããŸãïŒtrace2.cpp 189ã
ã»ãšãã©ã®å Žåããã®ã³ãŒãã¯ã³ããŒããŒã¹ãã䜿çšããŠèšè¿°ãããŠããŸãã æåã®è¡ã§ã¯ããxããšããååã®ã¯ã©ã¹ã®ã¡ã³ããŒã䜿çšããŠããŸãã 2çªç®ã®ååã¯ãyãã§ãã ãããŠã3çªç®ã«ã¯ãzããšãyãã®äž¡æ¹ããããŸãã ã»ãšãã©ã®å Žåãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
intens.z=OrSIMD(AndSIMD(BackgroundColor.z,no_hit_mask), AndNotSIMD(no_hit_mask,intens.z));
1ã€ã®å€æ°ã«ç°ãªãå€ãå²ãåœãŠã
void GetFPSColor( int nFps, unsigned char ucColor[3] ) { .... int nFPSThreshold1 = 20; int nFPSThreshold2 = 15; if (IsPC() && g_pMaterialSystemHardwareConfig->GetDXSupportLevel() >= 95) { nFPSThreshold1 = 60; nFPSThreshold1 = 50; } .... }
PVS-Studioã¯ãvgui_fpspanel.cpp 192ãã¡ã€ã«ã«å¯ŸããŠ
V519èŠåãçºè¡ããŸãã
ã©ããããæžãããŠããå¿
èŠããããŸãïŒ
nFPSThreshold1 = 60; nFPSThreshold2 = 50;
æªãã³ã³ã¹ãã©ã¯ã¿
CAI_ShotRegulator::CAI_ShotRegulator() : m_nMinBurstShots(1), m_nMaxBurstShots(1) { m_flMinRestInterval = 0.0f; m_flMinRestInterval = 0.0f; m_flMinBurstInterval = 0.0f; m_flMaxBurstInterval = 0.0f; m_flNextShotTime = -1; m_nBurstShotsRemaining = 1; m_bInRestInterval = false; m_bDisabled = false; }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«
V519èŠåãçºè¡ããŸãïŒai_utils.cpp 49ã
åã³ã¿ã€ããã¹ãããã«ããïŒ
- å€æ°m_flMinRestIntervalã¯2åãŒãã«èšå®ãããŸãã
- å€æ°m_flMaxRestIntervalã¯åæåãããŸããã
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒCEnvTonemapControllerãCBasePlayerAnimStateã«ãåæ§ã®åé¡ããããŸãã ããããåæ§ã®äŸã説æããã®ã¯éå±ãªã®ã§ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ãããã®ãå
¥ããŸãïŒèšäºã®æåŸãåç
§ïŒã
æªå®çŸ©ã®åäœ
è€ååŒ
int m_nNewSequenceParity; int m_nResetEventsParity; void C_BaseAnimating::ResetSequenceInfo( void ) { .... m_nNewSequenceParity = ( ++m_nNewSequenceParity ) & EF_PARITY_MASK; m_nResetEventsParity = ( ++m_nResetEventsParity ) & EF_PARITY_MASK; .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«å¯ŸããŠèŠå
V567ãçºè¡ããŸãïŒc_baseanimating.cpp 5301ã5302ã
ããã§æªå®çŸ©ã®åäœãçºçããå€æ°ãm_nResetEventsParityãã®å€ãäºæž¬ã§ããªãçç±ã¯ãããã¥ã¡ã³ãã«è©³ãã
説æãããŠããŸãã 説æã«ã¯éåžžã«ãã䌌ãã³ãŒãã®äŸããããŸãã
ã·ãã
inline void SetStyleType( int w, int h, int type ) { Assert( type < NUM_EDGE_STYLES ); Assert( type >= 0 );
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«
V610èŠåãçºè¡ããŸãïŒc_func_breakablesurf.cpp 157ã
è² ã®æ°ãã·ãããããšãæªå®çŸ©ã®åäœãçºçããŸãã ãã®ã³ãŒãã§ã¯ãè² ã®æ°ã¯ãã0x03ãã§ãã ãã詳ããã¯ãã
ãã©ãŒããç¥ããªãã§ãæ°Žã«å
¥ããªãã§ãã ãããããŒã3 ã
ãšããèšäºã§ãã§ã«æ€èšããè² ã®æ°ã®ã·ããã®åé¡ã§ãã
ä»®æ³ãã¹ãã©ã¯ã¿ããããŸãã
class CFlashlightEffect { .... ~CFlashlightEffect(); .... }; class CHeadlightEffect : public CFlashlightEffect { .... }; CFlashlightEffect *m_pFlashlight; C_BasePlayer::~C_BasePlayer() { .... delete m_pFlashlight; }
PVS-Studioã¯ããã¡ã€ã«c_baseplayer.cpp 454ã«å¯ŸããŠ
V599èŠåãçºè¡ããŸãã
ã¯ã©ã¹CFlashlightEffectããããŸãã ä»®æ³ãã¹ãã©ã¯ã¿ã¯ãããŸããã ãã ããCHeadlightEffectã¯ã©ã¹ã¯ãã®ã¯ã©ã¹ããç¶æ¿ãããŸãã ããããçããçµæã¯ç解ã§ãããšæããŸãã
çãããç®è¡
ãã®ãããžã§ã¯ãã«ã¯ãæŽæ°åãšæµ®åå°æ°ç¹åãå¥åŠã«çµã¿åããããå ŽæããããããããŸãã äžéšã®èšç®ã¯ååã«æ£ç¢ºã§ã¯ãªããããŸã£ããæå³ããªããªãããšãçãããŠããŸãã 以äžã«3ã€ã®äŸã瀺ããŸãã æ®ãã®äžå¯©ãªå Žæã¯ã¢ããªã«ãªã¹ããããŸãã
æåã®äžå¯©ãªãã©ã°ã¡ã³ã
void TE_BloodStream(....) { .... int speedCopy = amount; .... speedCopy -= 0.00001;
PVS-Studioã¯ããã¡ã€ã«c_te_bloodstream.cpp 141ã«å¯ŸããŠ
V674èŠåãçºè¡ããŸãã
'int'åã®å€æ°ãã0.00001ãæžç®ããããšã¯éåžžã«çãããã§ãã
2çªç®ã®äžå¯©ãªãã©ã°ã¡ã³ã
#define ON_EPSILON 0.1 void CPrediction::SetIdealPitch (....) { int step; .... step = floor_height[j] - floor_height[j-1]; if (step > -ON_EPSILON && step < ON_EPSILON) continue; .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«å¯ŸããŠèŠå
V674ãçºè¡ããŸãïŒ
predict.cpp 977ã
å€æ°ã¿ã€ããstepãã¯ããŸãé©åã«éžæãããŠããŸããã
3çªç®ã®çããããã©ã°ã¡ã³ã
virtual int GetMappingWidth( ) = 0; virtual int GetMappingHeight( ) = 0; void CDetailObjectSystem::LevelInitPreEntity() { .... float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight(); .... }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«
V636èŠåãçºè¡ããŸãïŒdetailobjectsystem.cpp 1480ã
ãããããå€æ° 'flRatio'ã®å€ãããæ£ç¢ºã«èšç®ããã®ãçã«ããªã£ãŠããŸãã 粟床ãäœãçç±ã¯æŽæ°é€ç®ã§ãã 粟床ãé«ããããã«ããããæžãããšãã§ããŸãïŒ
float flRatio = static_cast<float>(pMat->GetMappingWidth()) / pMat->GetMappingHeight();
éå€
åã®æ··ä¹±
enum PhysGunPickup_t { PICKED_UP_BY_CANNON, PUNTED_BY_CANNON, PICKED_UP_BY_PLAYER, }; enum PhysGunDrop_t { DROPPED_BY_PLAYER, THROWN_BY_PLAYER, DROPPED_BY_CANNON, LAUNCHED_BY_CANNON, }; void CBreakableProp::OnPhysGunDrop(...., PhysGunDrop_t Reason) { .... if( Reason == PUNTED_BY_CANNON ) { PlayPuntSound(); } .... }
PVS-Studioã¯ãprops.cpp 1520ãã¡ã€ã«ã«å¯ŸããŠèŠå
V556ãçºè¡ããŸãã
å€æ°ãReasonãã®ã¿ã€ãã¯PhysGunDrop_tã§ãã ãŸãããPUNTED_BY_CANNONãã¯ãPhysGunPickup_tããæããŸãã
æœåšçã«å±éºãªfprintf
static void Exit(const char *msg) { fprintf( stderr, msg ); Pause(); exit( -1 ); }
PVS-Studioã¯ã次ã®ãã¡ã€ã«ã«
V618èŠåãçºè¡ããŸãïŒvice.cpp 52ã
é¢æ° 'fprintfïŒïŒ'ã¯éåžžã«æ£ããåäœããå¯èœæ§ããããŸãã ãã ããæœåšçã«å±éºã§ãã å¶åŸ¡æåã誀ã£ãŠãŸãã¯æå³çã«æååãmsgãã«å«ãŸããŠããå Žåãçµæã¯äºæž¬ã§ããŸããã
ãã®ããŒãã«é¢ããèå³æ·±ãã¡ã¢ïŒã
ãã©ãŒããç¥ããªãã§ãæ°Žã«å
¥ããªãã§ãã ãããããŒã2ã ã
ã³ãŒãã®å®å
šãªããŒãžã§ã³ïŒ
fprintf( stderr, "%s", msg );
ã¢ããª
ç§ã®æèŠã§ã¯ã泚ç®ã«å€ãããã®ä»ã®PVS-StudioèŠåã¯ããã¡ã€ã«ã«ãªã¹ããããŸãã ãã ãããã®ãªã¹ãã«å®å
šã«äŸåããªãã§ãã ããã ç§ã¯è¡šé¢çã«ãããžã§ã¯ããèŠãŠãããŸã泚æãæãããšãã§ããŸããã§ããã ããã«ãéç解æã®æ¬åœã®å©ç¹ã¯ããããžã§ã¯ãã®1åéãã®æ€èšŒã§ã¯ãªããå®æçã«äœ¿çšããããšã§ãã
ä»ã®äžå¯©ãªå Žæã®ãªã¹ãïŒ
source-sdk-addition-log.txtãããã«
ãã®èšäºãèªè
ã«ãšã£ãŠèå³æ·±ããã®ã§ãããSource SDKãããžã§ã¯ãã®éçºè
ã«ãšã£ãŠæçã§ããããšãé¡ã£ãŠããŸãã