SlideShare a Scribd company logo
1 of 13
Download to read offline
A Spin-off: CryEngine 3 SDK Checked 
with CppCat 
Author: Andrey Karpov 
Date: 10.03.2014 
We have finished a large comparison of the static code analyzers CppCat, Cppcheck, PVS-Studio and 
Visual Studio 2013's built-in analyzer. In the course of this investigation, we checked over 10 open-source 
projects. Some of them do deserve to be discussed specially. In today's article, I'll tell you about 
the results of the check of the CryEngine 3 SDK project. 
CryEngine 3 SDK 
Wikipedia: CryEngine 3 SDK is a toolset for developing computer games on the CryEngine 3 game 
engine. CryEngine 3 SDK is developed and maintained by German company Crytek, the developer of the 
original engine CyrEngine 3. CryEngine 3 SDK is a proprietary freeware development toolset anyone can 
use for non-commercial game development. For commercial game development exploiting CryEngine 3, 
developers have to pay royalties to Crytek. 
CppCat 
Let's see if CppCat has found any interesting bugs in this library. 
Why CppCat and not PVS-Studio? Just for a change. We want everyone to see that CppCat is almost in 
no way inferior to PVS-Studio in the area of general static analysis. 
True, PVS-Studio catches a bit more bugs if you turn on the 3-rd severity level diagnostics. But I wouldn't 
call these defects crucial. For example: 
static void GetNameForFile( 
const char* baseFileName,
const uint32 fileIdx, 
char outputName[512] ) 
{ 
assert(baseFileName != NULL); 
sprintf( outputName, "%s_%d", baseFileName, fileIdx ); 
} 
V576 Incorrect format. Consider checking the fourth actual argument of the 'sprintf' function. The 
SIGNED integer type argument is expected. igame.h 66 
From the formal viewpoint, the programmer should have used "%u" to print the unsigned variable 
'fileIdx'. But I'm very doubtful that this variable will ever reach a value larger than INT_MAX. So this 
error will not cause any severe consequences. 
To learn more about the differences between CppCat and PVS-Studio, see the article "An Alternative to 
PVS-Studio at $250". 
Analysis results 
My brief comment on the analysis results is, developers should use static analysis. There will be much 
fewer bugs in programs and I will drop writing articles like this one. 
Double check 
void CVehicleMovementArcadeWheeled::InternalPhysicsTick(float dt) 
{ 
.... 
if (fabsf(m_movementAction.rotateYaw)>0.05f || 
vel.GetLengthSquared()>0.001f || 
m_chassis.vel.GetLengthSquared()>0.001f || 
angVel.GetLengthSquared()>0.001f || 
angVel.GetLengthSquared()>0.001f) 
.... 
} 
V501 There are identical sub-expressions 'angVel.GetLengthSquared() > 0.001f' to the left and to the 
right of the '||' operator. vehiclemovementarcadewheeled.cpp 3300 
The "angVel.GetLengthSquared()>0.001f" check is executed twice. One of them is redundant, or 
otherwise there is a typo in it which prevents some other value from being checked. 
Identical code blocks under different conditions 
Fragment No. 1.
void CVicinityDependentObjectMover::HandleEvent(....) 
{ 
.... 
else if ( strcmp(szEventName, "ForceToTargetPos") == 0 ) 
{ 
SetState(eObjectRangeMoverState_MovingTo); 
SetState(eObjectRangeMoverState_Moved); 
ActivateOutputPortBool( "OnForceToTargetPos" ); 
} 
else if ( strcmp(szEventName, "ForceToTargetPos") == 0 ) 
{ 
SetState(eObjectRangeMoverState_MovingTo); 
SetState(eObjectRangeMoverState_Moved); 
ActivateOutputPortBool( "OnForceToTargetPos" ); 
} 
.... 
} 
V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error 
presence. Check lines: 255, 261. vicinitydependentobjectmover.cpp 255 
I suspect that this piece of code was written through the Copy-Paste technique. And I also suspect that 
the programmer forgot to change some lines after the copying. 
Fragment No. 2. The ShouldGiveLocalPlayerHitableFeedbackOnCrosshairHoverForEntityClass() function 
is implemented in a very strange way. That's a real NAME! 
bool CGameRules:: 
ShouldGiveLocalPlayerHitableFeedbackOnCrosshairHoverForEntityClass 
(const IEntityClass* pEntityClass) const 
{ 
assert(pEntityClass != NULL); 
if(gEnv->bMultiplayer) 
{
return 
(pEntityClass == s_pSmartMineClass) || 
(pEntityClass == s_pTurretClass) || 
(pEntityClass == s_pC4Explosive); 
} 
else 
{ 
return 
(pEntityClass == s_pSmartMineClass) || 
(pEntityClass == s_pTurretClass) || 
(pEntityClass == s_pC4Explosive); 
} 
} 
V523 The 'then' statement is equivalent to the 'else' statement. gamerules.cpp 5401 
Other similar defects: 
• environmentalweapon.cpp 964 
• persistantstats.cpp 610 
• persistantstats.cpp 714 
• recordingsystem.cpp 8924 
• movementtransitions.cpp 610 
• gamerulescombicaptureobjective.cpp 1692 
• vehiclemovementhelicopter.cpp 588 
An uninitialized array cell 
TDestructionEventId destructionEvents[2]; 
SDestructibleBodyPart() 
: hashId(0) 
, healthRatio(0.0f) 
, minHealthToDestroyOnDeathRatio(0.0f) 
{ 
destructionEvents[0] = -1; 
destructionEvents[0] = -1;
} 
V519 The 'destructionEvents[0]' variable is assigned values twice successively. Perhaps this is a mistake. 
Check lines: 75, 76. bodydestruction.h 76 
The 'destructionEvents' array consists of two items. The programmer wanted to initialize the array in the 
constructor, but failed. 
A parenthesis in a wrong place 
bool ShouldRecordEvent(size_t eventID, IActor* pActor=NULL) const; 
void CActorTelemetry::SubscribeToWeapon(EntityId weaponId) 
{ 
.... 
else if(pMgr->ShouldRecordEvent(eSE_Weapon), pOwnerRaw) 
.... 
} 
V639 Consider inspecting the expression for 'ShouldRecordEvent' function call. It is possible that one of 
the closing ')' brackets was positioned incorrectly. actortelemetry.cpp 288 
It's a rare and interesting bug - a closing parenthesis is written in a wrong place. 
The point is that the ShouldRecordEvent() function's second argument is optional. It turns that the 
ShouldRecordEvent() function is called first, and then the comma operator ',' returns the value on the 
right. The condition depends on the 'pOwnerRaw' variable alone. 
Long story short, the whole thing is darn messed up here. 
A function name missing 
virtual void ProcessEvent(....) 
{ 
.... 
string pMessage = ("%s:", currentSeat->GetSeatName()); 
.... 
} 
V521 Such expressions using the ',' operator are dangerous. Make sure the expression '"%s:", 
currentSeat->GetSeatName()' is correct. flowvehiclenodes.cpp 662 
In this fragment, the pMessage variable is assigned the value currentSeat->GetSeatName(). No 
formatting is done, and it leads to missing the colon ':' in this line. Though a trifle, it is still a bug.
The fixed code should look like this: 
string pMessage = 
string().Format("%s:", currentSeat->GetSeatName()); 
Senseless and pitiless checks 
Fragment No. 1. 
inline bool operator != (const SEfResTexture &m) const 
{ 
if (stricmp(m_Name.c_str(), m_Name.c_str()) != 0 || 
m_TexFlags != m.m_TexFlags || 
m_bUTile != m.m_bUTile || 
m_bVTile != m.m_bVTile || 
m_Filter != m.m_Filter || 
m_Ext != m.m_Ext || 
m_Sampler != m.m_Sampler) 
return true; 
return false; 
} 
V549 The first argument of 'stricmp' function is equal to the second argument. ishader.h 2089 
If you haven't noticed the bug, I'll tell you. The m_Name.c_str() string is compared to itself. The correct 
code should look like this: 
stricmp(m_Name.c_str(), m.m_Name.c_str()) 
Fragment No. 2. A logical error this time: 
SearchSpotStatus GetStatus() const { return m_status; } 
SearchSpot* SearchGroup::FindBestSearchSpot(....) 
{ 
.... 
if(searchSpot.GetStatus() != Unreachable || 
searchSpot.GetStatus() != BeingSearchedRightAboutNow)
.... 
} 
V547 Expression is always true. Probably the '&&' operator should be used here. searchmodule.cpp 469 
The check in this code does not make any sense. Here you are an analogy: 
if (A != 1 || A != 2) 
The condition is always true. 
Fragment No. 3. 
const CCircularBufferTimeline * 
CCircularBufferStatsContainer::GetTimeline( 
size_t inTimelineId) const 
{ 
.... 
if (inTimelineId >= 0 && (int)inTimelineId < m_numTimelines) 
{ 
tl = &m_timelines[inTimelineId]; 
} 
else 
{ 
CryWarning(VALIDATOR_MODULE_GAME,VALIDATOR_ERROR, 
"Statistics event %" PRISIZE_T 
" is larger than the max registered of %" 
PRISIZE_T ", event ignored", 
inTimelineId,m_numTimelines); 
} 
.... 
} 
V547 Expression 'inTimelineId >= 0' is always true. Unsigned type value is always >= 0. 
circularstatsstorage.cpp 31
Fragment No. 4. 
inline typename CryStringT<T>::size_type 
CryStringT<T>::rfind( value_type ch, size_type pos ) const 
{ 
const_str str; 
if (pos == npos) { 
.... 
} else { 
if (pos == npos) 
pos = length(); 
.... 
} 
V571 Recurring check. The 'if (pos == npos)' condition was already verified in line 1447. crystring.h 1453 
The "pos = length()" assignment will never be executed. 
A similar defect: cryfixedstring.h 1297 
Pointers 
Programmers are very fond of checking pointers for being null. Wish they knew how often they do it 
wrong - check when it's too late. 
I'll cite only one example and give you a link to a file with the list of all the other samples. 
IScriptTable *p; 
bool Create( IScriptSystem *pSS, bool bCreateEmpty=false ) 
{ 
if (p) p->Release(); 
p = pSS->CreateTable(bCreateEmpty); 
p->AddRef(); 
return (p)?true:false; 
} 
V595 The 'p' pointer was utilized before it was verified against nullptr. Check lines: 325, 326. 
scripthelpers.h 325 
The list of other 35 messages I mentioned about: CryEngineSDK-595.txt
Undefined behavior 
void AddSample( T x ) 
{ 
m_index = ++m_index % N; 
.... 
} 
V567 Undefined behavior. The 'm_index' variable is modified while being used twice between sequence 
points. inetwork.h 2303 
One-time loops 
void CWeapon::AccessoriesChanged(bool initialLoadoutSetup) 
{ 
.... 
for (int i = 0; i < numZoommodes; i++) 
{ 
CIronSight* pZoomMode = .... 
const SZoomModeParams* pCurrentParams = .... 
const SZoomModeParams* pNewParams = .... 
if(pNewParams != pCurrentParams) 
{ 
pZoomMode->ResetSharedParams(pNewParams); 
} 
break; 
} 
.... 
} 
V612 An unconditional 'break' within a loop. weapon.cpp 2854 
The loop body will be executed only once because of the unconditional statement 'break', while there 
are no 'continue' operators around in this loop. 
We found a few more suspicious loops like that: 
• gunturret.cpp 1647 
• vehiclemovementbase.cpp 2362 
• vehiclemovementbase.cpp 2382
Strange assignments 
Fragment No. 1. 
void CPlayerStateGround::OnPrePhysicsUpdate(....) 
{ 
.... 
modifiedSlopeNormal.z = modifiedSlopeNormal.z; 
.... 
} 
V570 The 'modifiedSlopeNormal.z' variable is assigned to itself. playerstateground.cpp 227 
Fragment No. 2. 
const SRWIParams& Init(....) 
{ 
.... 
objtypes=ent_all; 
flags=rwi_stop_at_pierceable; 
org=_org; 
dir=_dir; 
objtypes=_objtypes; 
.... 
} 
V519 The 'objtypes' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 
2807, 2808. physinterface.h 2808 
The 'objtypes' class member is assigned values twice. 
Fragment No. 3. 
void SPickAndThrowParams::SThrowParams::SetDefaultValues() 
{ 
.... 
maxChargedThrowSpeed = 20.0f; 
maxChargedThrowSpeed = 15.0f; 
}
V519 The 'maxChargedThrowSpeed' variable is assigned values twice successively. Perhaps this is a 
mistake. Check lines: 1284, 1285. weaponsharedparams.cpp 1285 
A few more similar strange assignments: 
• The 'bExecuteCommandLine' variable. Check lines: 628, 630. isystem.h 630 
• The 'flags' variable. Check lines: 2807, 2808. physinterface.h 2808 
• The 'entTypes' Variable. Check lines: 2854, 2856. physinterface.h 2856 
• The 'geomFlagsAny' variable. Check lines: 2854, 2857. physinterface.h 2857 
• The 'm_pLayerEffectParams' variable. Check lines: 762, 771. ishader.h 771 
Careless entity names 
void CGamePhysicsSettings::Debug(....) const 
{ 
.... 
sprintf_s(buf, bufLen, pEntity->GetName()); 
.... 
} 
V618 It's dangerous to call the 'sprintf_s' function in such a manner, as the line being passed could 
contain format specification. The example of the safe code: printf("%s", str); gamephysicssettings.cpp 
174 
It's not quite an error, but a dangerous code anyway. Should the '%' character be used in an entity 
name, it may lead to absolutely unpredictable consequences. 
Lone wanderer 
CPersistantStats::SEnemyTeamMemberInfo 
*CPersistantStats::GetEnemyTeamMemberInfo(EntityId inEntityId) 
{ 
.... 
insertResult.first->second.m_entityId; 
.... 
} 
V607 Ownerless expression 'insertResult.first->second.m_entityId'. persistantstats.cpp 4814 
An alone standing expression doing nothing. What is it? A bug? Incomplete code? 
Another similar fragment: recordingsystem.cpp 2671 
The new operator 
bool CreateWriteBuffer(uint32 bufferSize)
{ 
FreeWriteBuffer(); 
m_pWriteBuffer = new uint8[bufferSize]; 
if (m_pWriteBuffer) 
{ 
m_bufferSize = bufferSize; 
m_bufferPos = 0; 
m_allocated = true; 
return true; 
} 
return false; 
} 
V668 There is no sense in testing the 'm_pWriteBuffer' pointer against null, as the memory was 
allocated using the 'new' operator. The exception will be generated in the case of memory allocation 
error. crylobbypacket.h 88 
The code is obsolete. Nowadays, the 'new' operator throws an exception when a memory allocation 
error occurs. 
Other fragments in need of refactoring: 
• cry_math.h 73 
• datapatchdownloader.cpp 106 
• datapatchdownloader.cpp 338 
• game.cpp 1671 
• game.cpp 4478 
• persistantstats.cpp 1235 
• sceneblurgameeffect.cpp 366 
• killcamgameeffect.cpp 369 
• downloadmgr.cpp 1090 
• downloadmgr.cpp 1467 
• matchmakingtelemetry.cpp 69 
• matchmakingtelemetry.cpp 132 
• matchmakingtelemetry.cpp 109 
• telemetrycollector.cpp 1407 
• telemetrycollector.cpp 1470 
• telemetrycollector.cpp 1467 
• telemetrycollector.cpp 1479 
• statsrecordingmgr.cpp 1134 
• statsrecordingmgr.cpp 1144
• statsrecordingmgr.cpp 1267 
• statsrecordingmgr.cpp 1261 
• featuretester.cpp 876 
• menurender3dmodelmgr.cpp 1373 
Conclusions 
No special conclusions. But I wish I could check the CryEngine 3 engine itself, rather than CryEngine 3 
SDK. Guess how many bugs I could find there? 
May your code stay bugless!

More Related Content

What's hot

Checking OpenCV with PVS-Studio
Checking OpenCV with PVS-StudioChecking OpenCV with PVS-Studio
Checking OpenCV with PVS-StudioPVS-Studio
 
The CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitThe CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitAndrey Karpov
 
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...PVS-Studio
 
Critical errors in CryEngine V code
Critical errors in CryEngine V codeCritical errors in CryEngine V code
Critical errors in CryEngine V codePVS-Studio
 
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...PVS-Studio
 
PVS-Studio is there to help CERN: analysis of Geant4 project
PVS-Studio is there to help CERN: analysis of Geant4 projectPVS-Studio is there to help CERN: analysis of Geant4 project
PVS-Studio is there to help CERN: analysis of Geant4 projectPVS-Studio
 
CppCat Checks OpenMW: Not All is Fine in the Morrowind Universe
CppCat Checks OpenMW: Not All is Fine in the Morrowind UniverseCppCat Checks OpenMW: Not All is Fine in the Morrowind Universe
CppCat Checks OpenMW: Not All is Fine in the Morrowind UniverseAndrey Karpov
 
A fresh eye on Oracle VM VirtualBox
A fresh eye on Oracle VM VirtualBoxA fresh eye on Oracle VM VirtualBox
A fresh eye on Oracle VM VirtualBoxPVS-Studio
 
Intel IPP Samples for Windows - error correction
Intel IPP Samples for Windows - error correctionIntel IPP Samples for Windows - error correction
Intel IPP Samples for Windows - error correctionPVS-Studio
 
Checking the World of Warcraft CMaNGOS open source server
Checking the World of Warcraft CMaNGOS open source serverChecking the World of Warcraft CMaNGOS open source server
Checking the World of Warcraft CMaNGOS open source serverPVS-Studio
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
 
Re-analysis of Umbraco code
Re-analysis of Umbraco codeRe-analysis of Umbraco code
Re-analysis of Umbraco codePVS-Studio
 
Checking Notepad++: five years later
Checking Notepad++: five years laterChecking Notepad++: five years later
Checking Notepad++: five years laterPVS-Studio
 
Re-checking the ReactOS project - a large report
Re-checking the ReactOS project - a large reportRe-checking the ReactOS project - a large report
Re-checking the ReactOS project - a large reportPVS-Studio
 
LibRaw, Coverity SCAN, PVS-Studio
LibRaw, Coverity SCAN, PVS-StudioLibRaw, Coverity SCAN, PVS-Studio
LibRaw, Coverity SCAN, PVS-StudioAndrey Karpov
 
Checking Oracle VM VirtualBox. Part 1
Checking Oracle VM VirtualBox. Part 1Checking Oracle VM VirtualBox. Part 1
Checking Oracle VM VirtualBox. Part 1Andrey Karpov
 
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft EdgeChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft EdgePVS-Studio
 
Checking 7-Zip with PVS-Studio analyzer
Checking 7-Zip with PVS-Studio analyzerChecking 7-Zip with PVS-Studio analyzer
Checking 7-Zip with PVS-Studio analyzerPVS-Studio
 
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorWaiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorPVS-Studio
 
The Unicorn's Travel to the Microcosm
The Unicorn's Travel to the MicrocosmThe Unicorn's Travel to the Microcosm
The Unicorn's Travel to the MicrocosmAndrey Karpov
 

What's hot (20)

Checking OpenCV with PVS-Studio
Checking OpenCV with PVS-StudioChecking OpenCV with PVS-Studio
Checking OpenCV with PVS-Studio
 
The CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitThe CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGit
 
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...
Serious Sam shooter anniversary - finding bugs in the code of the Serious Eng...
 
Critical errors in CryEngine V code
Critical errors in CryEngine V codeCritical errors in CryEngine V code
Critical errors in CryEngine V code
 
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
 
PVS-Studio is there to help CERN: analysis of Geant4 project
PVS-Studio is there to help CERN: analysis of Geant4 projectPVS-Studio is there to help CERN: analysis of Geant4 project
PVS-Studio is there to help CERN: analysis of Geant4 project
 
CppCat Checks OpenMW: Not All is Fine in the Morrowind Universe
CppCat Checks OpenMW: Not All is Fine in the Morrowind UniverseCppCat Checks OpenMW: Not All is Fine in the Morrowind Universe
CppCat Checks OpenMW: Not All is Fine in the Morrowind Universe
 
A fresh eye on Oracle VM VirtualBox
A fresh eye on Oracle VM VirtualBoxA fresh eye on Oracle VM VirtualBox
A fresh eye on Oracle VM VirtualBox
 
Intel IPP Samples for Windows - error correction
Intel IPP Samples for Windows - error correctionIntel IPP Samples for Windows - error correction
Intel IPP Samples for Windows - error correction
 
Checking the World of Warcraft CMaNGOS open source server
Checking the World of Warcraft CMaNGOS open source serverChecking the World of Warcraft CMaNGOS open source server
Checking the World of Warcraft CMaNGOS open source server
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' Mistakes
 
Re-analysis of Umbraco code
Re-analysis of Umbraco codeRe-analysis of Umbraco code
Re-analysis of Umbraco code
 
Checking Notepad++: five years later
Checking Notepad++: five years laterChecking Notepad++: five years later
Checking Notepad++: five years later
 
Re-checking the ReactOS project - a large report
Re-checking the ReactOS project - a large reportRe-checking the ReactOS project - a large report
Re-checking the ReactOS project - a large report
 
LibRaw, Coverity SCAN, PVS-Studio
LibRaw, Coverity SCAN, PVS-StudioLibRaw, Coverity SCAN, PVS-Studio
LibRaw, Coverity SCAN, PVS-Studio
 
Checking Oracle VM VirtualBox. Part 1
Checking Oracle VM VirtualBox. Part 1Checking Oracle VM VirtualBox. Part 1
Checking Oracle VM VirtualBox. Part 1
 
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft EdgeChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
 
Checking 7-Zip with PVS-Studio analyzer
Checking 7-Zip with PVS-Studio analyzerChecking 7-Zip with PVS-Studio analyzer
Checking 7-Zip with PVS-Studio analyzer
 
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorWaiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
 
The Unicorn's Travel to the Microcosm
The Unicorn's Travel to the MicrocosmThe Unicorn's Travel to the Microcosm
The Unicorn's Travel to the Microcosm
 

Viewers also liked

Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro rubyNicolas Ledez
 
Is your python application secure? - PyCon Canada - 2015-11-07
Is your python application secure? - PyCon Canada - 2015-11-07Is your python application secure? - PyCon Canada - 2015-11-07
Is your python application secure? - PyCon Canada - 2015-11-07Frédéric Harper
 
FITC Spotlight HTML5 - The state of the web
FITC Spotlight HTML5 - The state of the webFITC Spotlight HTML5 - The state of the web
FITC Spotlight HTML5 - The state of the webFrédéric Harper
 
How to Create and Manage Blog Content
How to Create and Manage Blog ContentHow to Create and Manage Blog Content
How to Create and Manage Blog ContentCompendium
 

Viewers also liked (6)

inflation
inflationinflation
inflation
 
Get That Job!
Get That Job!Get That Job!
Get That Job!
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro ruby
 
Is your python application secure? - PyCon Canada - 2015-11-07
Is your python application secure? - PyCon Canada - 2015-11-07Is your python application secure? - PyCon Canada - 2015-11-07
Is your python application secure? - PyCon Canada - 2015-11-07
 
FITC Spotlight HTML5 - The state of the web
FITC Spotlight HTML5 - The state of the webFITC Spotlight HTML5 - The state of the web
FITC Spotlight HTML5 - The state of the web
 
How to Create and Manage Blog Content
How to Create and Manage Blog ContentHow to Create and Manage Blog Content
How to Create and Manage Blog Content
 

Similar to A Spin-off: CryEngine 3 SDK Checked with CppCat

A Slipshod Check of the Visual C++ 2013 Library (update 3)
A Slipshod Check of the Visual C++ 2013 Library (update 3)A Slipshod Check of the Visual C++ 2013 Library (update 3)
A Slipshod Check of the Visual C++ 2013 Library (update 3)Andrey Karpov
 
PVS-Studio vs Chromium - Continuation
PVS-Studio vs Chromium - ContinuationPVS-Studio vs Chromium - Continuation
PVS-Studio vs Chromium - ContinuationPVS-Studio
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1PVS-Studio
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2PVS-Studio
 
Linux version of PVS-Studio couldn't help checking CodeLite
Linux version of PVS-Studio couldn't help checking CodeLiteLinux version of PVS-Studio couldn't help checking CodeLite
Linux version of PVS-Studio couldn't help checking CodeLitePVS-Studio
 
Analysis of the Trans-Proteomic Pipeline (TPP) project
Analysis of the Trans-Proteomic Pipeline (TPP) projectAnalysis of the Trans-Proteomic Pipeline (TPP) project
Analysis of the Trans-Proteomic Pipeline (TPP) projectPVS-Studio
 
PVS-Studio for Linux Went on a Tour Around Disney
PVS-Studio for Linux Went on a Tour Around DisneyPVS-Studio for Linux Went on a Tour Around Disney
PVS-Studio for Linux Went on a Tour Around DisneyPVS-Studio
 
Checking the Source SDK Project
Checking the Source SDK ProjectChecking the Source SDK Project
Checking the Source SDK ProjectAndrey Karpov
 
Analyzing the Dolphin-emu project
Analyzing the Dolphin-emu projectAnalyzing the Dolphin-emu project
Analyzing the Dolphin-emu projectPVS-Studio
 
Why Windows 8 drivers are buggy
Why Windows 8 drivers are buggyWhy Windows 8 drivers are buggy
Why Windows 8 drivers are buggyAndrey Karpov
 
I want to sell a PVS-Studio license to the Intel company
I want to sell a PVS-Studio license to the Intel companyI want to sell a PVS-Studio license to the Intel company
I want to sell a PVS-Studio license to the Intel companyPVS-Studio
 
Analyzing Firebird 3.0
Analyzing Firebird 3.0Analyzing Firebird 3.0
Analyzing Firebird 3.0PVS-Studio
 
Analysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectAnalysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectPVS-Studio
 
Analysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectAnalysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectPVS-Studio
 
Rechecking TortoiseSVN with the PVS-Studio Code Analyzer
Rechecking TortoiseSVN with the PVS-Studio Code AnalyzerRechecking TortoiseSVN with the PVS-Studio Code Analyzer
Rechecking TortoiseSVN with the PVS-Studio Code AnalyzerAndrey Karpov
 
Rechecking Apache HTTP Server
Rechecking Apache HTTP ServerRechecking Apache HTTP Server
Rechecking Apache HTTP ServerPVS-Studio
 
100 bugs in Open Source C/C++ projects
100 bugs in Open Source C/C++ projects 100 bugs in Open Source C/C++ projects
100 bugs in Open Source C/C++ projects Andrey Karpov
 
Tesseract. Recognizing Errors in Recognition Software
Tesseract. Recognizing Errors in Recognition SoftwareTesseract. Recognizing Errors in Recognition Software
Tesseract. Recognizing Errors in Recognition SoftwareAndrey Karpov
 

Similar to A Spin-off: CryEngine 3 SDK Checked with CppCat (19)

A Slipshod Check of the Visual C++ 2013 Library (update 3)
A Slipshod Check of the Visual C++ 2013 Library (update 3)A Slipshod Check of the Visual C++ 2013 Library (update 3)
A Slipshod Check of the Visual C++ 2013 Library (update 3)
 
PVS-Studio vs Chromium - Continuation
PVS-Studio vs Chromium - ContinuationPVS-Studio vs Chromium - Continuation
PVS-Studio vs Chromium - Continuation
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
 
Linux version of PVS-Studio couldn't help checking CodeLite
Linux version of PVS-Studio couldn't help checking CodeLiteLinux version of PVS-Studio couldn't help checking CodeLite
Linux version of PVS-Studio couldn't help checking CodeLite
 
Analysis of the Trans-Proteomic Pipeline (TPP) project
Analysis of the Trans-Proteomic Pipeline (TPP) projectAnalysis of the Trans-Proteomic Pipeline (TPP) project
Analysis of the Trans-Proteomic Pipeline (TPP) project
 
PVS-Studio for Linux Went on a Tour Around Disney
PVS-Studio for Linux Went on a Tour Around DisneyPVS-Studio for Linux Went on a Tour Around Disney
PVS-Studio for Linux Went on a Tour Around Disney
 
Checking the Source SDK Project
Checking the Source SDK ProjectChecking the Source SDK Project
Checking the Source SDK Project
 
Analyzing the Dolphin-emu project
Analyzing the Dolphin-emu projectAnalyzing the Dolphin-emu project
Analyzing the Dolphin-emu project
 
Why Windows 8 drivers are buggy
Why Windows 8 drivers are buggyWhy Windows 8 drivers are buggy
Why Windows 8 drivers are buggy
 
I want to sell a PVS-Studio license to the Intel company
I want to sell a PVS-Studio license to the Intel companyI want to sell a PVS-Studio license to the Intel company
I want to sell a PVS-Studio license to the Intel company
 
Analyzing Firebird 3.0
Analyzing Firebird 3.0Analyzing Firebird 3.0
Analyzing Firebird 3.0
 
Analyzing Firebird 3.0
Analyzing Firebird 3.0Analyzing Firebird 3.0
Analyzing Firebird 3.0
 
Analysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectAnalysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox project
 
Analysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox projectAnalysis of the Ultimate Toolbox project
Analysis of the Ultimate Toolbox project
 
Rechecking TortoiseSVN with the PVS-Studio Code Analyzer
Rechecking TortoiseSVN with the PVS-Studio Code AnalyzerRechecking TortoiseSVN with the PVS-Studio Code Analyzer
Rechecking TortoiseSVN with the PVS-Studio Code Analyzer
 
Rechecking Apache HTTP Server
Rechecking Apache HTTP ServerRechecking Apache HTTP Server
Rechecking Apache HTTP Server
 
100 bugs in Open Source C/C++ projects
100 bugs in Open Source C/C++ projects 100 bugs in Open Source C/C++ projects
100 bugs in Open Source C/C++ projects
 
Tesseract. Recognizing Errors in Recognition Software
Tesseract. Recognizing Errors in Recognition SoftwareTesseract. Recognizing Errors in Recognition Software
Tesseract. Recognizing Errors in Recognition Software
 

More from Andrey Karpov

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developerAndrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesAndrey Karpov
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewAndrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Andrey Karpov
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsAndrey Karpov
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++Andrey Karpov
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youAndrey Karpov
 
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOpsPVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOpsAndrey Karpov
 

More from Andrey Karpov (20)

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developer
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error Examples
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature Overview
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
PVS-Studio в 2021
PVS-Studio в 2021PVS-Studio в 2021
PVS-Studio в 2021
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and Java
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical Reviewer
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal Engine
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for you
 
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOpsPVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
 

Recently uploaded

Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 

Recently uploaded (20)

Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 

A Spin-off: CryEngine 3 SDK Checked with CppCat

  • 1. A Spin-off: CryEngine 3 SDK Checked with CppCat Author: Andrey Karpov Date: 10.03.2014 We have finished a large comparison of the static code analyzers CppCat, Cppcheck, PVS-Studio and Visual Studio 2013's built-in analyzer. In the course of this investigation, we checked over 10 open-source projects. Some of them do deserve to be discussed specially. In today's article, I'll tell you about the results of the check of the CryEngine 3 SDK project. CryEngine 3 SDK Wikipedia: CryEngine 3 SDK is a toolset for developing computer games on the CryEngine 3 game engine. CryEngine 3 SDK is developed and maintained by German company Crytek, the developer of the original engine CyrEngine 3. CryEngine 3 SDK is a proprietary freeware development toolset anyone can use for non-commercial game development. For commercial game development exploiting CryEngine 3, developers have to pay royalties to Crytek. CppCat Let's see if CppCat has found any interesting bugs in this library. Why CppCat and not PVS-Studio? Just for a change. We want everyone to see that CppCat is almost in no way inferior to PVS-Studio in the area of general static analysis. True, PVS-Studio catches a bit more bugs if you turn on the 3-rd severity level diagnostics. But I wouldn't call these defects crucial. For example: static void GetNameForFile( const char* baseFileName,
  • 2. const uint32 fileIdx, char outputName[512] ) { assert(baseFileName != NULL); sprintf( outputName, "%s_%d", baseFileName, fileIdx ); } V576 Incorrect format. Consider checking the fourth actual argument of the 'sprintf' function. The SIGNED integer type argument is expected. igame.h 66 From the formal viewpoint, the programmer should have used "%u" to print the unsigned variable 'fileIdx'. But I'm very doubtful that this variable will ever reach a value larger than INT_MAX. So this error will not cause any severe consequences. To learn more about the differences between CppCat and PVS-Studio, see the article "An Alternative to PVS-Studio at $250". Analysis results My brief comment on the analysis results is, developers should use static analysis. There will be much fewer bugs in programs and I will drop writing articles like this one. Double check void CVehicleMovementArcadeWheeled::InternalPhysicsTick(float dt) { .... if (fabsf(m_movementAction.rotateYaw)>0.05f || vel.GetLengthSquared()>0.001f || m_chassis.vel.GetLengthSquared()>0.001f || angVel.GetLengthSquared()>0.001f || angVel.GetLengthSquared()>0.001f) .... } V501 There are identical sub-expressions 'angVel.GetLengthSquared() > 0.001f' to the left and to the right of the '||' operator. vehiclemovementarcadewheeled.cpp 3300 The "angVel.GetLengthSquared()>0.001f" check is executed twice. One of them is redundant, or otherwise there is a typo in it which prevents some other value from being checked. Identical code blocks under different conditions Fragment No. 1.
  • 3. void CVicinityDependentObjectMover::HandleEvent(....) { .... else if ( strcmp(szEventName, "ForceToTargetPos") == 0 ) { SetState(eObjectRangeMoverState_MovingTo); SetState(eObjectRangeMoverState_Moved); ActivateOutputPortBool( "OnForceToTargetPos" ); } else if ( strcmp(szEventName, "ForceToTargetPos") == 0 ) { SetState(eObjectRangeMoverState_MovingTo); SetState(eObjectRangeMoverState_Moved); ActivateOutputPortBool( "OnForceToTargetPos" ); } .... } V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 255, 261. vicinitydependentobjectmover.cpp 255 I suspect that this piece of code was written through the Copy-Paste technique. And I also suspect that the programmer forgot to change some lines after the copying. Fragment No. 2. The ShouldGiveLocalPlayerHitableFeedbackOnCrosshairHoverForEntityClass() function is implemented in a very strange way. That's a real NAME! bool CGameRules:: ShouldGiveLocalPlayerHitableFeedbackOnCrosshairHoverForEntityClass (const IEntityClass* pEntityClass) const { assert(pEntityClass != NULL); if(gEnv->bMultiplayer) {
  • 4. return (pEntityClass == s_pSmartMineClass) || (pEntityClass == s_pTurretClass) || (pEntityClass == s_pC4Explosive); } else { return (pEntityClass == s_pSmartMineClass) || (pEntityClass == s_pTurretClass) || (pEntityClass == s_pC4Explosive); } } V523 The 'then' statement is equivalent to the 'else' statement. gamerules.cpp 5401 Other similar defects: • environmentalweapon.cpp 964 • persistantstats.cpp 610 • persistantstats.cpp 714 • recordingsystem.cpp 8924 • movementtransitions.cpp 610 • gamerulescombicaptureobjective.cpp 1692 • vehiclemovementhelicopter.cpp 588 An uninitialized array cell TDestructionEventId destructionEvents[2]; SDestructibleBodyPart() : hashId(0) , healthRatio(0.0f) , minHealthToDestroyOnDeathRatio(0.0f) { destructionEvents[0] = -1; destructionEvents[0] = -1;
  • 5. } V519 The 'destructionEvents[0]' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 75, 76. bodydestruction.h 76 The 'destructionEvents' array consists of two items. The programmer wanted to initialize the array in the constructor, but failed. A parenthesis in a wrong place bool ShouldRecordEvent(size_t eventID, IActor* pActor=NULL) const; void CActorTelemetry::SubscribeToWeapon(EntityId weaponId) { .... else if(pMgr->ShouldRecordEvent(eSE_Weapon), pOwnerRaw) .... } V639 Consider inspecting the expression for 'ShouldRecordEvent' function call. It is possible that one of the closing ')' brackets was positioned incorrectly. actortelemetry.cpp 288 It's a rare and interesting bug - a closing parenthesis is written in a wrong place. The point is that the ShouldRecordEvent() function's second argument is optional. It turns that the ShouldRecordEvent() function is called first, and then the comma operator ',' returns the value on the right. The condition depends on the 'pOwnerRaw' variable alone. Long story short, the whole thing is darn messed up here. A function name missing virtual void ProcessEvent(....) { .... string pMessage = ("%s:", currentSeat->GetSeatName()); .... } V521 Such expressions using the ',' operator are dangerous. Make sure the expression '"%s:", currentSeat->GetSeatName()' is correct. flowvehiclenodes.cpp 662 In this fragment, the pMessage variable is assigned the value currentSeat->GetSeatName(). No formatting is done, and it leads to missing the colon ':' in this line. Though a trifle, it is still a bug.
  • 6. The fixed code should look like this: string pMessage = string().Format("%s:", currentSeat->GetSeatName()); Senseless and pitiless checks Fragment No. 1. inline bool operator != (const SEfResTexture &m) const { if (stricmp(m_Name.c_str(), m_Name.c_str()) != 0 || m_TexFlags != m.m_TexFlags || m_bUTile != m.m_bUTile || m_bVTile != m.m_bVTile || m_Filter != m.m_Filter || m_Ext != m.m_Ext || m_Sampler != m.m_Sampler) return true; return false; } V549 The first argument of 'stricmp' function is equal to the second argument. ishader.h 2089 If you haven't noticed the bug, I'll tell you. The m_Name.c_str() string is compared to itself. The correct code should look like this: stricmp(m_Name.c_str(), m.m_Name.c_str()) Fragment No. 2. A logical error this time: SearchSpotStatus GetStatus() const { return m_status; } SearchSpot* SearchGroup::FindBestSearchSpot(....) { .... if(searchSpot.GetStatus() != Unreachable || searchSpot.GetStatus() != BeingSearchedRightAboutNow)
  • 7. .... } V547 Expression is always true. Probably the '&&' operator should be used here. searchmodule.cpp 469 The check in this code does not make any sense. Here you are an analogy: if (A != 1 || A != 2) The condition is always true. Fragment No. 3. const CCircularBufferTimeline * CCircularBufferStatsContainer::GetTimeline( size_t inTimelineId) const { .... if (inTimelineId >= 0 && (int)inTimelineId < m_numTimelines) { tl = &m_timelines[inTimelineId]; } else { CryWarning(VALIDATOR_MODULE_GAME,VALIDATOR_ERROR, "Statistics event %" PRISIZE_T " is larger than the max registered of %" PRISIZE_T ", event ignored", inTimelineId,m_numTimelines); } .... } V547 Expression 'inTimelineId >= 0' is always true. Unsigned type value is always >= 0. circularstatsstorage.cpp 31
  • 8. Fragment No. 4. inline typename CryStringT<T>::size_type CryStringT<T>::rfind( value_type ch, size_type pos ) const { const_str str; if (pos == npos) { .... } else { if (pos == npos) pos = length(); .... } V571 Recurring check. The 'if (pos == npos)' condition was already verified in line 1447. crystring.h 1453 The "pos = length()" assignment will never be executed. A similar defect: cryfixedstring.h 1297 Pointers Programmers are very fond of checking pointers for being null. Wish they knew how often they do it wrong - check when it's too late. I'll cite only one example and give you a link to a file with the list of all the other samples. IScriptTable *p; bool Create( IScriptSystem *pSS, bool bCreateEmpty=false ) { if (p) p->Release(); p = pSS->CreateTable(bCreateEmpty); p->AddRef(); return (p)?true:false; } V595 The 'p' pointer was utilized before it was verified against nullptr. Check lines: 325, 326. scripthelpers.h 325 The list of other 35 messages I mentioned about: CryEngineSDK-595.txt
  • 9. Undefined behavior void AddSample( T x ) { m_index = ++m_index % N; .... } V567 Undefined behavior. The 'm_index' variable is modified while being used twice between sequence points. inetwork.h 2303 One-time loops void CWeapon::AccessoriesChanged(bool initialLoadoutSetup) { .... for (int i = 0; i < numZoommodes; i++) { CIronSight* pZoomMode = .... const SZoomModeParams* pCurrentParams = .... const SZoomModeParams* pNewParams = .... if(pNewParams != pCurrentParams) { pZoomMode->ResetSharedParams(pNewParams); } break; } .... } V612 An unconditional 'break' within a loop. weapon.cpp 2854 The loop body will be executed only once because of the unconditional statement 'break', while there are no 'continue' operators around in this loop. We found a few more suspicious loops like that: • gunturret.cpp 1647 • vehiclemovementbase.cpp 2362 • vehiclemovementbase.cpp 2382
  • 10. Strange assignments Fragment No. 1. void CPlayerStateGround::OnPrePhysicsUpdate(....) { .... modifiedSlopeNormal.z = modifiedSlopeNormal.z; .... } V570 The 'modifiedSlopeNormal.z' variable is assigned to itself. playerstateground.cpp 227 Fragment No. 2. const SRWIParams& Init(....) { .... objtypes=ent_all; flags=rwi_stop_at_pierceable; org=_org; dir=_dir; objtypes=_objtypes; .... } V519 The 'objtypes' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 2807, 2808. physinterface.h 2808 The 'objtypes' class member is assigned values twice. Fragment No. 3. void SPickAndThrowParams::SThrowParams::SetDefaultValues() { .... maxChargedThrowSpeed = 20.0f; maxChargedThrowSpeed = 15.0f; }
  • 11. V519 The 'maxChargedThrowSpeed' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1284, 1285. weaponsharedparams.cpp 1285 A few more similar strange assignments: • The 'bExecuteCommandLine' variable. Check lines: 628, 630. isystem.h 630 • The 'flags' variable. Check lines: 2807, 2808. physinterface.h 2808 • The 'entTypes' Variable. Check lines: 2854, 2856. physinterface.h 2856 • The 'geomFlagsAny' variable. Check lines: 2854, 2857. physinterface.h 2857 • The 'm_pLayerEffectParams' variable. Check lines: 762, 771. ishader.h 771 Careless entity names void CGamePhysicsSettings::Debug(....) const { .... sprintf_s(buf, bufLen, pEntity->GetName()); .... } V618 It's dangerous to call the 'sprintf_s' function in such a manner, as the line being passed could contain format specification. The example of the safe code: printf("%s", str); gamephysicssettings.cpp 174 It's not quite an error, but a dangerous code anyway. Should the '%' character be used in an entity name, it may lead to absolutely unpredictable consequences. Lone wanderer CPersistantStats::SEnemyTeamMemberInfo *CPersistantStats::GetEnemyTeamMemberInfo(EntityId inEntityId) { .... insertResult.first->second.m_entityId; .... } V607 Ownerless expression 'insertResult.first->second.m_entityId'. persistantstats.cpp 4814 An alone standing expression doing nothing. What is it? A bug? Incomplete code? Another similar fragment: recordingsystem.cpp 2671 The new operator bool CreateWriteBuffer(uint32 bufferSize)
  • 12. { FreeWriteBuffer(); m_pWriteBuffer = new uint8[bufferSize]; if (m_pWriteBuffer) { m_bufferSize = bufferSize; m_bufferPos = 0; m_allocated = true; return true; } return false; } V668 There is no sense in testing the 'm_pWriteBuffer' pointer against null, as the memory was allocated using the 'new' operator. The exception will be generated in the case of memory allocation error. crylobbypacket.h 88 The code is obsolete. Nowadays, the 'new' operator throws an exception when a memory allocation error occurs. Other fragments in need of refactoring: • cry_math.h 73 • datapatchdownloader.cpp 106 • datapatchdownloader.cpp 338 • game.cpp 1671 • game.cpp 4478 • persistantstats.cpp 1235 • sceneblurgameeffect.cpp 366 • killcamgameeffect.cpp 369 • downloadmgr.cpp 1090 • downloadmgr.cpp 1467 • matchmakingtelemetry.cpp 69 • matchmakingtelemetry.cpp 132 • matchmakingtelemetry.cpp 109 • telemetrycollector.cpp 1407 • telemetrycollector.cpp 1470 • telemetrycollector.cpp 1467 • telemetrycollector.cpp 1479 • statsrecordingmgr.cpp 1134 • statsrecordingmgr.cpp 1144
  • 13. • statsrecordingmgr.cpp 1267 • statsrecordingmgr.cpp 1261 • featuretester.cpp 876 • menurender3dmodelmgr.cpp 1373 Conclusions No special conclusions. But I wish I could check the CryEngine 3 engine itself, rather than CryEngine 3 SDK. Guess how many bugs I could find there? May your code stay bugless!