2008-12-18 22:28:57 +01:00
/*
2009-01-21 21:04:20 +01:00
* Cppcheck - A tool for static C / C + + code analysis
2023-01-28 10:16:34 +01:00
* Copyright ( C ) 2007 - 2023 Cppcheck team .
2008-12-18 22:28:57 +01:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2009-09-27 17:08:31 +02:00
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
2008-12-18 22:28:57 +01:00
*/
2013-09-04 20:59:49 +02:00
//---------------------------------------------------------------------------
# ifndef cppcheckH
# define cppcheckH
//---------------------------------------------------------------------------
2008-12-18 22:28:57 +01:00
2017-05-27 04:33:47 +02:00
# include "analyzerinfo.h"
# include "check.h"
2021-07-08 21:21:35 +02:00
# include "color.h"
2012-06-10 14:19:09 +02:00
# include "config.h"
2010-08-03 16:36:21 +02:00
# include "errorlogger.h"
2017-05-27 04:33:47 +02:00
# include "settings.h"
2010-08-03 16:36:21 +02:00
2022-01-27 19:03:20 +01:00
# include <cstddef>
2022-09-24 11:59:13 +02:00
# include <fstream> // IWYU pragma: keep
2020-05-23 07:16:49 +02:00
# include <functional>
2017-05-27 04:33:47 +02:00
# include <list>
# include <map>
2023-10-16 19:43:15 +02:00
# include <set>
2017-05-27 04:33:47 +02:00
# include <string>
aligned and optimized unique error handling (#5280)
The handling in `CppCheck::reportErr()` and `Executor::hasToLog()` was
slightly different. I hope this can somehow be shared after the executor
reworking.
We were also using a very inappropriate container for the error list
which caused a lot of overhead.
`-D__GNUC__ --debug-warnings --template=daca2 --check-library -j2
../test/testsymboldatabase.cpp`
Clang 15
main process `284,218,587` -> `175,691,241`
worker process `9,123,697,183` -> `8,951,903,360`
2023-12-17 21:59:06 +01:00
# include <unordered_set>
2023-10-21 16:58:29 +02:00
# include <utility>
2022-01-27 19:03:20 +01:00
# include <vector>
2008-12-18 22:28:57 +01:00
2014-05-23 20:58:28 +02:00
class Tokenizer ;
2023-10-09 10:07:20 +02:00
enum class SHOWTIME_MODES ;
2023-11-02 17:42:41 +01:00
struct FileSettings ;
2014-05-23 20:58:28 +02:00
2009-07-17 10:49:01 +02:00
/// @addtogroup Core
/// @{
2008-12-18 22:28:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief This is the base class which will use other classes to do
2008-12-18 22:28:57 +01:00
* static code analysis for C and C + + code to find possible
* errors or places that could be improved .
* Usage : See check ( ) for more info .
*/
2012-06-10 14:19:09 +02:00
class CPPCHECKLIB CppCheck : ErrorLogger {
2009-01-05 16:49:57 +01:00
public :
2023-09-20 10:40:57 +02:00
using ExecuteCmdFn = std : : function < int ( std : : string , std : : vector < std : : string > , std : : string , std : : string & ) > ;
2009-01-05 16:49:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief Constructor .
2009-01-05 16:49:57 +01:00
*/
2020-05-19 16:04:25 +02:00
CppCheck ( ErrorLogger & errorLogger ,
bool useGlobalSuppressions ,
2023-09-20 10:40:57 +02:00
ExecuteCmdFn executeCommand ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief Destructor .
2009-01-05 16:49:57 +01:00
*/
2022-02-10 23:02:24 +01:00
~ CppCheck ( ) override ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief This starts the actual checking . Note that you must call
2009-01-05 16:49:57 +01:00
* parseFromArgs ( ) or settings ( ) and addFile ( ) before calling this .
2009-01-08 22:30:25 +01:00
* @ return amount of errors found or 0 if none were found .
2009-01-05 16:49:57 +01:00
*/
2011-04-24 18:10:25 +02:00
/**
2021-08-07 20:51:18 +02:00
* @ brief Check the file .
* This function checks one given file for errors .
* @ param path Path to the file to check .
* @ return amount of errors found or 0 if none were found .
* @ note You must set settings before calling this function ( by calling
* settings ( ) ) .
*/
2011-04-24 18:10:25 +02:00
unsigned int check ( const std : : string & path ) ;
2023-11-02 17:42:41 +01:00
unsigned int check ( const FileSettings & fs ) ;
2011-04-24 18:10:25 +02:00
/**
2021-08-07 20:51:18 +02:00
* @ brief Check the file .
* This function checks one " virtual " file . The file is not read from
* the disk but the content is given in @ p content . In errors the @ p path
* is used as a filename .
* @ param path Path to the file to check .
* @ param content File content as a string .
* @ return amount of errors found or 0 if none were found .
* @ note You must set settings before calling this function ( by calling
* settings ( ) ) .
*/
2011-04-24 18:10:25 +02:00
unsigned int check ( const std : : string & path , const std : : string & content ) ;
2008-12-18 22:28:57 +01:00
2009-02-09 21:51:04 +01:00
/**
2011-02-16 02:12:15 +01:00
* @ brief Get reference to current settings .
* @ return a reference to current settings
2009-02-09 21:51:04 +01:00
*/
2011-02-16 02:12:15 +01:00
Settings & settings ( ) ;
2009-02-09 21:51:04 +01:00
2009-10-25 21:06:58 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief Returns current version number as a string .
2009-10-25 21:06:58 +01:00
* @ return version , e . g . " 1.38 "
*/
static const char * version ( ) ;
2009-10-17 11:34:17 +02:00
2011-08-11 16:34:59 +02:00
/**
* @ brief Returns extra version info as a string .
* This is for returning extra version info , like Git commit id , build
* time / date etc .
* @ return extra version info , e . g . " 04d42151 " ( Git commit id ) .
*/
static const char * extraVersion ( ) ;
2010-04-03 21:53:06 +02:00
/**
* @ brief Call all " getErrorMessages " in all registered Check classes .
2010-12-15 18:45:53 +01:00
* Also print out XML header and footer .
2010-04-03 21:53:06 +02:00
*/
2023-04-16 13:54:21 +02:00
static void getErrorMessages ( ErrorLogger & errorlogger ) ;
2010-04-03 21:53:06 +02:00
2020-12-27 21:05:31 +01:00
void tooManyConfigsError ( const std : : string & file , const int numberOfConfigurations ) ;
2014-09-02 18:05:02 +02:00
void purgedConfigurationMessage ( const std : : string & file , const std : : string & configuration ) ;
2012-12-26 18:35:49 +01:00
2016-11-05 21:26:56 +01:00
/** Analyse whole program, run this after all TUs has been scanned.
* This is deprecated and the plan is to remove this when
2018-01-12 08:24:01 +01:00
* . analyzeinfo is good enough .
* Return true if an error is reported .
2016-11-05 21:26:56 +01:00
*/
2018-01-12 08:24:01 +01:00
bool analyseWholeProgram ( ) ;
2014-11-15 10:43:49 +01:00
2020-01-30 07:14:17 +01:00
/** Analyze all files using clang-tidy */
2023-11-02 17:42:41 +01:00
void analyseClangTidy ( const FileSettings & fileSettings ) ;
2020-01-30 07:14:17 +01:00
2016-11-05 21:26:56 +01:00
/** analyse whole program use .analyzeinfo files */
2023-11-07 21:21:24 +01:00
void analyseWholeProgram ( const std : : string & buildDir , const std : : list < std : : pair < std : : string , std : : size_t > > & files , const std : : list < FileSettings > & fileSettings ) ;
2016-11-05 21:26:56 +01:00
2015-01-07 19:26:16 +01:00
/** Check if the user wants to check for unused functions
* and if it ' s possible at all */
2016-10-28 12:10:19 +02:00
bool isUnusedFunctionCheckEnabled ( ) const ;
2015-01-07 19:26:16 +01:00
2023-01-18 17:32:14 +01:00
/** Remove *.ctu-info files */
2023-11-07 21:21:24 +01:00
void removeCtuInfoFiles ( const std : : list < std : : pair < std : : string , std : : size_t > > & files , const std : : list < FileSettings > & fileSettings ) ; // cppcheck-suppress functionConst // has side effects
2023-01-18 17:32:14 +01:00
2023-10-05 19:04:06 +02:00
static void resetTimerResults ( ) ;
static void printTimerResults ( SHOWTIME_MODES mode ) ;
2009-01-05 16:49:57 +01:00
private :
2023-05-04 10:54:19 +02:00
# ifdef HAVE_RULES
2019-03-17 08:19:56 +01:00
/** Are there "simple" rules */
bool hasRule ( const std : : string & tokenlist ) const ;
2023-05-04 10:54:19 +02:00
# endif
2019-03-17 08:19:56 +01:00
2015-01-12 23:09:17 +01:00
/** @brief There has been an internal error => Report information message */
2013-05-09 18:50:24 +02:00
void internalError ( const std : : string & filename , const std : : string & msg ) ;
2013-08-31 13:17:15 +02:00
/**
2018-04-21 13:28:26 +02:00
* @ brief Check a file using stream
2013-08-31 10:28:21 +02:00
* @ param filename file name
2016-08-13 10:50:03 +02:00
* @ param cfgname cfg name
2014-10-03 10:40:48 +02:00
* @ param fileStream stream the file content can be read from
2018-04-21 13:28:26 +02:00
* @ return number of errors found
2013-08-31 10:28:21 +02:00
*/
2023-04-30 20:16:51 +02:00
unsigned int checkFile ( const std : : string & filename , const std : : string & cfgname , std : : istream * fileStream = nullptr ) ;
2011-04-24 18:10:25 +02:00
2015-05-25 21:15:55 +02:00
/**
2015-12-11 10:22:06 +01:00
* @ brief Check raw tokens
2017-08-21 21:13:01 +02:00
* @ param tokenizer tokenizer instance
2015-05-25 21:15:55 +02:00
*/
2015-12-11 10:22:06 +01:00
void checkRawTokens ( const Tokenizer & tokenizer ) ;
/**
* @ brief Check normal tokens
2017-08-21 21:13:01 +02:00
* @ param tokenizer tokenizer instance
2015-12-11 10:22:06 +01:00
*/
void checkNormalTokens ( const Tokenizer & tokenizer ) ;
2021-02-06 19:06:05 +01:00
/**
* Execute addons
*/
2023-11-04 17:07:30 +01:00
void executeAddons ( const std : : vector < std : : string > & files , const std : : string & file0 ) ;
void executeAddons ( const std : : string & dumpFile , const std : : string & file0 ) ;
2021-02-06 19:06:05 +01:00
2021-07-07 10:58:13 +02:00
/**
* Execute addons
*/
2023-11-07 21:21:24 +01:00
void executeAddonsWholeProgram ( const std : : list < std : : pair < std : : string , std : : size_t > > & files ) ;
2021-07-07 10:58:13 +02:00
2023-05-04 10:54:19 +02:00
# ifdef HAVE_RULES
2013-06-09 14:58:56 +02:00
/**
* @ brief Execute rules , if any
* @ param tokenlist token list to use ( normal / simple )
* @ param tokenizer tokenizer
*/
void executeRules ( const std : : string & tokenlist , const Tokenizer & tokenizer ) ;
2023-05-04 10:54:19 +02:00
# endif
2013-06-09 14:58:56 +02:00
2009-01-05 16:49:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief Errors and warnings are directed here .
2009-01-05 16:49:57 +01:00
*
2009-06-20 11:54:49 +02:00
* @ param msg Errors messages are normally in format
2009-01-05 16:49:57 +01:00
* " [filepath:line number] Message " , e . g .
* " [main.cpp:4] Uninitialized member variable "
*/
2022-02-10 23:02:24 +01:00
void reportErr ( const ErrorMessage & msg ) override ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
/**
2010-03-14 18:55:33 +01:00
* @ brief Information about progress is directed here .
2009-01-05 16:49:57 +01:00
*
2009-06-20 11:54:49 +02:00
* @ param outmsg Message to show , e . g . " Checking main.cpp... "
2009-01-05 16:49:57 +01:00
*/
2022-02-10 23:02:24 +01:00
void reportOut ( const std : : string & outmsg , Color c = Color : : Reset ) override ;
2019-12-27 19:05:10 +01:00
aligned and optimized unique error handling (#5280)
The handling in `CppCheck::reportErr()` and `Executor::hasToLog()` was
slightly different. I hope this can somehow be shared after the executor
reworking.
We were also using a very inappropriate container for the error list
which caused a lot of overhead.
`-D__GNUC__ --debug-warnings --template=daca2 --check-library -j2
../test/testsymboldatabase.cpp`
Clang 15
main process `284,218,587` -> `175,691,241`
worker process `9,123,697,183` -> `8,951,903,360`
2023-12-17 21:59:06 +01:00
// TODO: store hashes instead of the full messages
std : : unordered_set < std : : string > mErrorList ;
2018-06-16 16:10:28 +02:00
Settings mSettings ;
2010-03-14 18:55:33 +01:00
2022-02-10 23:02:24 +01:00
void reportProgress ( const std : : string & filename , const char stage [ ] , const std : : size_t value ) override ;
2010-08-08 08:45:37 +02:00
2018-06-16 16:10:28 +02:00
ErrorLogger & mErrorLogger ;
2008-12-18 22:28:57 +01:00
2010-03-14 18:55:33 +01:00
/** @brief Current preprocessor configuration */
2018-06-17 07:40:13 +02:00
std : : string mCurrentConfig ;
2012-05-14 20:46:23 +02:00
2023-10-16 19:43:15 +02:00
using Location = std : : pair < std : : string , int > ;
std : : map < Location , std : : set < std : : string > > mLocationMacros ; // What macros are used on a location?
2023-08-08 11:05:02 +02:00
unsigned int mExitCode { } ;
2012-05-14 20:46:23 +02:00
2018-06-17 07:29:07 +02:00
bool mUseGlobalSuppressions ;
2012-12-26 18:35:49 +01:00
/** Are there too many configs? */
2023-08-08 11:05:02 +02:00
bool mTooManyConfigs { } ;
2013-05-11 11:35:04 +02:00
2014-11-15 10:43:49 +01:00
/** File info used for whole program analysis */
2018-06-17 07:36:05 +02:00
std : : list < Check : : FileInfo * > mFileInfo ;
2016-10-29 12:18:11 +02:00
2018-06-17 07:31:34 +02:00
AnalyzerInformation mAnalyzerInformation ;
2020-05-19 16:04:25 +02:00
/** Callback for executing a shell command (exe, args, output) */
2023-09-20 10:40:57 +02:00
ExecuteCmdFn mExecuteCommand ;
2022-09-24 11:59:13 +02:00
std : : ofstream mPlistFile ;
2008-12-18 22:28:57 +01:00
} ;
2009-07-17 10:49:01 +02:00
/// @}
2013-09-04 20:59:49 +02:00
//---------------------------------------------------------------------------
# endif // cppcheckH