SlideShare a Scribd company logo
Static analysis of C++ source codeKarpovAndreyNikolaevichcandidate of science (PhD), CTOOOO «Program Verification Systems» (Co Ltd)E-mail: karpov@viva64.com
What is this report aboutWe all make mistakes while programming and spend a lot of time fixing them.One of the methods which allows for quick detection of defects is source code static analysis.
«One should write a quality code from the beginning» - it is not working in practice!even the best developers make mistakes and typing errors;following are the examples of mistakes detected by static code analyzer in a well known projects;PVS-Studio tool was used to perform the analysis.
Priority of & and! operationsReturntoCastleWolfenstein – computer game, first person shooter, developed by id Software company. Game engine is available under GPL license.#define SVF_CASTAI  0x00000010if ( !ent->r.svFlags& SVF_CASTAI )if ( ! (ent->r.svFlags & SVF_CASTAI) )
Usage of && instead of &Stickies– yellow sticky notes, just only on your monitor.#define REO_INPLACEACTIVE  (0x02000000L)#define REO_OPEN           (0x04000000L)if (reObj.dwFlags&& REO_INPLACEACTIVE)m_pRichEditOle->InPlaceDeactivate();if(reObj.dwFlags&& REO_OPEN)  hr = reObj.poleobj->Close(OLECLOSE_NOSAVE);
Undefined behaviorMiranda IM (Miranda Instant Messenger) – instant messaging software for Microsoft Windows.while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') {
Usage of `delete` for an arrayChromium – open source web browser developed by Google. The development of GoogleChrome browser is based upon Chromium.auto_ptr<VARIANT> child_array(new VARIANT[child_count]);You should not useauto_ptr with arrays. Only one element is destroyed inside auto_ptr destructor:~auto_ptr() {  delete _Myptr;}For example you can use boost::scoped_array as an alternative.
Condition is always trueWinDjView is fast and small app for viewing  files of DjVu format.inline boolIsValidChar(int c){  return c == 0x9 || 0xA || c == 0xD || c >= 0x20 && c <= 0xD7FF         || c >= 0xE000 && c <= 0xFFFD || c >= 0x10000 && c <= 0x10FFFF;}
Code formatting differs from it’s own logicSquirrel – interpreted programming language, which is developed to be used as a scripting language in real time applications such as computer games. if(pushval != 0)    if(pushval) v->GetUp(-1) = t;  else    v->Pop(1);v->Pop(1); - will never be reached
Incidental local variable declarationFCE Ultra – open source Nintendo Entertainment System console emulatorintiNesSaveAs(char* name){  ...fp = fopen(name,"wb");int x = 0;  if (!fp)int x = 1;  ...}
Using char asunsigned char// check each line for illegal utf8 sequences.// If one is found, we treatthe file as ASCII,// otherwise we assumean UTF8 file.char * utf8CheckBuf = lineptr;while ((bUTF8)&&(*utf8CheckBuf)){  if ((*utf8CheckBuf == 0xC0)||      (*utf8CheckBuf == 0xC1)||      (*utf8CheckBuf >= 0xF5))  {    bUTF8 = false;   break;  }TortoiseSVN — client of Subversion revision  control system, implemented as Windows shell extension.
Incidental use of hexadecimal valuesoCell._luminance = uint16(0.2220f*iPixel._red +0.7067f*iPixel._blue +0.0713f*iPixel._green);....oCell._luminance = 2220*iPixel._red +7067*iPixel._blue +0713*iPixel._green;eLynx Image Processing SDK and Lab
One variable is used for two loopsLugaru— first commercial game  developed by WolfireGamesindependent team.static inti,j,k,l,m;...for(j=0; j<numrepeats; j++){  ...  for(i=0; i<num_joints; i++){    ...    for(j=0;j<num_joints;j++){      if(joints[j].locked)freely=0;    }    ...  }  ...}
Array overrunLAME – free app for MP3 audio encoding. #define SBMAX_l22int l[1+SBMAX_l]; for (r0 = 0; r0 < 16; r0++) {    ...    for (r1 = 0; r1 < 8; r1++) {      int a2 = gfc->scalefac_band.l[r0 + r1 + 2];
Priority of * and ++ operationseMuleis a client for ED2K file sharing network. STDMETHODIMP CCustomAutoComplete::Next(...,ULONG *pceltFetched){  ...  if (pceltFetched != NULL)    *pceltFetched++;  ...}(*pceltFetched)++;
Comparison mistakeWinMerge — free open source software intended for the comparison and synchronization of files and directories.BUFFERTYPE m_nBufferType[2];...// Handle unnamed buffersif ((m_nBufferType[nBuffer] == BUFFER_UNNAMED) ||    (m_nBufferType[nBuffer] == BUFFER_UNNAMED))nSaveErrorCode = SAVE_NO_FILENAME;By reviewing the code close by, this should contain:(m_nBufferType[0] == BUFFER_UNNAMED)  ||(m_nBufferType[1] == BUFFER_UNNAMED)
Forgotten array indexvoid lNormalizeVector_32f_P3IM(..., Ipp32s* mask, ...) {  Ipp32s  i;  Ipp32f  norm;  for(i=0; i<len; i++) {    if(mask<0) continue;    ...}}if(mask[i]<0) continue;IPP Samplesaresamples demonstrating how to work with Intel Performance Primitives Library 7.0.
Identical source code branchesNotepad++ - free text editor for Windows supporting syntax highlight for a variety of programming languages. if (!_isVertical)    Flags |=DT_VCENTER;  else    Flags |= DT_BOTTOM;if (!_isVertical)  Flags |= DT_BOTTOM;else  Flags |= DT_BOTTOM;
Calling incorrect function with similar nameWhat a beautiful comment. But it is sad that here we’re doing not what was intended./** Deletes all previous field specifiers.  * This should be used when dealing  * with clients that send multiple NEP_PACKET_SPEC  * messages, so only the lastPacketSpec is taken  * into account. */intNEPContext::resetClientFieldSpecs(){  this->fspecs.empty();  return OP_SUCCESS;} /* End of resetClientFieldSpecs() */Nmap Security Scanner – free utility intended for diverse customizable scanning of IP-networks with any number of objects and for identification of the statuses of the objects belonging to the network which is being scanned.
Dangerous ?: operatorNewtonGameDynamics– a well known physics engine which allows for reliable and fast simulation of environmental object’s physical behavior.den = dgFloat32 (1.0e-24f) * (den > dgFloat32(0.0f)) ? dgFloat32(1.0f) : dgFloat32(-1.0f);The priority of ?: is lower than that of multiplication operator *.
And so on, and so on…if (m_szPassword != NULL){if (m_szPassword != '\0')  {Ultimate TCP/IP libraryif (*m_szPassword != '\0')bleeding = 0;bleedx = 0,bleedy;direction = 0;Lugarubleedx = 0;bleedy = 0;
And so on, and so on…if((t=(char *)realloc(  next->name, strlen(name+1))))FCE Ultraif((t=(char *)realloc(  next->name, strlen(name)+1)))minX=max(0,minX+mcLeftStart-2);minY=max(0,minY+mcTopStart-2);maxX=min((int)width,maxX+mcRightEnd-1);maxY=min((int)height,maxX+mcBottomEnd-1);minX=max(0,minX+mcLeftStart-2);minY=max(0,minY+mcTopStart-2);maxX=min((int)width,maxX+mcRightEnd-1);maxY=min((int)height,maxY+mcBottomEnd-1);
Low level memory management operationsI want to discuss separately the heritage of programs whish were using the following functions:ZeroMemory;memset;memcpy;memcmp;…
Low level memory management operationsID_INLINE mat3_t::mat3_t( float src[3][3] ){memcpy( mat, src, sizeof( src ) );}Return to Castle WolfensteinID_INLINE mat3_t::mat3_t( float (&src)[3][3] ){memcpy( mat, src, sizeof( src ) );}itemInfo_t *itemInfo;memset( itemInfo, 0, sizeof( &itemInfo ) );memset( itemInfo, 0, sizeof( *itemInfo ) );
Low level memory management operationsCxImage – open image processing library.memset(tcmpt->stepsizes, 0,sizeof(tcmpt->numstepsizes * sizeof(uint_fast16_t)));memset(tcmpt->stepsizes, 0,tcmpt->numstepsizes * sizeof(uint_fast16_t));
Low level memory management operationsA beautiful example of 64-bit error:dgInt32 faceOffsetHitogram[256];dgSubMesh* mainSegmenst[256];memset (faceOffsetHitogram, 0, sizeof (faceOffsetHitogram));memset (mainSegmenst, 0, sizeof (faceOffsetHitogram));This code was duplicated but was not entirely corrected. As a result the size of pointer will not be equal to the size of dgInt32 type on Win64 and we will flush only a fraction of mainSegmenst array.
Low level memory management operations#define CONT_MAP_MAX 50int _iContMap[CONT_MAP_MAX];...memset(_iContMap, -1, CONT_MAP_MAX);memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));
Low level memory management operationsOGRE — open source Object-OrientedGraphicsRenderingEngine written in C++.Real w, x, y, z;...inline Quaternion(Real* valptr){memcpy(&w, valptr, sizeof(Real)*4);}Yes, at present this is not a mistake.But it is a landmine!
The earlier — the better
But why not the unit-tests only?The verification of such code parts which rarely gain control;Detection of floating bugs (undefined behavior, heisenbugs);Not all variations of source code can be covered by unit tests:Complicated calculation algorithmsinterface
Unit test will not be able to help you here, but static analysis will.FennecMediaProject– universal media-player intended for high definition audio and video playback.OPENFILENAME  lofn;...lofn.lpstrFilter = uni("All Files (*.*)\0*.*");lofn.lpstrFilter = uni("All Files (*.*)\0*.*\0");
Unit test will not be able to help you here, but static analysis will.static INT_PTR CALLBACK DlgProcTrayOpts(...){  ...EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),TRUE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE);				EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSPRIMARY),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSPRIMARY),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLE),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_MULTITRAY),FALSE);  ...}
Where can I more details about PVS-Studio?PVS-Studio – static code analyzer intended for the detection of errors in the source code of  applications developed with C/C++/C++0x. Language.Product page: http://www.viva64.com/en/pvs-studio/
Trial version: http://www.viva64.com/en/pvs-studio-download/

More Related Content

PPTX
PVS-Studio, a solution for resource intensive applications development
PDF
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
PDF
Joel Falcou, Boost.SIMD
PDF
Tiramisu をちょっと、味見してみました。
PDF
C++ amp on linux
PPT
Евгений Крутько, Многопоточные вычисления, современный подход.
PPTX
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
PDF
Valgrind
PVS-Studio, a solution for resource intensive applications development
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
Joel Falcou, Boost.SIMD
Tiramisu をちょっと、味見してみました。
C++ amp on linux
Евгений Крутько, Многопоточные вычисления, современный подход.
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Valgrind

What's hot (20)

PDF
GPU Programming on CPU - Using C++AMP
PPTX
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
PDF
C++ How I learned to stop worrying and love metaprogramming
PDF
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
PDF
PVS-Studio for Linux Went on a Tour Around Disney
PDF
Intel IPP Samples for Windows - error correction
PDF
Intel IPP Samples for Windows - error correction
PDF
Linux on System z debugging with Valgrind
PPTX
Best Bugs from Games: Fellow Programmers' Mistakes
PPTX
Accelerating Habanero-Java Program with OpenCL Generation
PPTX
PVS-Studio team experience: checking various open source projects, or mistake...
PDF
C&cpu
PDF
TVM VTA (TSIM)
PPTX
ISCA Final Presentaiton - Compilations
PDF
Implementing Lightweight Networking
PDF
Valgrind overview: runtime memory checker and a bit more aka использование #v...
PPT
Georgy Nosenko - An introduction to the use SMT solvers for software security
PDF
Programming at Compile Time
PDF
Better Embedded 2013 - Detecting Memory Leaks with Valgrind
PPTX
Дмитрий Демчук. Кроссплатформенный краш-репорт
GPU Programming on CPU - Using C++AMP
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
C++ How I learned to stop worrying and love metaprogramming
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
PVS-Studio for Linux Went on a Tour Around Disney
Intel IPP Samples for Windows - error correction
Intel IPP Samples for Windows - error correction
Linux on System z debugging with Valgrind
Best Bugs from Games: Fellow Programmers' Mistakes
Accelerating Habanero-Java Program with OpenCL Generation
PVS-Studio team experience: checking various open source projects, or mistake...
C&cpu
TVM VTA (TSIM)
ISCA Final Presentaiton - Compilations
Implementing Lightweight Networking
Valgrind overview: runtime memory checker and a bit more aka использование #v...
Georgy Nosenko - An introduction to the use SMT solvers for software security
Programming at Compile Time
Better Embedded 2013 - Detecting Memory Leaks with Valgrind
Дмитрий Демчук. Кроссплатформенный краш-репорт
Ad

Similar to Static analysis of C++ source code (20)

PPTX
PVS-Studio 5.00, a solution for developers of modern resource-intensive appl...
PDF
Beyond Breakpoints: A Tour of Dynamic Analysis
PPTX
Track c-High speed transaction-based hw-sw coverification -eve
PDF
Vectorization on x86: all you need to know
PPTX
Parallel Futures of a Game Engine
PDF
Consequences of using the Copy-Paste method in C++ programming and how to dea...
PDF
Checking the Open-Source Multi Theft Auto Game
KEY
Post Exploitation Bliss: Loading Meterpreter on a Factory iPhone, Black Hat U...
PDF
Picking Mushrooms after Cppcheck
PDF
Programar para GPUs
PDF
Safe Clearing of Private Data
PDF
How Automated Vulnerability Analysis Discovered Hundreds of Android 0-days
PDF
Skiron - Experiments in CPU Design in D
PDF
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
PDF
Anomalies in X-Ray Engine
PDF
Tesseract. Recognizing Errors in Recognition Software
PDF
426 lecture 4: AR Developer Tools
PDF
COSC 426 Lect. 3 -AR Developer Tools
PDF
maXbox Starter 45 Robotics
PDF
Windbg랑 친해지기
PVS-Studio 5.00, a solution for developers of modern resource-intensive appl...
Beyond Breakpoints: A Tour of Dynamic Analysis
Track c-High speed transaction-based hw-sw coverification -eve
Vectorization on x86: all you need to know
Parallel Futures of a Game Engine
Consequences of using the Copy-Paste method in C++ programming and how to dea...
Checking the Open-Source Multi Theft Auto Game
Post Exploitation Bliss: Loading Meterpreter on a Factory iPhone, Black Hat U...
Picking Mushrooms after Cppcheck
Programar para GPUs
Safe Clearing of Private Data
How Automated Vulnerability Analysis Discovered Hundreds of Android 0-days
Skiron - Experiments in CPU Design in D
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
Anomalies in X-Ray Engine
Tesseract. Recognizing Errors in Recognition Software
426 lecture 4: AR Developer Tools
COSC 426 Lect. 3 -AR Developer Tools
maXbox Starter 45 Robotics
Windbg랑 친해지기
Ad

More from Andrey Karpov (20)

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

Recently uploaded (20)

PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Cloud computing and distributed systems.
PDF
Electronic commerce courselecture one. Pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
KodekX | Application Modernization Development
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Machine learning based COVID-19 study performance prediction
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
A Presentation on Artificial Intelligence
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Empathic Computing: Creating Shared Understanding
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
NewMind AI Weekly Chronicles - August'25 Week I
Cloud computing and distributed systems.
Electronic commerce courselecture one. Pdf
Chapter 3 Spatial Domain Image Processing.pdf
KodekX | Application Modernization Development
Dropbox Q2 2025 Financial Results & Investor Presentation
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
The AUB Centre for AI in Media Proposal.docx
20250228 LYD VKU AI Blended-Learning.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Machine learning based COVID-19 study performance prediction
Review of recent advances in non-invasive hemoglobin estimation
A Presentation on Artificial Intelligence
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Empathic Computing: Creating Shared Understanding

Static analysis of C++ source code

  • 1. Static analysis of C++ source codeKarpovAndreyNikolaevichcandidate of science (PhD), CTOOOO «Program Verification Systems» (Co Ltd)E-mail: karpov@viva64.com
  • 2. What is this report aboutWe all make mistakes while programming and spend a lot of time fixing them.One of the methods which allows for quick detection of defects is source code static analysis.
  • 3. «One should write a quality code from the beginning» - it is not working in practice!even the best developers make mistakes and typing errors;following are the examples of mistakes detected by static code analyzer in a well known projects;PVS-Studio tool was used to perform the analysis.
  • 4. Priority of & and! operationsReturntoCastleWolfenstein – computer game, first person shooter, developed by id Software company. Game engine is available under GPL license.#define SVF_CASTAI 0x00000010if ( !ent->r.svFlags& SVF_CASTAI )if ( ! (ent->r.svFlags & SVF_CASTAI) )
  • 5. Usage of && instead of &Stickies– yellow sticky notes, just only on your monitor.#define REO_INPLACEACTIVE (0x02000000L)#define REO_OPEN (0x04000000L)if (reObj.dwFlags&& REO_INPLACEACTIVE)m_pRichEditOle->InPlaceDeactivate();if(reObj.dwFlags&& REO_OPEN) hr = reObj.poleobj->Close(OLECLOSE_NOSAVE);
  • 6. Undefined behaviorMiranda IM (Miranda Instant Messenger) – instant messaging software for Microsoft Windows.while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') {
  • 7. Usage of `delete` for an arrayChromium – open source web browser developed by Google. The development of GoogleChrome browser is based upon Chromium.auto_ptr<VARIANT> child_array(new VARIANT[child_count]);You should not useauto_ptr with arrays. Only one element is destroyed inside auto_ptr destructor:~auto_ptr() { delete _Myptr;}For example you can use boost::scoped_array as an alternative.
  • 8. Condition is always trueWinDjView is fast and small app for viewing files of DjVu format.inline boolIsValidChar(int c){ return c == 0x9 || 0xA || c == 0xD || c >= 0x20 && c <= 0xD7FF || c >= 0xE000 && c <= 0xFFFD || c >= 0x10000 && c <= 0x10FFFF;}
  • 9. Code formatting differs from it’s own logicSquirrel – interpreted programming language, which is developed to be used as a scripting language in real time applications such as computer games. if(pushval != 0) if(pushval) v->GetUp(-1) = t; else v->Pop(1);v->Pop(1); - will never be reached
  • 10. Incidental local variable declarationFCE Ultra – open source Nintendo Entertainment System console emulatorintiNesSaveAs(char* name){ ...fp = fopen(name,"wb");int x = 0; if (!fp)int x = 1; ...}
  • 11. Using char asunsigned char// check each line for illegal utf8 sequences.// If one is found, we treatthe file as ASCII,// otherwise we assumean UTF8 file.char * utf8CheckBuf = lineptr;while ((bUTF8)&&(*utf8CheckBuf)){ if ((*utf8CheckBuf == 0xC0)|| (*utf8CheckBuf == 0xC1)|| (*utf8CheckBuf >= 0xF5)) { bUTF8 = false; break; }TortoiseSVN — client of Subversion revision control system, implemented as Windows shell extension.
  • 12. Incidental use of hexadecimal valuesoCell._luminance = uint16(0.2220f*iPixel._red +0.7067f*iPixel._blue +0.0713f*iPixel._green);....oCell._luminance = 2220*iPixel._red +7067*iPixel._blue +0713*iPixel._green;eLynx Image Processing SDK and Lab
  • 13. One variable is used for two loopsLugaru— first commercial game developed by WolfireGamesindependent team.static inti,j,k,l,m;...for(j=0; j<numrepeats; j++){ ... for(i=0; i<num_joints; i++){ ... for(j=0;j<num_joints;j++){ if(joints[j].locked)freely=0; } ... } ...}
  • 14. Array overrunLAME – free app for MP3 audio encoding. #define SBMAX_l22int l[1+SBMAX_l]; for (r0 = 0; r0 < 16; r0++) { ... for (r1 = 0; r1 < 8; r1++) { int a2 = gfc->scalefac_band.l[r0 + r1 + 2];
  • 15. Priority of * and ++ operationseMuleis a client for ED2K file sharing network. STDMETHODIMP CCustomAutoComplete::Next(...,ULONG *pceltFetched){ ... if (pceltFetched != NULL) *pceltFetched++; ...}(*pceltFetched)++;
  • 16. Comparison mistakeWinMerge — free open source software intended for the comparison and synchronization of files and directories.BUFFERTYPE m_nBufferType[2];...// Handle unnamed buffersif ((m_nBufferType[nBuffer] == BUFFER_UNNAMED) || (m_nBufferType[nBuffer] == BUFFER_UNNAMED))nSaveErrorCode = SAVE_NO_FILENAME;By reviewing the code close by, this should contain:(m_nBufferType[0] == BUFFER_UNNAMED) ||(m_nBufferType[1] == BUFFER_UNNAMED)
  • 17. Forgotten array indexvoid lNormalizeVector_32f_P3IM(..., Ipp32s* mask, ...) { Ipp32s i; Ipp32f norm; for(i=0; i<len; i++) { if(mask<0) continue; ...}}if(mask[i]<0) continue;IPP Samplesaresamples demonstrating how to work with Intel Performance Primitives Library 7.0.
  • 18. Identical source code branchesNotepad++ - free text editor for Windows supporting syntax highlight for a variety of programming languages. if (!_isVertical) Flags |=DT_VCENTER; else Flags |= DT_BOTTOM;if (!_isVertical) Flags |= DT_BOTTOM;else Flags |= DT_BOTTOM;
  • 19. Calling incorrect function with similar nameWhat a beautiful comment. But it is sad that here we’re doing not what was intended./** Deletes all previous field specifiers. * This should be used when dealing * with clients that send multiple NEP_PACKET_SPEC * messages, so only the lastPacketSpec is taken * into account. */intNEPContext::resetClientFieldSpecs(){ this->fspecs.empty(); return OP_SUCCESS;} /* End of resetClientFieldSpecs() */Nmap Security Scanner – free utility intended for diverse customizable scanning of IP-networks with any number of objects and for identification of the statuses of the objects belonging to the network which is being scanned.
  • 20. Dangerous ?: operatorNewtonGameDynamics– a well known physics engine which allows for reliable and fast simulation of environmental object’s physical behavior.den = dgFloat32 (1.0e-24f) * (den > dgFloat32(0.0f)) ? dgFloat32(1.0f) : dgFloat32(-1.0f);The priority of ?: is lower than that of multiplication operator *.
  • 21. And so on, and so on…if (m_szPassword != NULL){if (m_szPassword != '\0') {Ultimate TCP/IP libraryif (*m_szPassword != '\0')bleeding = 0;bleedx = 0,bleedy;direction = 0;Lugarubleedx = 0;bleedy = 0;
  • 22. And so on, and so on…if((t=(char *)realloc( next->name, strlen(name+1))))FCE Ultraif((t=(char *)realloc( next->name, strlen(name)+1)))minX=max(0,minX+mcLeftStart-2);minY=max(0,minY+mcTopStart-2);maxX=min((int)width,maxX+mcRightEnd-1);maxY=min((int)height,maxX+mcBottomEnd-1);minX=max(0,minX+mcLeftStart-2);minY=max(0,minY+mcTopStart-2);maxX=min((int)width,maxX+mcRightEnd-1);maxY=min((int)height,maxY+mcBottomEnd-1);
  • 23. Low level memory management operationsI want to discuss separately the heritage of programs whish were using the following functions:ZeroMemory;memset;memcpy;memcmp;…
  • 24. Low level memory management operationsID_INLINE mat3_t::mat3_t( float src[3][3] ){memcpy( mat, src, sizeof( src ) );}Return to Castle WolfensteinID_INLINE mat3_t::mat3_t( float (&src)[3][3] ){memcpy( mat, src, sizeof( src ) );}itemInfo_t *itemInfo;memset( itemInfo, 0, sizeof( &itemInfo ) );memset( itemInfo, 0, sizeof( *itemInfo ) );
  • 25. Low level memory management operationsCxImage – open image processing library.memset(tcmpt->stepsizes, 0,sizeof(tcmpt->numstepsizes * sizeof(uint_fast16_t)));memset(tcmpt->stepsizes, 0,tcmpt->numstepsizes * sizeof(uint_fast16_t));
  • 26. Low level memory management operationsA beautiful example of 64-bit error:dgInt32 faceOffsetHitogram[256];dgSubMesh* mainSegmenst[256];memset (faceOffsetHitogram, 0, sizeof (faceOffsetHitogram));memset (mainSegmenst, 0, sizeof (faceOffsetHitogram));This code was duplicated but was not entirely corrected. As a result the size of pointer will not be equal to the size of dgInt32 type on Win64 and we will flush only a fraction of mainSegmenst array.
  • 27. Low level memory management operations#define CONT_MAP_MAX 50int _iContMap[CONT_MAP_MAX];...memset(_iContMap, -1, CONT_MAP_MAX);memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));
  • 28. Low level memory management operationsOGRE — open source Object-OrientedGraphicsRenderingEngine written in C++.Real w, x, y, z;...inline Quaternion(Real* valptr){memcpy(&w, valptr, sizeof(Real)*4);}Yes, at present this is not a mistake.But it is a landmine!
  • 29. The earlier — the better
  • 30. But why not the unit-tests only?The verification of such code parts which rarely gain control;Detection of floating bugs (undefined behavior, heisenbugs);Not all variations of source code can be covered by unit tests:Complicated calculation algorithmsinterface
  • 31. Unit test will not be able to help you here, but static analysis will.FennecMediaProject– universal media-player intended for high definition audio and video playback.OPENFILENAME lofn;...lofn.lpstrFilter = uni("All Files (*.*)\0*.*");lofn.lpstrFilter = uni("All Files (*.*)\0*.*\0");
  • 32. Unit test will not be able to help you here, but static analysis will.static INT_PTR CALLBACK DlgProcTrayOpts(...){ ...EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),TRUE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSPRIMARY),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSPRIMARY),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLE),FALSE);EnableWindow(GetDlgItem(hwndDlg,IDC_MULTITRAY),FALSE); ...}
  • 33. Where can I more details about PVS-Studio?PVS-Studio – static code analyzer intended for the detection of errors in the source code of applications developed with C/C++/C++0x. Language.Product page: http://www.viva64.com/en/pvs-studio/
  • 35. Documentation: http://www.viva64.com/en/d/PVS-Studiocan be integrated into VisualStudio 2005/2008/2010 IDE.
  • 36. Questions ?Contacts:KarpovAndreyNikolaevichcandidate of science (PhD), CTOOOO «Program Verification Systems» (Co Ltd)Site: http://www.viva64.comE-mail: karpov@viva64.comTwitter: https://twitter.com/Code_Analysis