2009-01-31 20:29:27 +01:00
/*
* Cppcheck - A tool for static C / C + + code analysis
2018-06-10 22:07:21 +02:00
* Copyright ( C ) 2007 - 2018 Cppcheck team .
2009-01-31 20:29:27 +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/>.
2009-01-31 20:29:27 +01:00
*/
//---------------------------------------------------------------------------
2013-09-04 20:59:49 +02:00
# ifndef checkotherH
# define checkotherH
2009-01-31 20:29:27 +01:00
//---------------------------------------------------------------------------
2009-03-20 18:16:21 +01:00
# include "check.h"
2017-05-27 04:33:47 +02:00
# include "config.h"
# include "valueflow.h"
# include <cstddef>
# include <string>
# include <vector>
2009-01-31 20:29:27 +01:00
2017-05-27 04:33:47 +02:00
class ErrorLogger ;
class Settings ;
class Token ;
class Tokenizer ;
2012-05-24 15:34:59 +02:00
class Variable ;
2009-03-20 18:16:21 +01:00
2009-07-17 10:49:01 +02:00
/// @addtogroup Checks
/// @{
2010-03-14 19:11:03 +01:00
/** @brief Various small checks */
2012-06-10 14:19:09 +02:00
class CPPCHECKLIB CheckOther : public Check {
2009-01-31 20:29:27 +01:00
public :
2010-03-14 19:11:03 +01:00
/** @brief This constructor is used when registering the CheckClass */
2014-11-20 14:20:09 +01:00
CheckOther ( ) : Check ( myName ( ) ) {
2013-08-07 16:27:37 +02:00
}
2009-03-20 18:16:21 +01:00
2010-03-17 22:16:18 +01:00
/** @brief This constructor is used when running checks. */
2009-03-20 18:16:21 +01:00
CheckOther ( const Tokenizer * tokenizer , const Settings * settings , ErrorLogger * errorLogger )
2014-11-20 14:20:09 +01:00
: Check ( myName ( ) , tokenizer , settings , errorLogger ) {
2013-08-07 16:27:37 +02:00
}
2009-03-20 18:16:21 +01:00
2010-03-14 19:11:03 +01:00
/** @brief Run checks against the normal token list */
2018-05-15 16:37:40 +02:00
void runChecks ( const Tokenizer * tokenizer , const Settings * settings , ErrorLogger * errorLogger ) override {
2009-03-21 07:53:23 +01:00
CheckOther checkOther ( tokenizer , settings , errorLogger ) ;
2009-03-27 15:55:14 +01:00
2012-03-27 21:29:50 +02:00
// Checks
2010-04-21 08:38:25 +02:00
checkOther . warningOldStylePointerCast ( ) ;
2012-02-26 11:56:32 +01:00
checkOther . invalidPointerCast ( ) ;
2010-04-21 08:38:25 +02:00
checkOther . checkCharVariable ( ) ;
2012-09-02 13:09:32 +02:00
checkOther . checkRedundantAssignment ( ) ;
2010-06-30 09:10:30 +02:00
checkOther . checkRedundantAssignmentInSwitch ( ) ;
2012-12-07 21:27:32 +01:00
checkOther . checkSuspiciousCaseInSwitch ( ) ;
2011-04-09 23:05:27 +02:00
checkOther . checkDuplicateBranch ( ) ;
2011-04-10 16:25:02 +02:00
checkOther . checkDuplicateExpression ( ) ;
2011-12-03 11:43:23 +01:00
checkOther . checkUnreachableCode ( ) ;
2011-10-11 08:41:39 +02:00
checkOther . checkSuspiciousSemicolon ( ) ;
2011-04-09 21:14:01 +02:00
checkOther . checkVariableScope ( ) ;
2012-03-28 18:33:34 +02:00
checkOther . checkSignOfUnsignedVariable ( ) ; // don't ignore casts (#3574)
2012-08-24 11:28:50 +02:00
checkOther . checkIncompleteArrayFill ( ) ;
2013-01-13 12:02:10 +01:00
checkOther . checkVarFuncNullUB ( ) ;
2013-06-10 08:13:08 +02:00
checkOther . checkNanInArithmeticExpression ( ) ;
2013-06-15 17:49:10 +02:00
checkOther . checkCommaSeparatedReturn ( ) ;
2015-01-17 14:33:14 +01:00
checkOther . checkRedundantPointerOp ( ) ;
2015-07-26 22:08:36 +02:00
checkOther . checkZeroDivision ( ) ;
2015-12-26 15:20:17 +01:00
checkOther . checkNegativeBitwiseShift ( ) ;
2015-08-30 16:45:47 +02:00
checkOther . checkInterlockedDecrement ( ) ;
checkOther . checkUnusedLabel ( ) ;
2015-12-24 09:13:20 +01:00
checkOther . checkEvaluationOrder ( ) ;
2017-01-05 08:52:11 +01:00
checkOther . checkFuncArgNamesDifferent ( ) ;
2018-10-16 20:17:27 +02:00
checkOther . checkShadowVariables ( ) ;
2009-03-21 07:53:23 +01:00
}
2010-03-14 19:11:03 +01:00
/** @brief Run checks against the simplified token list */
2018-05-15 16:37:40 +02:00
void runSimplifiedChecks ( const Tokenizer * tokenizer , const Settings * settings , ErrorLogger * errorLogger ) override {
2009-03-20 18:16:21 +01:00
CheckOther checkOther ( tokenizer , settings , errorLogger ) ;
2012-03-27 21:29:50 +02:00
// Checks
2011-01-24 21:40:49 +01:00
checkOther . clarifyCalculation ( ) ;
2012-08-24 11:28:50 +02:00
checkOther . clarifyStatement ( ) ;
2016-07-28 13:19:24 +02:00
checkOther . checkPassByReference ( ) ;
2010-04-21 08:38:25 +02:00
checkOther . checkIncompleteStatement ( ) ;
2013-02-27 21:02:12 +01:00
checkOther . checkCastIntToCharAndBack ( ) ;
2009-03-20 18:16:21 +01:00
2010-10-01 17:23:22 +02:00
checkOther . checkMisusedScopedObject ( ) ;
2013-02-17 17:33:32 +01:00
checkOther . checkPipeParameterSize ( ) ;
2011-07-28 08:12:21 +02:00
2012-09-05 08:31:23 +02:00
checkOther . checkInvalidFree ( ) ;
2012-07-22 09:17:00 +02:00
checkOther . checkRedundantCopy ( ) ;
2013-01-18 08:03:04 +01:00
checkOther . checkSuspiciousEqualityComparison ( ) ;
2013-09-26 07:07:48 +02:00
checkOther . checkComparisonFunctionIsAlwaysTrueOrFalse ( ) ;
2016-11-20 15:14:49 +01:00
checkOther . checkAccessOfMovedVariable ( ) ;
2009-03-20 18:16:21 +01:00
}
2009-01-31 20:29:27 +01:00
2011-01-24 21:40:49 +01:00
/** @brief Clarify calculation for ".. a * b ? .." */
void clarifyCalculation ( ) ;
2012-08-24 11:28:50 +02:00
/** @brief Suspicious statement like '*A++;' */
void clarifyStatement ( ) ;
2010-03-18 18:59:55 +01:00
/** @brief Are there C-style pointer casts in a c++ file? */
2009-07-05 22:16:43 +02:00
void warningOldStylePointerCast ( ) ;
2009-01-31 20:29:27 +01:00
2012-02-26 11:56:32 +01:00
/** @brief Check for pointer casts to a type with an incompatible binary data representation */
void invalidPointerCast ( ) ;
2010-03-18 18:59:55 +01:00
/** @brief %Check scope of variables */
2009-07-05 22:16:43 +02:00
void checkVariableScope ( ) ;
2013-03-12 15:42:00 +01:00
static bool checkInnerScope ( const Token * tok , const Variable * var , bool & used ) ;
2009-01-31 20:29:27 +01:00
2013-06-15 17:49:10 +02:00
/** @brief %Check for comma separated statements in return */
void checkCommaSeparatedReturn ( ) ;
2016-07-28 13:19:24 +02:00
/** @brief %Check for function parameters that should be passed by reference */
void checkPassByReference ( ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief Using char variable as array index / as operand in bit operation */
2009-07-05 22:16:43 +02:00
void checkCharVariable ( ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief Incomplete statement. A statement that only contains a constant or variable */
2009-07-05 22:16:43 +02:00
void checkIncompleteStatement ( ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief %Check zero division*/
2009-07-05 22:16:43 +02:00
void checkZeroDivision ( ) ;
2009-03-28 07:49:47 +01:00
2013-06-10 08:13:08 +02:00
/** @brief Check for NaN (not-a-number) in an arithmetic expression */
void checkNanInArithmeticExpression ( ) ;
2013-02-10 07:43:09 +01:00
/** @brief copying to memory or assigning to a variable twice */
2012-09-02 13:09:32 +02:00
void checkRedundantAssignment ( ) ;
2010-06-30 09:10:30 +02:00
/** @brief %Check for assigning to the same variable twice in a switch statement*/
void checkRedundantAssignmentInSwitch ( ) ;
2012-12-07 21:27:32 +01:00
/** @brief %Check for code like 'case A||B:'*/
void checkSuspiciousCaseInSwitch ( ) ;
2013-01-18 08:03:04 +01:00
/** @brief %Check for code like 'case A||B:'*/
void checkSuspiciousEqualityComparison ( ) ;
2010-10-01 17:23:22 +02:00
/** @brief %Check for objects that are destroyed immediately */
void checkMisusedScopedObject ( ) ;
2011-04-09 23:05:27 +02:00
/** @brief %Check for suspicious code where if and else branch are the same (e.g "if (a) b = true; else b = true;") */
void checkDuplicateBranch ( ) ;
2011-04-10 16:25:02 +02:00
/** @brief %Check for suspicious code with the same expression on both sides of operator (e.g "if (a && a)") */
void checkDuplicateExpression ( ) ;
2011-12-03 11:43:23 +01:00
/** @brief %Check for code that gets never executed, such as duplicate break statements */
void checkUnreachableCode ( ) ;
2011-07-15 02:12:56 +02:00
2011-08-07 01:23:09 +02:00
/** @brief %Check for testing sign of unsigned variable */
void checkSignOfUnsignedVariable ( ) ;
2011-10-11 08:41:39 +02:00
/** @brief %Check for suspicious use of semicolon */
void checkSuspiciousSemicolon ( ) ;
2012-09-05 08:31:23 +02:00
/** @brief %Check for free() operations on invalid memory locations */
void checkInvalidFree ( ) ;
2012-11-06 06:02:51 +01:00
void invalidFreeError ( const Token * tok , bool inconclusive ) ;
2012-09-05 08:31:23 +02:00
2012-08-24 00:03:22 +02:00
/** @brief %Check for code creating redundant copies */
2012-07-22 09:17:00 +02:00
void checkRedundantCopy ( ) ;
2012-01-15 01:19:34 +01:00
2014-09-09 07:24:59 +02:00
/** @brief %Check for bitwise shift with negative right operand */
2012-08-22 15:44:20 +02:00
void checkNegativeBitwiseShift ( ) ;
2012-08-24 11:28:50 +02:00
/** @brief %Check for buffers that are filled incompletely with memset and similar functions */
void checkIncompleteArrayFill ( ) ;
2013-02-27 21:05:18 +01:00
/** @brief %Check that variadic function calls don't use NULL. If NULL is \#defined as 0 and the function expects a pointer, the behaviour is undefined. */
2013-01-13 12:02:10 +01:00
void checkVarFuncNullUB ( ) ;
2013-02-17 17:33:32 +01:00
/** @brief %Check that calling the POSIX pipe() system call is called with an integer array of size two. */
void checkPipeParameterSize ( ) ;
2013-02-27 21:02:12 +01:00
/** @brief %Check to avoid casting a return value to unsigned char and then back to integer type. */
void checkCastIntToCharAndBack ( ) ;
2013-11-09 16:07:28 +01:00
/** @brief %Check for using of comparison functions evaluating always to true or false. */
2014-04-12 23:28:13 +02:00
void checkComparisonFunctionIsAlwaysTrueOrFalse ( ) ;
2013-09-26 07:07:48 +02:00
2015-01-17 14:33:14 +01:00
/** @brief %Check for redundant pointer operations */
void checkRedundantPointerOp ( ) ;
2015-08-30 16:45:47 +02:00
/** @brief %Check for race condition with non-interlocked access after InterlockedDecrement() */
2015-08-05 11:20:28 +02:00
void checkInterlockedDecrement ( ) ;
2015-08-30 16:45:47 +02:00
/** @brief %Check for unused labels */
void checkUnusedLabel ( ) ;
2015-12-24 09:13:20 +01:00
/** @brief %Check for expression that depends on order of evaluation of side effects */
void checkEvaluationOrder ( ) ;
2016-11-20 15:14:49 +01:00
/** @brief %Check for access of moved or forwarded variable */
void checkAccessOfMovedVariable ( ) ;
2017-01-05 08:52:11 +01:00
/** @brief %Check if function declaration and definition argument names different */
void checkFuncArgNamesDifferent ( ) ;
2018-10-16 20:17:27 +02:00
/** @brief %Check for shadow variables. Less noisy than gcc/clang -Wshadow. */
void checkShadowVariables ( ) ;
2012-03-11 11:01:39 +01:00
private :
2018-12-02 11:41:27 +01:00
2012-08-24 00:03:22 +02:00
// Error messages..
lib: fix a bunch of warnings about differing function arguments in definition and declaration.
[lib/token.h:72] -> [lib/token.cpp:36]: (style, inconclusive) Function 'Token' argument 1 names different: declaration 'tokensBack' definition 't'.
[lib/token.h:445] -> [lib/token.cpp:497]: (style, inconclusive) Function 'multiCompare' argument 1 names different: declaration 'needle' definition 'tok'.
[lib/checkio.h:73] -> [lib/checkio.cpp:1385]: (style, inconclusive) Function 'ArgumentInfo' argument 3 names different: declaration 'isCPP' definition '_isCPP'.
[lib/checkother.h:216] -> [lib/checkother.cpp:2136]: (style, inconclusive) Function 'checkComparisonFunctionIsAlwaysTrueOrFalseError' argument 2 names different: declaration 'strFunctionName' definition 'functionName'.
[lib/errorlogger.h:214] -> [lib/errorlogger.cpp:51]: (style, inconclusive) Function 'ErrorMessage' argument 2 names different: declaration 'file0' definition 'file0_'.
[lib/errorlogger.h:215] -> [lib/errorlogger.cpp:65]: (style, inconclusive) Function 'ErrorMessage' argument 2 names different: declaration 'file0' definition 'file0_'.
[lib/library.h:327] -> [lib/library.cpp:1043]: (style, inconclusive) Function 'ignorefunction' argument 1 names different: declaration 'function' definition 'functionName'.
[lib/mathlib.h:112] -> [lib/mathlib.cpp:1275]: (style, inconclusive) Function 'isNullValue' argument 1 names different: declaration 'tok' definition 'str'.
[lib/preprocessor.h:91] -> [lib/preprocessor.cpp:122]: (style, inconclusive) Function 'setDirectives' argument 1 names different: declaration 'tokens' definition 'tokens1'.
[lib/symboldatabase.h:860] -> [lib/symboldatabase.cpp:1801]: (style, inconclusive) Function 'argsMatch' argument 1 names different: declaration 'info' definition 'scope'.
[lib/symboldatabase.h:1171] -> [lib/symboldatabase.cpp:2048]: (style, inconclusive) Function 'addClassFunction' argument 1 names different: declaration 'info' definition 'scope'.
[lib/symboldatabase.h:1174] -> [lib/symboldatabase.cpp:2208]: (style, inconclusive) Function 'addNewFunction' argument 1 names different: declaration 'info' definition 'scope'.
[lib/symboldatabase.h:1090] -> [lib/symboldatabase.cpp:3648]: (style, inconclusive) Function 'findVariableType' argument 2 names different: declaration 'type' definition 'typeTok'.
[lib/symboldatabase.h:1101] -> [lib/symboldatabase.cpp:4308]: (style, inconclusive) Function 'findType' argument 1 names different: declaration 'tok' definition 'startTok'.
[lib/symboldatabase.h:1176] -> [lib/symboldatabase.cpp:4349]: (style, inconclusive) Function 'findTypeInNested' argument 1 names different: declaration 'tok' definition 'startTok'.
[lib/symboldatabase.h:1193] -> [lib/symboldatabase.cpp:4501]: (style, inconclusive) Function 'setValueType' argument 2 names different: declaration 'enumerators' definition 'enumerator'.
[lib/path.h:159] -> [lib/path.cpp:247]: (style, inconclusive) Function 'isCPP' argument 1 names different: declaration 'extensionInLowerCase' definition 'path'.
[lib/path.h:145] -> [lib/path.cpp:266]: (style, inconclusive) Function 'acceptFile' argument 1 names different: declaration 'filename' definition 'path'.
2017-04-03 00:06:46 +02:00
void checkComparisonFunctionIsAlwaysTrueOrFalseError ( const Token * tok , const std : : string & functionName , const std : : string & varName , const bool result ) ;
2013-02-27 21:02:12 +01:00
void checkCastIntToCharAndBackError ( const Token * tok , const std : : string & strFunctionName ) ;
2013-02-17 17:33:32 +01:00
void checkPipeParameterSizeError ( const Token * tok , const std : : string & strVarName , const std : : string & strDim ) ;
2012-03-11 11:01:39 +01:00
void clarifyCalculationError ( const Token * tok , const std : : string & op ) ;
2012-09-15 20:19:02 +02:00
void clarifyStatementError ( const Token * tok ) ;
2009-03-21 17:58:13 +01:00
void cstyleCastError ( const Token * tok ) ;
2012-03-25 12:55:39 +02:00
void invalidPointerCastError ( const Token * tok , const std : : string & from , const std : : string & to , bool inconclusive ) ;
2016-07-28 13:19:24 +02:00
void passedByValueError ( const Token * tok , const std : : string & parname , bool inconclusive ) ;
2009-03-21 17:58:13 +01:00
void constStatementError ( const Token * tok , const std : : string & type ) ;
2016-02-08 08:08:35 +01:00
void signedCharArrayIndexError ( const Token * tok ) ;
void unknownSignCharArrayIndexError ( const Token * tok ) ;
2009-03-21 17:58:13 +01:00
void charBitOpError ( const Token * tok ) ;
void variableScopeError ( const Token * tok , const std : : string & varname ) ;
2017-05-15 20:05:11 +02:00
void zerodivError ( const Token * tok , const ValueFlow : : Value * value ) ;
2013-06-10 08:13:08 +02:00
void nanInArithmeticExpressionError ( const Token * tok ) ;
2013-02-15 18:01:10 +01:00
void redundantAssignmentError ( const Token * tok1 , const Token * tok2 , const std : : string & var , bool inconclusive ) ;
2012-09-02 13:09:32 +02:00
void redundantAssignmentInSwitchError ( const Token * tok1 , const Token * tok2 , const std : : string & var ) ;
void redundantCopyError ( const Token * tok1 , const Token * tok2 , const std : : string & var ) ;
void redundantCopyInSwitchError ( const Token * tok1 , const Token * tok2 , const std : : string & var ) ;
2012-05-29 06:19:22 +02:00
void redundantBitwiseOperationInSwitchError ( const Token * tok , const std : : string & varname ) ;
2012-12-07 21:27:32 +01:00
void suspiciousCaseInSwitchError ( const Token * tok , const std : : string & operatorString ) ;
2013-01-18 08:03:04 +01:00
void suspiciousEqualityComparisonError ( const Token * tok ) ;
2010-08-15 06:28:22 +02:00
void selfAssignmentError ( const Token * tok , const std : : string & varname ) ;
2010-10-01 17:23:22 +02:00
void misusedScopeObjectError ( const Token * tok , const std : : string & varname ) ;
2018-10-18 11:56:23 +02:00
void duplicateBranchError ( const Token * tok1 , const Token * tok2 , ErrorPath errors ) ;
2018-10-17 06:57:33 +02:00
void duplicateAssignExpressionError ( const Token * tok1 , const Token * tok2 , bool inconclusive ) ;
2018-10-05 08:36:49 +02:00
void oppositeExpressionError ( const Token * opTok , ErrorPath errors ) ;
2018-08-07 09:32:16 +02:00
void duplicateExpressionError ( const Token * tok1 , const Token * tok2 , const Token * opTok , ErrorPath errors ) ;
2018-04-03 21:43:55 +02:00
void duplicateValueTernaryError ( const Token * tok ) ;
2018-10-01 14:31:06 +02:00
void duplicateExpressionTernaryError ( const Token * tok , ErrorPath errors ) ;
2012-04-05 10:38:29 +02:00
void duplicateBreakError ( const Token * tok , bool inconclusive ) ;
void unreachableCodeError ( const Token * tok , bool inconclusive ) ;
2011-11-06 18:24:37 +01:00
void unsignedLessThanZeroError ( const Token * tok , const std : : string & varname , bool inconclusive ) ;
2012-08-21 12:28:02 +02:00
void pointerLessThanZeroError ( const Token * tok , bool inconclusive ) ;
2011-11-06 18:24:37 +01:00
void unsignedPositiveError ( const Token * tok , const std : : string & varname , bool inconclusive ) ;
2012-08-21 12:28:02 +02:00
void pointerPositiveError ( const Token * tok , bool inconclusive ) ;
2012-08-24 00:03:22 +02:00
void SuspiciousSemicolonError ( const Token * tok ) ;
2015-11-29 16:28:55 +01:00
void negativeBitwiseShiftError ( const Token * tok , int op ) ;
2012-07-22 09:17:00 +02:00
void redundantCopyError ( const Token * tok , const std : : string & varname ) ;
2012-08-24 11:28:50 +02:00
void incompleteArrayFillError ( const Token * tok , const std : : string & buffer , const std : : string & function , bool boolean ) ;
2013-01-13 12:02:10 +01:00
void varFuncNullUBError ( const Token * tok ) ;
2013-06-15 17:49:10 +02:00
void commaSeparatedReturnError ( const Token * tok ) ;
2015-01-17 14:33:14 +01:00
void redundantPointerOpError ( const Token * tok , const std : : string & varname , bool inconclusive ) ;
2015-08-05 11:20:28 +02:00
void raceAfterInterlockedDecrementError ( const Token * tok ) ;
2016-01-31 12:04:28 +01:00
void unusedLabelError ( const Token * tok , bool inSwitch ) ;
2015-12-24 09:13:20 +01:00
void unknownEvaluationOrder ( const Token * tok ) ;
2016-11-20 15:14:49 +01:00
static bool isMovedParameterAllowedForInconclusiveFunction ( const Token * tok ) ;
2017-10-10 15:49:15 +02:00
void accessMovedError ( const Token * tok , const std : : string & varname , const ValueFlow : : Value * value , bool inconclusive ) ;
2017-03-24 22:01:05 +01:00
void funcArgNamesDifferent ( const std : : string & functionName , size_t index , const Token * declaration , const Token * definition ) ;
void funcArgOrderDifferent ( const std : : string & functionName , const Token * declaration , const Token * definition , const std : : vector < const Token * > & declarations , const std : : vector < const Token * > & definitions ) ;
2018-11-19 07:00:15 +01:00
void shadowError ( const Token * var , const Token * shadowed , bool shadowVar ) ;
2012-07-22 09:17:00 +02:00
2018-05-15 16:37:40 +02:00
void getErrorMessages ( ErrorLogger * errorLogger , const Settings * settings ) const override {
2016-05-07 16:30:54 +02:00
CheckOther c ( nullptr , settings , errorLogger ) ;
2010-12-29 12:43:29 +01:00
2018-08-07 09:32:16 +02:00
ErrorPath errorPath ;
2009-10-04 13:46:37 +02:00
// error
2017-05-15 20:05:11 +02:00
c . zerodivError ( nullptr , nullptr ) ;
2016-05-07 16:30:54 +02:00
c . misusedScopeObjectError ( nullptr , " varname " ) ;
c . invalidPointerCastError ( nullptr , " float " , " double " , false ) ;
c . negativeBitwiseShiftError ( nullptr , 1 ) ;
2016-12-22 09:40:19 +01:00
c . negativeBitwiseShiftError ( nullptr , 2 ) ;
2016-05-07 16:30:54 +02:00
c . checkPipeParameterSizeError ( nullptr , " varname " , " dimension " ) ;
c . raceAfterInterlockedDecrementError ( nullptr ) ;
2018-06-20 10:43:13 +02:00
c . invalidFreeError ( nullptr , false ) ;
2009-10-04 13:46:37 +02:00
2012-07-22 09:17:00 +02:00
//performance
2016-05-07 16:30:54 +02:00
c . redundantCopyError ( nullptr , " varname " ) ;
2017-08-09 20:00:26 +02:00
c . redundantCopyError ( nullptr , nullptr , " var " ) ;
c . redundantAssignmentError ( nullptr , nullptr , " var " , false ) ;
2012-07-22 09:17:00 +02:00
2010-10-31 10:07:35 +01:00
// style/warning
2016-05-07 16:30:54 +02:00
c . checkComparisonFunctionIsAlwaysTrueOrFalseError ( nullptr , " isless " , " varName " , false ) ;
c . checkCastIntToCharAndBackError ( nullptr , " func_name " ) ;
c . cstyleCastError ( nullptr ) ;
2018-04-20 17:33:42 +02:00
c . passedByValueError ( nullptr , " parametername " , false ) ;
2016-05-07 16:30:54 +02:00
c . constStatementError ( nullptr , " type " ) ;
c . signedCharArrayIndexError ( nullptr ) ;
c . unknownSignCharArrayIndexError ( nullptr ) ;
c . charBitOpError ( nullptr ) ;
c . variableScopeError ( nullptr , " varname " ) ;
2017-08-09 20:00:26 +02:00
c . redundantAssignmentInSwitchError ( nullptr , nullptr , " var " ) ;
c . redundantCopyInSwitchError ( nullptr , nullptr , " var " ) ;
2016-05-07 16:30:54 +02:00
c . suspiciousCaseInSwitchError ( nullptr , " || " ) ;
c . suspiciousEqualityComparisonError ( nullptr ) ;
c . selfAssignmentError ( nullptr , " varname " ) ;
c . clarifyCalculationError ( nullptr , " + " ) ;
c . clarifyStatementError ( nullptr ) ;
2018-10-18 11:56:23 +02:00
c . duplicateBranchError ( nullptr , nullptr , errorPath ) ;
2018-10-17 06:57:33 +02:00
c . duplicateAssignExpressionError ( nullptr , nullptr , true ) ;
2018-10-05 08:36:49 +02:00
c . oppositeExpressionError ( nullptr , errorPath ) ;
2018-08-07 09:32:16 +02:00
c . duplicateExpressionError ( nullptr , nullptr , nullptr , errorPath ) ;
2018-04-03 21:43:55 +02:00
c . duplicateValueTernaryError ( nullptr ) ;
2018-10-01 14:31:06 +02:00
c . duplicateExpressionTernaryError ( nullptr , errorPath ) ;
2016-05-07 16:30:54 +02:00
c . duplicateBreakError ( nullptr , false ) ;
c . unreachableCodeError ( nullptr , false ) ;
c . unsignedLessThanZeroError ( nullptr , " varname " , false ) ;
c . unsignedPositiveError ( nullptr , " varname " , false ) ;
c . pointerLessThanZeroError ( nullptr , false ) ;
c . pointerPositiveError ( nullptr , false ) ;
c . SuspiciousSemicolonError ( nullptr ) ;
c . incompleteArrayFillError ( nullptr , " buffer " , " memset " , false ) ;
c . varFuncNullUBError ( nullptr ) ;
c . nanInArithmeticExpressionError ( nullptr ) ;
c . commaSeparatedReturnError ( nullptr ) ;
c . redundantPointerOpError ( nullptr , " varname " , false ) ;
c . unusedLabelError ( nullptr , true ) ;
c . unusedLabelError ( nullptr , false ) ;
c . unknownEvaluationOrder ( nullptr ) ;
2017-10-10 15:49:15 +02:00
c . accessMovedError ( nullptr , " v " , nullptr , false ) ;
2017-01-05 08:52:11 +01:00
c . funcArgNamesDifferent ( " function " , 1 , nullptr , nullptr ) ;
2018-06-20 10:43:13 +02:00
c . redundantBitwiseOperationInSwitchError ( nullptr , " varname " ) ;
2018-11-19 07:00:15 +01:00
c . shadowError ( nullptr , nullptr , false ) ;
c . shadowError ( nullptr , nullptr , true ) ;
2017-01-05 08:52:11 +01:00
2018-04-04 21:51:31 +02:00
const std : : vector < const Token * > nullvec ;
2017-01-05 08:52:11 +01:00
c . funcArgOrderDifferent ( " function " , nullptr , nullptr , nullvec , nullvec ) ;
2009-03-22 08:20:15 +01:00
}
2014-11-20 14:20:09 +01:00
static std : : string myName ( ) {
2009-06-12 15:20:08 +02:00
return " Other " ;
}
2018-05-15 16:37:40 +02:00
std : : string classInfo ( ) const override {
2009-06-12 12:19:37 +02:00
return " Other checks \n "
2009-10-04 13:46:37 +02:00
// error
2014-09-30 14:56:12 +02:00
" - division with zero \n "
" - scoped object destroyed immediately after construction \n "
" - assignment in an assert statement \n "
" - free() or delete of an invalid memory location \n "
" - bitwise operation with negative right operand \n "
" - provide wrong dimensioned array to pipe() system command (--std=posix) \n "
" - cast the return values of getc(),fgetc() and getchar() to character and compare it to EOF \n "
2015-08-05 11:20:28 +02:00
" - race condition with non-interlocked access after InterlockedDecrement() call \n "
2015-12-24 09:13:20 +01:00
" - expression 'x = x++;' depends on order of evaluation of side effects \n "
2010-05-04 08:14:45 +02:00
2013-09-07 07:40:10 +02:00
// warning
2014-09-30 14:56:12 +02:00
" - either division by zero or useless condition \n "
2016-11-20 15:14:49 +01:00
" - access of moved or forwarded variable. \n "
2013-09-07 07:40:10 +02:00
2014-02-15 19:06:00 +01:00
// performance
2014-09-30 14:56:12 +02:00
" - redundant data copying for const variable \n "
" - subsequent assignment or copying to a variable or buffer \n "
2016-07-28 13:19:24 +02:00
" - passing parameter by value \n "
2012-07-22 09:17:00 +02:00
2014-02-15 19:06:00 +01:00
// portability
2015-01-03 17:55:03 +01:00
" - Passing NULL pointer to function with variable number of arguments leads to UB. \n "
2014-02-15 19:06:00 +01:00
2009-10-29 21:34:43 +01:00
// style
2015-01-03 17:55:03 +01:00
" - C-style pointer cast in C++ code \n "
2014-09-30 14:56:12 +02:00
" - casting between incompatible pointer types \n "
" - [Incomplete statement](IncompleteStatement) \n "
" - [check how signed char variables are used](CharVar) \n "
" - variable scope can be limited \n "
" - unusual pointer arithmetic. For example: \" abc \" + 'd' \n "
2015-01-03 17:55:03 +01:00
" - redundant assignment, increment, or bitwise operation in a switch statement \n "
2014-09-30 14:56:12 +02:00
" - redundant strcpy in a switch statement \n "
" - Suspicious case labels in switch() \n "
2015-01-03 17:55:03 +01:00
" - assignment of a variable to itself \n "
2014-09-30 14:56:12 +02:00
" - Comparison of values leading always to true or false \n "
" - Clarify calculation with parentheses \n "
2018-10-11 13:59:21 +02:00
" - suspicious comparison of ' \\ 0' with a char \\ * variable \n "
2014-09-30 14:56:12 +02:00
" - duplicate break statement \n "
" - unreachable code \n "
2015-01-03 17:55:03 +01:00
" - testing if unsigned variable is negative/positive \n "
2014-09-30 14:56:12 +02:00
" - Suspicious use of ; at the end of 'if/for/while' statement. \n "
" - Array filled incompletely using memset/memcpy/memmove. \n "
" - NaN (not a number) value used in arithmetic expression. \n "
" - comma in return statement (the comma can easily be misread as a semicolon). \n "
2015-01-03 17:55:03 +01:00
" - prefer erfc, expm1 or log1p to avoid loss of precision. \n "
2015-01-17 14:33:14 +01:00
" - identical code in both branches of if/else or ternary operator. \n "
2018-10-11 13:59:21 +02:00
" - redundant pointer operation on pointer like & \\ *some_ptr. \n "
2017-01-05 08:52:11 +01:00
" - find unused 'goto' labels. \n "
" - function declaration and definition argument names different. \n "
2018-10-16 20:17:27 +02:00
" - function declaration and definition argument order different. \n "
" - shadow variable. \n " ;
2009-06-12 12:19:37 +02:00
}
2012-08-24 00:03:22 +02:00
} ;
/// @}
//---------------------------------------------------------------------------
2013-09-04 20:59:49 +02:00
# endif // checkotherH