SlideShare a Scribd company logo
A Check of the Open-Source Project 
WinSCP Developed in Embarcadero C++ 
Builder 
Author: Andrey Karpov 
Date: 24.04.2014 
C++ Builder support in PVS-Studio had been dropped after version 5.20. If you have any questions, feel 
free to contact our support. 
We regularly check open-source C/C++ projects, but what we check are mostly projects developed in the 
Visual Studio IDE. For some reason, we haven't paid much attention to the Embarcadero C++ Builder 
IDE. In order to improve this situation, we are going to discuss the WinSCP project I have checked 
recently. 
WinSCP 
WinSCP is a free and open-source SFTP, SCP and FTP client for Microsoft Windows. Its main function is 
secure file transfer between a local and a remote computer. Beyond this, WinSCP offers basic file 
manager and file synchronization functionality. Since July 16, 2003, it is licensed under the GNU GPL and 
hosted on SourceForge.net. 
The official website: http://winscp.net 
You need Embarcadero C++ Builder XE2 to build the project. 
Analysis 
Analysis was done with the PVS-Studio static analyzer. The tool currently supports the following IDEs: 
• Visual Studio 2013 C, C++, C++11, C++/CX (WinRT) 
• Visual Studio 2012 C, C++, C++11, C++/CX (WinRT)
• Visual Studio 2010 C, C++, C++0x 
• Visual Studio 2008 C, C++ 
• Visual Studio 2005 C, C++ 
• Embarcadero RAD Studio XE5 C, C++, C++11, 64-bit compiler included 
• Embarcadero RAD Studio XE4 C, C++, C++11, 64-bit compiler included 
• Embarcadero RAD Studio XE3 Update 1 C, C++, C++11, 64-bit compiler included 
• Embarcadero RAD Studio XE2 C, C++, C++0x 
• Embarcadero RAD Studio XE C, C++ 
• Embarcadero RAD Studio 2010 C, C++ 
• Embarcadero RAD Studio 2009 C, C++ 
• MinGW C, C++, C++11 
Besides, you can also work in PVS-Studio Standalone. It allows checking *.i files prepared in advance and 
monitoring the project build process in order to collect all the necessary information for a check. To find 
out more about it, see the article "PVS-Studio Now Supports Any Build System under Windows and Any 
Compiler". 
Analysis results 
There are not many errors in the project - but still enough to write an article to attract Embarcadero 
RAD Studio users' attention. 
Memset() function's arguments mixed up 
TForm * __fastcall TMessageForm::Create(....) 
{ 
.... 
LOGFONT AFont; 
.... 
memset(&AFont, sizeof(AFont), 0); 
.... 
} 
PVS-Studio's diagnostic message: V575 The 'memset' function processes '0' elements. Inspect the third 
argument. messagedlg.cpp 786 
The memset() function receives an array size as the third argument. It's an ordinary but very unpleasant 
typo resulting in the structure remaining uninitialized. 
There is a similar typo a bit farther in the code: messagedlg.cpp 796 
Using a nonexistent object 
void __fastcall TCustomScpExplorerForm::EditorAutoConfig() 
{
.... 
else 
{ 
.... 
TEditorList EditorList; 
EditorList = *WinConfiguration->EditorList; 
EditorList.Insert(0, new TEditorPreferences(EditorData)); 
WinConfiguration->EditorList = &EditorList; 
} 
.... 
} 
PVS-Studio's diagnostic message: V506 Pointer to local variable 'EditorList' is stored outside the scope of 
this variable. Such a pointer will become invalid. customscpexplorer.cpp 2633 
The 'EditorList' object will be destroyed immediately after leaving the scope. However, the programmer 
saves a pointer to this object and uses it after that. It leads to undefined behavior. 
Garbage in a dialog 
bool __fastcall RecursiveDeleteFile(....) 
{ 
SHFILEOPSTRUCT Data; 
memset(&Data, 0, sizeof(Data)); 
.... 
Data.pTo = L""; 
.... 
} 
PVS-Studio's diagnostic message: V540 Member 'pTo' should point to string terminated by two 0 
characters. common.cpp 1659 
Notice the following line in the pTo parameter's description in MSDN: "Note This string must be double-null 
terminated". 
Because of the error, the file-handling dialog will contain garbage - or it will not. It all depends on how 
lucky you are. But the code is incorrect anyway. 
A duplicated line 
int CFileZillaApi::Init(....)
{ 
.... 
m_pMainThread->m_hOwnerWnd=m_hOwnerWnd; 
m_pMainThread->m_hOwnerWnd=m_hOwnerWnd; 
.... 
} 
PVS-Studio's diagnostic message: V519 The 'm_pMainThread->m_hOwnerWnd' variable is assigned 
values twice successively. Perhaps this is a mistake. Check lines: 88, 89. filezillaapi.cpp 89 
Perhaps there is no error here - just one extra line written by mistake. 
Failed check 
STDMETHODIMP CShellExtClassFactory::CreateInstance(....) 
{ 
.... 
CShellExt* ShellExt = new CShellExt(); 
if (NULL == ShellExt) 
{ 
return E_OUTOFMEMORY; 
} 
.... 
} 
PVS-Studio's diagnostic message: V668 There is no sense in testing the 'ShellExt' pointer against null, as 
the memory was allocated using the 'new' operator. The exception will be generated in the case of 
memory allocation error. dragext.cpp 554 
The check "if (NULL == ShellExt)" is meaningless as the 'new' operator will throw the std::bad_alloc 
exception if it fails to allocate memory. 
A dangerous way to use the fprintf() function 
bool CAsyncSslSocketLayer::CreateSslCertificate(....) 
{ 
.... 
char buffer[1001]; 
int len; 
while ((len = pBIO_read(bio, buffer, 1000)) > 0)
{ 
buffer[len] = 0; 
fprintf(file, buffer); 
} 
.... 
} 
V618 It's dangerous to call the 'fprintf' function in such a manner, as the line being passed could contain 
format specification. The example of the safe code: printf("%s", str); asyncsslsocketlayer.cpp 2247 
If the buffer contains control specifiers while data are being written into the file, it will lead to an 
unpredictable result. The safe way of using the function is as follows: 
fprintf(file, "%s", buffer); 
This error can also be treated as a potential vulnerability. 
Something wrong with the 'err' variable 
static error_t 
client_send_propfind_request(....) 
{ 
.... 
error_t err = 0; 
int code = 0; 
apr_hash_t * props = NULL; 
const char * target = path_uri_encode(remote_path, pool); 
char * url_path = apr_pstrdup(pool, target); 
WEBDAV_ERR(neon_get_props(&props, ras, url_path, 
NEON_DEPTH_ZERO, starting_props, 
false, pool)); 
if (err && (err == WEBDAV_ERR_DAV_REQUEST_FAILED)) 
.... 
}
PVS-Studio's diagnostic message: V560 A part of conditional expression is always false: (err == 1003). 
webdavfilesystem.cpp 10990 
Conclusion 
Where are you, Embarcadero RAD Studio users? Hey! According to our statistics, they are very few. 
Well, come and try the PVS-Studio static analyzer!

More Related Content

PPTX
PVS-Studio for Linux (CoreHard presentation)
PPTX
200 Open Source Projects Later: Source Code Static Analysis Experience
PDF
Top 10 bugs in C++ open source projects, checked in 2016
PDF
Picking Mushrooms after Cppcheck
PDF
100 bugs in Open Source C/C++ projects
PDF
Analyzing the Dolphin-emu project
PDF
Valgrind overview: runtime memory checker and a bit more aka использование #v...
PDF
LibRaw, Coverity SCAN, PVS-Studio
PVS-Studio for Linux (CoreHard presentation)
200 Open Source Projects Later: Source Code Static Analysis Experience
Top 10 bugs in C++ open source projects, checked in 2016
Picking Mushrooms after Cppcheck
100 bugs in Open Source C/C++ projects
Analyzing the Dolphin-emu project
Valgrind overview: runtime memory checker and a bit more aka использование #v...
LibRaw, Coverity SCAN, PVS-Studio

What's hot (20)

PDF
The CppCat Analyzer Checks TortoiseGit
PPTX
Best Bugs from Games: Fellow Programmers' Mistakes
PDF
Bug fix sharing : where does bug come from
PDF
How to make a large C++-code base manageable
PPT
Virtual platform
PDF
Heading for a Record: Chromium, the 5th Check
PPTX
What has to be paid attention when reviewing code of the library you develop
PPTX
C++ Code as Seen by a Hypercritical Reviewer
PDF
Processor Verification Using Open Source Tools and the GCC Regression Test Suite
PDF
Linux version of PVS-Studio couldn't help checking CodeLite
PDF
The Little Unicorn That Could
PDF
用 Go 語言打造多台機器 Scale 架構
PPTX
08 - Return Oriented Programming, the chosen one
PDF
Работа с реляционными базами данных в C++
PPTX
PVS-Studio 5.00, a solution for developers of modern resource-intensive appl...
PDF
Linux Kernel, tested by the Linux-version of PVS-Studio
PDF
Presentation buffer overflow attacks and theircountermeasures
PDF
[COSCUP 2020] How to use llvm frontend library-libtooling
PPT
Server Side JavaScript: Ajax.org O3
PPT
Server Side JavaScript: Ajax.org O3.
The CppCat Analyzer Checks TortoiseGit
Best Bugs from Games: Fellow Programmers' Mistakes
Bug fix sharing : where does bug come from
How to make a large C++-code base manageable
Virtual platform
Heading for a Record: Chromium, the 5th Check
What has to be paid attention when reviewing code of the library you develop
C++ Code as Seen by a Hypercritical Reviewer
Processor Verification Using Open Source Tools and the GCC Regression Test Suite
Linux version of PVS-Studio couldn't help checking CodeLite
The Little Unicorn That Could
用 Go 語言打造多台機器 Scale 架構
08 - Return Oriented Programming, the chosen one
Работа с реляционными базами данных в C++
PVS-Studio 5.00, a solution for developers of modern resource-intensive appl...
Linux Kernel, tested by the Linux-version of PVS-Studio
Presentation buffer overflow attacks and theircountermeasures
[COSCUP 2020] How to use llvm frontend library-libtooling
Server Side JavaScript: Ajax.org O3
Server Side JavaScript: Ajax.org O3.
Ad

Viewers also liked (6)

PPTX
Toronto User groups workshop - 2013-03-10 - HTML5 & Windows 8, friends with b...
PDF
Lean mean php machine
PDF
MWNW Toronto Community Night - Make Web Not War
PDF
Technology Alliance Partner
PPTX
AspectizeAndYou
PPTX
Where Content Goes to Die - An ExactTarget Connections Presentation by Chris ...
Toronto User groups workshop - 2013-03-10 - HTML5 & Windows 8, friends with b...
Lean mean php machine
MWNW Toronto Community Night - Make Web Not War
Technology Alliance Partner
AspectizeAndYou
Where Content Goes to Die - An ExactTarget Connections Presentation by Chris ...
Ad

Similar to A Check of the Open-Source Project WinSCP Developed in Embarcadero C++ Builder (20)

PDF
Rechecking TortoiseSVN with the PVS-Studio Code Analyzer
PDF
How to make fewer errors at the stage of code writing. Part N4.
PDF
CppCat Static Analyzer Review
PDF
100 bugs in Open Source C/C++ projects
PDF
Analyzing Firebird 3.0
PDF
Analyzing Firebird 3.0
PDF
I just had to check ICQ project
PDF
Checking WinMerge with PVS-Studio for the second time
PDF
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
PDF
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
PDF
Checking Oracle VM VirtualBox. Part 2
PDF
A Slipshod Check of the Visual C++ 2013 Library (update 3)
PPTX
The operation principles of PVS-Studio static code analyzer
PDF
How to Improve Visual C++ 2017 Libraries Using PVS-Studio
PDF
Bugs found in GCC with the help of PVS-Studio
PDF
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
PDF
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
PDF
The Unicorn's Travel to the Microcosm
PDF
Checking Oracle VM VirtualBox. Part 1
PDF
A Spin-off: CryEngine 3 SDK Checked with CppCat
Rechecking TortoiseSVN with the PVS-Studio Code Analyzer
How to make fewer errors at the stage of code writing. Part N4.
CppCat Static Analyzer Review
100 bugs in Open Source C/C++ projects
Analyzing Firebird 3.0
Analyzing Firebird 3.0
I just had to check ICQ project
Checking WinMerge with PVS-Studio for the second time
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...
Checking Oracle VM VirtualBox. Part 2
A Slipshod Check of the Visual C++ 2013 Library (update 3)
The operation principles of PVS-Studio static code analyzer
How to Improve Visual C++ 2017 Libraries Using PVS-Studio
Bugs found in GCC with the help of PVS-Studio
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
Comparing the general static analysis in Visual Studio 2010 and PVS-Studio by...
The Unicorn's Travel to the Microcosm
Checking Oracle VM VirtualBox. Part 1
A Spin-off: CryEngine 3 SDK Checked with CppCat

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
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
PDF
PVS-Studio Static Analyzer as a Tool for Protection against Zero-Day Vulnerab...
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?
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
PVS-Studio Static Analyzer as a Tool for Protection against Zero-Day Vulnerab...

Recently uploaded (20)

PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
AI in Product Development-omnex systems
PDF
Understanding Forklifts - TECH EHS Solution
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Online Work Permit System for Fast Permit Processing
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
medical staffing services at VALiNTRY
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
Wondershare Filmora 15 Crack With Activation Key [2025
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Softaken Excel to vCard Converter Software.pdf
AI in Product Development-omnex systems
Understanding Forklifts - TECH EHS Solution
How to Choose the Right IT Partner for Your Business in Malaysia
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
ManageIQ - Sprint 268 Review - Slide Deck
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
How Creative Agencies Leverage Project Management Software.pdf
Odoo Companies in India – Driving Business Transformation.pdf
Online Work Permit System for Fast Permit Processing
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
How to Migrate SBCGlobal Email to Yahoo Easily
medical staffing services at VALiNTRY
Design an Analysis of Algorithms II-SECS-1021-03
PTS Company Brochure 2025 (1).pdf.......
2025 Textile ERP Trends: SAP, Odoo & Oracle

A Check of the Open-Source Project WinSCP Developed in Embarcadero C++ Builder

  • 1. A Check of the Open-Source Project WinSCP Developed in Embarcadero C++ Builder Author: Andrey Karpov Date: 24.04.2014 C++ Builder support in PVS-Studio had been dropped after version 5.20. If you have any questions, feel free to contact our support. We regularly check open-source C/C++ projects, but what we check are mostly projects developed in the Visual Studio IDE. For some reason, we haven't paid much attention to the Embarcadero C++ Builder IDE. In order to improve this situation, we are going to discuss the WinSCP project I have checked recently. WinSCP WinSCP is a free and open-source SFTP, SCP and FTP client for Microsoft Windows. Its main function is secure file transfer between a local and a remote computer. Beyond this, WinSCP offers basic file manager and file synchronization functionality. Since July 16, 2003, it is licensed under the GNU GPL and hosted on SourceForge.net. The official website: http://winscp.net You need Embarcadero C++ Builder XE2 to build the project. Analysis Analysis was done with the PVS-Studio static analyzer. The tool currently supports the following IDEs: • Visual Studio 2013 C, C++, C++11, C++/CX (WinRT) • Visual Studio 2012 C, C++, C++11, C++/CX (WinRT)
  • 2. • Visual Studio 2010 C, C++, C++0x • Visual Studio 2008 C, C++ • Visual Studio 2005 C, C++ • Embarcadero RAD Studio XE5 C, C++, C++11, 64-bit compiler included • Embarcadero RAD Studio XE4 C, C++, C++11, 64-bit compiler included • Embarcadero RAD Studio XE3 Update 1 C, C++, C++11, 64-bit compiler included • Embarcadero RAD Studio XE2 C, C++, C++0x • Embarcadero RAD Studio XE C, C++ • Embarcadero RAD Studio 2010 C, C++ • Embarcadero RAD Studio 2009 C, C++ • MinGW C, C++, C++11 Besides, you can also work in PVS-Studio Standalone. It allows checking *.i files prepared in advance and monitoring the project build process in order to collect all the necessary information for a check. To find out more about it, see the article "PVS-Studio Now Supports Any Build System under Windows and Any Compiler". Analysis results There are not many errors in the project - but still enough to write an article to attract Embarcadero RAD Studio users' attention. Memset() function's arguments mixed up TForm * __fastcall TMessageForm::Create(....) { .... LOGFONT AFont; .... memset(&AFont, sizeof(AFont), 0); .... } PVS-Studio's diagnostic message: V575 The 'memset' function processes '0' elements. Inspect the third argument. messagedlg.cpp 786 The memset() function receives an array size as the third argument. It's an ordinary but very unpleasant typo resulting in the structure remaining uninitialized. There is a similar typo a bit farther in the code: messagedlg.cpp 796 Using a nonexistent object void __fastcall TCustomScpExplorerForm::EditorAutoConfig() {
  • 3. .... else { .... TEditorList EditorList; EditorList = *WinConfiguration->EditorList; EditorList.Insert(0, new TEditorPreferences(EditorData)); WinConfiguration->EditorList = &EditorList; } .... } PVS-Studio's diagnostic message: V506 Pointer to local variable 'EditorList' is stored outside the scope of this variable. Such a pointer will become invalid. customscpexplorer.cpp 2633 The 'EditorList' object will be destroyed immediately after leaving the scope. However, the programmer saves a pointer to this object and uses it after that. It leads to undefined behavior. Garbage in a dialog bool __fastcall RecursiveDeleteFile(....) { SHFILEOPSTRUCT Data; memset(&Data, 0, sizeof(Data)); .... Data.pTo = L""; .... } PVS-Studio's diagnostic message: V540 Member 'pTo' should point to string terminated by two 0 characters. common.cpp 1659 Notice the following line in the pTo parameter's description in MSDN: "Note This string must be double-null terminated". Because of the error, the file-handling dialog will contain garbage - or it will not. It all depends on how lucky you are. But the code is incorrect anyway. A duplicated line int CFileZillaApi::Init(....)
  • 4. { .... m_pMainThread->m_hOwnerWnd=m_hOwnerWnd; m_pMainThread->m_hOwnerWnd=m_hOwnerWnd; .... } PVS-Studio's diagnostic message: V519 The 'm_pMainThread->m_hOwnerWnd' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 88, 89. filezillaapi.cpp 89 Perhaps there is no error here - just one extra line written by mistake. Failed check STDMETHODIMP CShellExtClassFactory::CreateInstance(....) { .... CShellExt* ShellExt = new CShellExt(); if (NULL == ShellExt) { return E_OUTOFMEMORY; } .... } PVS-Studio's diagnostic message: V668 There is no sense in testing the 'ShellExt' pointer against null, as the memory was allocated using the 'new' operator. The exception will be generated in the case of memory allocation error. dragext.cpp 554 The check "if (NULL == ShellExt)" is meaningless as the 'new' operator will throw the std::bad_alloc exception if it fails to allocate memory. A dangerous way to use the fprintf() function bool CAsyncSslSocketLayer::CreateSslCertificate(....) { .... char buffer[1001]; int len; while ((len = pBIO_read(bio, buffer, 1000)) > 0)
  • 5. { buffer[len] = 0; fprintf(file, buffer); } .... } V618 It's dangerous to call the 'fprintf' function in such a manner, as the line being passed could contain format specification. The example of the safe code: printf("%s", str); asyncsslsocketlayer.cpp 2247 If the buffer contains control specifiers while data are being written into the file, it will lead to an unpredictable result. The safe way of using the function is as follows: fprintf(file, "%s", buffer); This error can also be treated as a potential vulnerability. Something wrong with the 'err' variable static error_t client_send_propfind_request(....) { .... error_t err = 0; int code = 0; apr_hash_t * props = NULL; const char * target = path_uri_encode(remote_path, pool); char * url_path = apr_pstrdup(pool, target); WEBDAV_ERR(neon_get_props(&props, ras, url_path, NEON_DEPTH_ZERO, starting_props, false, pool)); if (err && (err == WEBDAV_ERR_DAV_REQUEST_FAILED)) .... }
  • 6. PVS-Studio's diagnostic message: V560 A part of conditional expression is always false: (err == 1003). webdavfilesystem.cpp 10990 Conclusion Where are you, Embarcadero RAD Studio users? Hey! According to our statistics, they are very few. Well, come and try the PVS-Studio static analyzer!