2009-01-31 20:29:27 +01:00
/*
* Cppcheck - A tool for static C / C + + code analysis
2013-01-01 17:29:08 +01:00
* Copyright ( C ) 2007 - 2013 Daniel Marjamäki and 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
*/
//---------------------------------------------------------------------------
# ifndef CheckOtherH
# define CheckOtherH
//---------------------------------------------------------------------------
2012-06-10 14:19:09 +02:00
# include "config.h"
2009-03-20 18:16:21 +01:00
# include "check.h"
# include "settings.h"
2009-01-31 20:29:27 +01:00
2009-03-20 18:16:21 +01:00
class Token ;
2011-11-10 21:49:14 +01:00
class Function ;
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 */
2011-02-02 10:29:10 +01:00
CheckOther ( ) : Check ( myName ( ) )
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 )
2011-02-02 10:29:10 +01:00
: Check ( myName ( ) , tokenizer , settings , errorLogger )
2009-03-20 18:16:21 +01:00
{ }
2010-03-14 19:11:03 +01:00
/** @brief Run checks against the normal token list */
2011-10-13 20:53:06 +02:00
void runChecks ( const Tokenizer * tokenizer , const Settings * settings , ErrorLogger * errorLogger ) {
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 . checkUnsignedDivision ( ) ;
checkOther . checkCharVariable ( ) ;
2010-04-26 21:43:01 +02:00
checkOther . strPlusChar ( ) ;
2010-05-15 14:06:45 +02:00
checkOther . sizeofsizeof ( ) ;
2010-08-06 22:57:10 +02:00
checkOther . sizeofCalculation ( ) ;
2012-11-09 18:08:20 +01:00
checkOther . suspiciousSizeofCalculation ( ) ;
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 ( ) ;
2010-10-10 22:05:06 +02:00
checkOther . checkAssignmentInAssert ( ) ;
2011-01-22 19:21:56 +01:00
checkOther . checkSizeofForArrayParameter ( ) ;
2012-03-23 21:47:13 +01:00
checkOther . checkSizeofForPointerSize ( ) ;
2011-05-16 21:16:25 +02:00
checkOther . checkSizeofForNumericParameter ( ) ;
2011-02-04 20:55:38 +01:00
checkOther . checkSelfAssignment ( ) ;
2011-04-09 21:14:01 +02:00
checkOther . checkDuplicateIf ( ) ;
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 ( ) ;
2011-03-13 12:16:55 +01:00
checkOther . clarifyCondition ( ) ; // not simplified because ifAssign
2011-10-10 19:11:17 +02:00
checkOther . checkComparisonOfBoolExpressionWithInt ( ) ;
2012-12-02 08:34:30 +01:00
checkOther . checkComparisonOfBoolWithInt ( ) ;
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 ( ) ;
2012-08-24 14:25:17 +02:00
checkOther . checkSuspiciousStringCompare ( ) ;
2013-01-13 12:02:10 +01:00
checkOther . checkVarFuncNullUB ( ) ;
2009-03-21 07:53:23 +01:00
}
2010-03-14 19:11:03 +01:00
/** @brief Run checks against the simplified token list */
2011-10-13 20:53:06 +02:00
void runSimplifiedChecks ( const Tokenizer * tokenizer , const Settings * settings , ErrorLogger * errorLogger ) {
2009-03-20 18:16:21 +01:00
CheckOther checkOther ( tokenizer , settings , errorLogger ) ;
2012-03-27 21:29:50 +02:00
// Checks
2012-10-21 18:18:29 +02:00
checkOther . oppositeInnerCondition ( ) ;
2011-01-24 21:40:49 +01:00
checkOther . clarifyCalculation ( ) ;
2012-08-24 11:28:50 +02:00
checkOther . clarifyStatement ( ) ;
2010-04-21 08:38:25 +02:00
checkOther . checkConstantFunctionParameter ( ) ;
checkOther . checkIncompleteStatement ( ) ;
2009-03-20 18:16:21 +01:00
2009-07-05 22:16:43 +02:00
checkOther . invalidFunctionUsage ( ) ;
checkOther . checkZeroDivision ( ) ;
2010-04-02 07:32:03 +02:00
checkOther . checkMathFunctions ( ) ;
2011-11-17 16:31:16 +01:00
checkOther . checkCCTypeFunctions ( ) ;
2009-12-06 18:41:28 +01:00
2010-10-25 03:14:21 +02:00
checkOther . checkIncorrectLogicOperator ( ) ;
2010-10-01 17:23:22 +02:00
checkOther . checkMisusedScopedObject ( ) ;
2012-09-26 18:18:36 +02:00
checkOther . checkComparisonOfFuncReturningBool ( ) ;
checkOther . checkComparisonOfBoolWithBool ( ) ;
2011-01-06 11:31:58 +01:00
checkOther . checkMemsetZeroBytes ( ) ;
2011-02-08 19:49:29 +01:00
checkOther . checkIncorrectStringCompare ( ) ;
2011-02-11 23:38:23 +01:00
checkOther . checkIncrementBoolean ( ) ;
2011-02-19 20:02:28 +01:00
checkOther . checkSwitchCaseFallThrough ( ) ;
2011-04-26 07:45:27 +02:00
checkOther . checkAlwaysTrueOrFalseStringCompare ( ) ;
2012-04-26 15:23:47 +02:00
checkOther . checkModuloAlwaysTrueFalse ( ) ;
2011-07-28 08:12:21 +02:00
2011-07-28 07:28:24 +02:00
checkOther . checkAssignBoolToPointer ( ) ;
2011-10-06 22:01:48 +02:00
checkOther . checkBitwiseOnBoolean ( ) ;
2012-09-05 08:31:23 +02:00
checkOther . checkInvalidFree ( ) ;
2012-01-15 01:19:34 +01:00
checkOther . checkDoubleFree ( ) ;
2012-07-22 09:17:00 +02:00
checkOther . checkRedundantCopy ( ) ;
2012-08-22 15:44:20 +02:00
checkOther . checkNegativeBitwiseShift ( ) ;
2013-01-18 08:03:04 +01:00
checkOther . checkSuspiciousEqualityComparison ( ) ;
2009-03-20 18:16:21 +01:00
}
2009-01-31 20:29:27 +01:00
2012-09-05 13:48:00 +02:00
/** To check the dead code in a program, which is unaccessible due to the counter-conditions check in nested-if statements **/
2012-10-21 18:18:29 +02:00
void oppositeInnerCondition ( ) ;
2012-09-05 13:48:00 +02:00
2011-01-24 21:40:49 +01:00
/** @brief Clarify calculation for ".. a * b ? .." */
void clarifyCalculation ( ) ;
2012-08-24 00:03:22 +02:00
/** @brief Suspicious condition (assignment+comparison) */
2011-03-09 22:20:14 +01:00
void clarifyCondition ( ) ;
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-19 16:12:51 +01:00
/**
2010-03-18 18:59:55 +01:00
* @ brief Invalid function usage ( invalid radix / overlapping data )
2010-03-19 16:12:51 +01:00
*
2010-03-18 18:59:55 +01:00
* % Check that given function parameters are valid according to the standard
* - wrong radix given for strtol / strtoul
2010-03-19 16:12:51 +01:00
* - overlapping data when using sprintf / snprintf
2010-03-18 18:59:55 +01:00
*/
2009-07-05 22:16:43 +02:00
void invalidFunctionUsage ( ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief %Check for unsigned division */
2009-07-05 22:16:43 +02:00
void checkUnsignedDivision ( ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief %Check scope of variables */
2009-07-05 22:16:43 +02:00
void checkVariableScope ( ) ;
2012-05-24 15:34:59 +02:00
void lookupVar ( const Token * tok , const Variable * var ) ;
2009-01-31 20:29:27 +01:00
2010-03-18 18:59:55 +01:00
/** @brief %Check for constant function parameter */
2009-07-05 22:16:43 +02:00
void checkConstantFunctionParameter ( ) ;
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 str plus char (unusual pointer arithmetic) */
2009-01-31 20:29:27 +01:00
void strPlusChar ( ) ;
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
2010-04-02 07:32:03 +02:00
/** @brief %Check for parameters given to math function that do not make sense*/
void checkMathFunctions ( ) ;
2010-04-02 02:19:38 +02:00
2011-11-17 16:31:16 +01:00
/** @brief %Check for parameters given to cctype function that do make error*/
void checkCCTypeFunctions ( ) ;
2010-05-15 14:06:45 +02:00
/** @brief %Check for 'sizeof sizeof ..' */
void sizeofsizeof ( ) ;
2010-08-06 22:57:10 +02:00
/** @brief %Check for calculations inside sizeof */
void sizeofCalculation ( ) ;
2012-11-09 18:08:20 +01:00
/** @brief %Check for suspicious calculations with sizeof results */
void suspiciousSizeofCalculation ( ) ;
2012-09-02 13:09:32 +02:00
/** @brief copying to memory or assigning to a variablen twice */
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 ( ) ;
2011-02-19 09:33:29 +01:00
/** @brief %Check for switch case fall through without comment */
void checkSwitchCaseFallThrough ( ) ;
2010-08-15 06:28:22 +02:00
/** @brief %Check for assigning a variable to itself*/
void checkSelfAssignment ( ) ;
2010-10-10 22:05:06 +02:00
/** @brief %Check for assignment to a variable in an assert test*/
void checkAssignmentInAssert ( ) ;
2010-10-25 03:14:21 +02:00
/** @brief %Check for testing for mutual exclusion over ||*/
void checkIncorrectLogicOperator ( ) ;
2010-10-01 17:23:22 +02:00
/** @brief %Check for objects that are destroyed immediately */
void checkMisusedScopedObject ( ) ;
2012-09-26 18:18:36 +02:00
/** @brief %Check for comparison of function returning bool*/
void checkComparisonOfFuncReturningBool ( ) ;
/** @brief %Check for comparison of variable of type bool*/
void checkComparisonOfBoolWithBool ( ) ;
2011-01-06 11:31:58 +01:00
/** @brief %Check for filling zero bytes with memset() */
void checkMemsetZeroBytes ( ) ;
2011-01-22 19:21:56 +01:00
/** @brief %Check for using sizeof with array given as function argument */
void checkSizeofForArrayParameter ( ) ;
2012-03-20 18:50:05 +01:00
/** @brief %Check for using sizeof of a variable when allocating it */
2012-03-23 21:47:13 +01:00
void checkSizeofForPointerSize ( ) ;
2012-03-20 18:50:05 +01:00
2011-05-16 21:16:25 +02:00
/** @brief %Check for using sizeof with numeric given as function argument */
void checkSizeofForNumericParameter ( ) ;
2011-02-08 19:49:29 +01:00
/** @brief %Check for using bad usage of strncmp and substr */
void checkIncorrectStringCompare ( ) ;
2012-08-24 14:25:17 +02:00
/** @brief %Check for comparison of a string literal with a char* variable */
void checkSuspiciousStringCompare ( ) ;
2011-02-11 23:38:23 +01:00
/** @brief %Check for using postfix increment on bool */
void checkIncrementBoolean ( ) ;
2011-02-27 21:30:22 +01:00
/** @brief %Check for suspicious comparison of a bool and a non-zero (and non-one) value (e.g. "if (!x==4)") */
void checkComparisonOfBoolWithInt ( ) ;
2011-04-09 21:14:01 +02:00
/** @brief %Check for suspicious code where multiple if have the same expression (e.g "if (a) { } else if (a) { }") */
void checkDuplicateIf ( ) ;
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-04-26 07:45:27 +02:00
/** @brief %Check for suspicious code that compares string literals for equality */
void checkAlwaysTrueOrFalseStringCompare ( ) ;
2012-04-26 15:23:47 +02:00
/** @brief %Check for suspicious usage of modulo (e.g. "if(var % 4 == 4)") */
void checkModuloAlwaysTrueFalse ( ) ;
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-07-28 07:28:24 +02:00
/** @brief assigning bool to pointer */
void checkAssignBoolToPointer ( ) ;
2011-08-07 01:23:09 +02:00
/** @brief %Check for testing sign of unsigned variable */
void checkSignOfUnsignedVariable ( ) ;
2011-10-06 22:01:48 +02:00
/** @brief %Check for using bool in bitwise expression */
void checkBitwiseOnBoolean ( ) ;
2011-10-10 19:11:17 +02:00
/** @brief %Check for comparing a bool expression with an integer other than 0 or 1 */
void checkComparisonOfBoolExpressionWithInt ( ) ;
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-01-15 01:19:34 +01:00
/** @brief %Check for double free or double close operations */
void checkDoubleFree ( ) ;
2012-06-22 09:10:30 +02:00
void doubleFreeError ( const Token * tok , const std : : string & varname ) ;
2012-08-21 12:28:02 +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
2012-08-22 15:44:20 +02:00
/** @brief %Check for bitwise operation with negative right operand */
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-01-13 12:02:10 +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. */
void checkVarFuncNullUB ( ) ;
2012-03-11 11:01:39 +01:00
private :
2013-01-30 16:50:12 +01:00
bool isUnsigned ( const Variable * var ) const ;
bool isSigned ( const Variable * var ) const ;
2012-08-24 00:03:22 +02:00
// Error messages..
2012-10-21 18:18:29 +02:00
void oppositeInnerConditionError ( const Token * tok ) ;
2012-03-11 11:01:39 +01:00
void clarifyCalculationError ( const Token * tok , const std : : string & op ) ;
void clarifyConditionError ( const Token * tok , bool assign , bool boolop ) ;
2012-09-15 20:19:02 +02:00
void clarifyStatementError ( const Token * tok ) ;
2012-03-11 11:01:39 +01:00
void sizeofsizeofError ( const Token * tok ) ;
2012-03-25 11:32:00 +02:00
void sizeofCalculationError ( const Token * tok , bool inconclusive ) ;
2012-11-09 18:08:20 +01:00
void multiplySizeofError ( const Token * tok ) ;
void divideSizeofError ( 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 ) ;
2012-09-16 19:44:02 +02:00
void dangerousUsageStrtolError ( const Token * tok , const std : : string & funcname ) ;
2009-03-21 17:58:13 +01:00
void sprintfOverlappingDataError ( const Token * tok , const std : : string & varname ) ;
2012-01-28 12:32:28 +01:00
void udivError ( const Token * tok , bool inconclusive ) ;
2009-03-21 17:58:13 +01:00
void passedByValueError ( const Token * tok , const std : : string & parname ) ;
void constStatementError ( const Token * tok , const std : : string & type ) ;
void charArrayIndexError ( const Token * tok ) ;
void charBitOpError ( const Token * tok ) ;
void variableScopeError ( const Token * tok , const std : : string & varname ) ;
2011-08-19 17:53:43 +02:00
void strPlusCharError ( const Token * tok ) ;
2009-03-29 18:47:05 +02:00
void zerodivError ( const Token * tok ) ;
2010-04-05 19:57:54 +02:00
void mathfunctionCallError ( const Token * tok , const unsigned int numParam = 1 ) ;
2011-11-17 16:31:16 +01:00
void cctypefunctionCallError ( const Token * tok , const std : : string & functionName , const std : : string & value ) ;
2012-09-02 13:09:32 +02:00
void redundantAssignmentError ( const Token * tok1 , const Token * tok2 , const std : : string & var ) ;
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 ) ;
2011-02-19 09:33:29 +01:00
void switchCaseFallThrough ( const Token * tok ) ;
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-10 22:05:06 +02:00
void assignmentInAssertError ( const Token * tok , const std : : string & varname ) ;
2012-03-15 20:38:28 +01:00
void incorrectLogicOperatorError ( const Token * tok , const std : : string & condition , bool always ) ;
void redundantConditionError ( const Token * tok , const std : : string & text ) ;
2010-10-01 17:23:22 +02:00
void misusedScopeObjectError ( const Token * tok , const std : : string & varname ) ;
2012-09-26 18:18:36 +02:00
void comparisonOfFuncReturningBoolError ( const Token * tok , const std : : string & expression ) ;
void comparisonOfTwoFuncsReturningBoolError ( const Token * tok , const std : : string & expression1 , const std : : string & expression2 ) ;
void comparisonOfBoolWithBoolError ( const Token * tok , const std : : string & expression ) ;
2011-01-06 11:31:58 +01:00
void memsetZeroBytesError ( const Token * tok , const std : : string & varname ) ;
2011-01-22 19:21:56 +01:00
void sizeofForArrayParameterError ( const Token * tok ) ;
2012-03-23 21:47:13 +01:00
void sizeofForPointerError ( const Token * tok , const std : : string & varname ) ;
2011-05-16 21:16:25 +02:00
void sizeofForNumericParameterError ( const Token * tok ) ;
2012-09-16 19:44:02 +02:00
void incorrectStringCompareError ( const Token * tok , const std : : string & func , const std : : string & string ) ;
2011-10-18 21:37:03 +02:00
void incorrectStringBooleanError ( const Token * tok , const std : : string & string ) ;
2011-02-11 23:38:23 +01:00
void incrementBooleanError ( const Token * tok ) ;
2012-04-02 15:45:51 +02:00
void comparisonOfBoolWithIntError ( const Token * tok , const std : : string & expression , bool n0o1 ) ;
2012-07-03 06:39:13 +02:00
void comparisonOfBoolWithInvalidComparator ( const Token * tok , const std : : string & expression ) ;
2011-04-09 21:14:01 +02:00
void duplicateIfError ( const Token * tok1 , const Token * tok2 ) ;
2011-04-09 23:05:27 +02:00
void duplicateBranchError ( const Token * tok1 , const Token * tok2 ) ;
2011-04-10 16:25:02 +02:00
void duplicateExpressionError ( const Token * tok1 , const Token * tok2 , const std : : string & op ) ;
2012-03-15 20:38:28 +01:00
void alwaysTrueFalseStringCompareError ( const Token * tok , const std : : string & str1 , const std : : string & str2 ) ;
2011-10-28 22:05:11 +02:00
void alwaysTrueStringVariableCompareError ( const Token * tok , const std : : string & str1 , const std : : string & str2 ) ;
2012-08-24 14:25:17 +02:00
void suspiciousStringCompareError ( const Token * tok , const std : : string & var ) ;
2012-04-05 10:38:29 +02:00
void duplicateBreakError ( const Token * tok , bool inconclusive ) ;
void unreachableCodeError ( const Token * tok , bool inconclusive ) ;
2011-07-28 07:28:24 +02:00
void assignBoolToPointerError ( const Token * tok ) ;
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 ) ;
2011-10-06 22:01:48 +02:00
void bitwiseOnBooleanError ( const Token * tok , const std : : string & varname , const std : : string & op ) ;
2012-04-02 15:45:51 +02:00
void comparisonOfBoolExpressionWithIntError ( const Token * tok , bool n0o1 ) ;
2012-08-24 00:03:22 +02:00
void SuspiciousSemicolonError ( const Token * tok ) ;
2012-01-15 01:19:34 +01:00
void doubleCloseDirError ( const Token * tok , const std : : string & varname ) ;
2012-04-26 15:23:47 +02:00
void moduloAlwaysTrueFalseError ( const Token * tok , const std : : string & maxVal ) ;
2012-08-22 15:44:20 +02:00
void negativeBitwiseShiftError ( const Token * tok ) ;
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 ) ;
2012-07-22 09:17:00 +02:00
2012-02-18 23:43:51 +01:00
void getErrorMessages ( ErrorLogger * errorLogger , const Settings * settings ) const {
2010-12-29 12:43:29 +01:00
CheckOther c ( 0 , settings , errorLogger ) ;
2009-10-04 13:46:37 +02:00
// error
2011-07-28 07:28:24 +02:00
c . assignBoolToPointerError ( 0 ) ;
2010-12-29 12:43:29 +01:00
c . sprintfOverlappingDataError ( 0 , " varname " ) ;
2012-01-28 12:32:28 +01:00
c . udivError ( 0 , false ) ;
2010-12-29 12:43:29 +01:00
c . zerodivError ( 0 ) ;
c . mathfunctionCallError ( 0 ) ;
c . misusedScopeObjectError ( NULL , " varname " ) ;
2012-09-26 18:18:36 +02:00
c . comparisonOfFuncReturningBoolError ( 0 , " func_name " ) ;
c . comparisonOfTwoFuncsReturningBoolError ( 0 , " func_name1 " , " func_name2 " ) ;
c . comparisonOfBoolWithBoolError ( 0 , " var_name " ) ;
2011-01-22 19:21:56 +01:00
c . sizeofForArrayParameterError ( 0 ) ;
2012-03-23 21:47:13 +01:00
c . sizeofForPointerError ( 0 , " varname " ) ;
2011-05-16 21:16:25 +02:00
c . sizeofForNumericParameterError ( 0 ) ;
2012-01-25 07:43:44 +01:00
c . doubleFreeError ( 0 , " varname " ) ;
2012-03-25 12:55:39 +02:00
c . invalidPointerCastError ( 0 , " float " , " double " , false ) ;
2012-08-22 15:44:20 +02:00
c . negativeBitwiseShiftError ( 0 ) ;
2009-10-04 13:46:37 +02:00
2012-07-22 09:17:00 +02:00
//performance
c . redundantCopyError ( 0 , " varname " ) ;
2012-09-02 13:09:32 +02:00
c . redundantCopyError ( 0 , 0 , " var " ) ;
c . redundantAssignmentError ( 0 , 0 , " var " ) ;
2012-07-22 09:17:00 +02:00
2010-10-31 10:07:35 +01:00
// style/warning
2012-10-21 18:18:29 +02:00
c . oppositeInnerConditionError ( 0 ) ;
2010-12-29 12:43:29 +01:00
c . cstyleCastError ( 0 ) ;
2012-09-16 19:44:02 +02:00
c . dangerousUsageStrtolError ( 0 , " strtol " ) ;
2010-12-29 12:43:29 +01:00
c . passedByValueError ( 0 , " parametername " ) ;
c . constStatementError ( 0 , " type " ) ;
c . charArrayIndexError ( 0 ) ;
c . charBitOpError ( 0 ) ;
c . variableScopeError ( 0 , " varname " ) ;
2011-08-19 17:53:43 +02:00
c . strPlusCharError ( 0 ) ;
2010-12-29 12:43:29 +01:00
c . sizeofsizeofError ( 0 ) ;
2012-03-25 11:32:00 +02:00
c . sizeofCalculationError ( 0 , false ) ;
2012-11-09 18:08:20 +01:00
c . multiplySizeofError ( 0 ) ;
c . divideSizeofError ( 0 ) ;
2012-09-02 13:09:32 +02:00
c . redundantAssignmentInSwitchError ( 0 , 0 , " var " ) ;
c . redundantCopyInSwitchError ( 0 , 0 , " var " ) ;
2011-02-19 09:33:29 +01:00
c . switchCaseFallThrough ( 0 ) ;
2012-12-07 21:27:32 +01:00
c . suspiciousCaseInSwitchError ( 0 , " || " ) ;
2013-01-18 08:03:04 +01:00
c . suspiciousEqualityComparisonError ( 0 ) ;
2010-12-29 12:43:29 +01:00
c . selfAssignmentError ( 0 , " varname " ) ;
c . assignmentInAssertError ( 0 , " varname " ) ;
2012-03-15 20:38:28 +01:00
c . incorrectLogicOperatorError ( 0 , " foo > 3 && foo < 4 " , true ) ;
2012-03-15 21:06:24 +01:00
c . redundantConditionError ( 0 , " If x > 10 the condition x > 11 is always true. " ) ;
2011-01-06 11:31:58 +01:00
c . memsetZeroBytesError ( 0 , " varname " ) ;
2011-04-03 22:12:22 +02:00
c . clarifyCalculationError ( 0 , " + " ) ;
2011-08-19 13:40:54 +02:00
c . clarifyConditionError ( 0 , true , false ) ;
2012-09-15 20:19:02 +02:00
c . clarifyStatementError ( 0 ) ;
2012-09-16 19:44:02 +02:00
c . incorrectStringCompareError ( 0 , " substr " , " \" Hello World \" " ) ;
2012-08-24 14:25:17 +02:00
c . suspiciousStringCompareError ( 0 , " foo " ) ;
2011-10-18 21:37:03 +02:00
c . incorrectStringBooleanError ( 0 , " \" Hello World \" " ) ;
2011-02-11 23:38:23 +01:00
c . incrementBooleanError ( 0 ) ;
2012-04-02 15:45:51 +02:00
c . comparisonOfBoolWithIntError ( 0 , " varname " , true ) ;
2011-04-09 21:14:01 +02:00
c . duplicateIfError ( 0 , 0 ) ;
2011-04-09 23:05:27 +02:00
c . duplicateBranchError ( 0 , 0 ) ;
2011-04-10 16:25:02 +02:00
c . duplicateExpressionError ( 0 , 0 , " && " ) ;
2012-03-15 20:38:28 +01:00
c . alwaysTrueFalseStringCompareError ( 0 , " str1 " , " str2 " ) ;
2011-10-28 22:05:11 +02:00
c . alwaysTrueStringVariableCompareError ( 0 , " varname1 " , " varname2 " ) ;
2012-04-05 10:38:29 +02:00
c . duplicateBreakError ( 0 , false ) ;
c . unreachableCodeError ( 0 , false ) ;
2011-11-06 18:24:37 +01:00
c . unsignedLessThanZeroError ( 0 , " varname " , false ) ;
c . unsignedPositiveError ( 0 , " varname " , false ) ;
2012-08-21 12:28:02 +02:00
c . pointerLessThanZeroError ( 0 , false ) ;
c . pointerPositiveError ( 0 , false ) ;
2011-10-06 22:01:48 +02:00
c . bitwiseOnBooleanError ( 0 , " varname " , " && " ) ;
2012-04-02 15:45:51 +02:00
c . comparisonOfBoolExpressionWithIntError ( 0 , true ) ;
2011-10-11 08:41:39 +02:00
c . SuspiciousSemicolonError ( 0 ) ;
2011-11-17 16:31:16 +01:00
c . cctypefunctionCallError ( 0 , " funname " , " value " ) ;
2012-04-26 15:23:47 +02:00
c . moduloAlwaysTrueFalseError ( 0 , " 1 " ) ;
2012-08-24 11:28:50 +02:00
c . incompleteArrayFillError ( 0 , " buffer " , " memset " , false ) ;
2013-01-13 12:02:10 +01:00
c . varFuncNullUBError ( 0 ) ;
2009-03-22 08:20:15 +01:00
}
2012-08-02 18:50:48 +02:00
static std : : string myName ( ) {
2009-06-12 15:20:08 +02:00
return " Other " ;
}
2011-10-13 20:53:06 +02:00
std : : string classInfo ( ) const {
2009-06-12 12:19:37 +02:00
return " Other checks \n "
2009-10-04 13:46:37 +02:00
// error
2011-10-27 10:50:40 +02:00
" * Assigning bool value to pointer (converting bool value to address) \n "
2010-01-17 14:56:56 +01:00
" * division with zero \n "
2010-10-03 23:54:19 +02:00
" * scoped object destroyed immediately after construction \n "
2010-10-10 22:05:06 +02:00
" * assignment in an assert statement \n "
2011-01-22 19:21:56 +01:00
" * sizeof for array given as function argument \n "
2011-05-16 21:16:25 +02:00
" * sizeof for numeric given as function argument \n "
2012-03-23 21:47:13 +01:00
" * using sizeof(pointer) instead of the size of pointed data \n "
2011-02-08 19:49:29 +01:00
" * incorrect length arguments for 'substr' and 'strncmp' \n "
2012-09-05 08:31:23 +02:00
" * free() or delete of an invalid memory location \n "
2012-01-15 01:19:34 +01:00
" * double free() or double closedir() \n "
2012-08-22 15:44:20 +02:00
" * bitwise operation with negative right operand \n "
2010-05-04 08:14:45 +02:00
2012-07-22 09:17:00 +02:00
//performance
" * redundant data copying for const variable \n "
2012-09-02 13:09:32 +02:00
" * subsequent assignment or copying to a variable or buffer \n "
2012-07-22 09:17:00 +02:00
2009-10-29 21:34:43 +01:00
// style
2012-09-05 13:48:00 +02:00
" * Find dead code which is unaccessible due to the counter-conditions check in nested if statements \n "
2010-01-17 14:56:56 +01:00
" * C-style pointer cast in cpp file \n "
2012-02-26 11:56:32 +01:00
" * casting between incompatible pointer types \n "
2010-01-17 14:56:56 +01:00
" * redundant if \n "
" * bad usage of the function 'strtol' \n "
" * [[CheckUnsignedDivision|unsigned division]] \n "
" * passing parameter by value \n "
" * [[IncompleteStatement|Incomplete statement]] \n "
" * [[charvar|check how signed char variables are used]] \n "
" * variable scope can be limited \n "
" * condition that is always true/false \n "
" * unusal pointer arithmetic. For example: \" abc \" + 'd' \n "
2010-06-30 09:10:30 +02:00
" * redundant assignment in a switch statement \n "
2012-08-22 14:40:57 +02:00
" * redundant pre/post operation in a switch statement \n "
2012-05-29 06:19:22 +02:00
" * redundant bitwise operation in a switch statement \n "
2011-10-13 10:27:22 +02:00
" * redundant strcpy in a switch statement \n "
2010-08-06 22:57:10 +02:00
" * look for 'sizeof sizeof ..' \n "
" * look for calculations inside sizeof() \n "
2012-11-09 18:08:20 +01:00
" * look for suspicious calculations with sizeof() \n "
2010-08-15 06:28:22 +02:00
" * assignment of a variable to itself \n "
2012-12-07 21:27:32 +01:00
" * Suspicious case labels in switch() \n "
2013-01-18 08:03:04 +01:00
" * Suspicious equality comparisons \n "
2010-11-21 09:06:43 +01:00
" * mutual exclusion over || always evaluating to true \n "
2011-03-30 16:44:16 +02:00
" * Clarify calculation with parentheses \n "
2011-02-11 23:38:23 +01:00
" * using increment on boolean \n "
2011-02-27 21:30:22 +01:00
" * comparison of a boolean with a non-zero integer \n "
2011-10-10 19:11:17 +02:00
" * comparison of a boolean expression with an integer other than 0 or 1 \n "
2012-09-26 18:18:36 +02:00
" * comparison of a function returning boolean value using relational operator \n "
" * comparison of a boolean value with boolean value using relational operator \n "
2011-04-26 07:45:27 +02:00
" * suspicious condition (assignment+comparison) \n "
" * suspicious condition (runtime comparison of string literals) \n "
2012-08-24 00:03:22 +02:00
" * suspicious condition (string literals as boolean) \n "
2012-08-24 14:25:17 +02:00
" * suspicious comparison of a string literal with a char* variable \n "
2011-07-15 02:12:56 +02:00
" * duplicate break statement \n "
2011-12-03 11:43:23 +01:00
" * unreachable code \n "
2011-08-07 01:23:09 +02:00
" * testing if unsigned variable is negative \n "
" * testing is unsigned variable is positive \n "
2011-10-06 22:01:48 +02:00
" * using bool in bitwise expression \n "
2011-10-11 08:41:39 +02:00
" * Suspicious use of ; at the end of 'if/for/while' statement. \n "
2011-11-17 16:31:16 +01:00
" * incorrect usage of functions from ctype library. \n "
2012-08-24 11:28:50 +02:00
" * Comparisons of modulo results that are always true/false. \n "
2013-01-13 12:02:10 +01:00
" * Array filled incompletely using memset/memcpy/memmove. \n "
" * Passing NULL pointer to function with variable number of arguments leads to UB on some platforms. \n " ;
2009-06-12 12:19:37 +02:00
}
2009-10-11 17:10:20 +02:00
2012-05-24 17:40:43 +02:00
void checkExpressionRange ( const std : : list < const Function * > & constFunctions ,
2012-08-24 00:03:22 +02:00
const Token * start ,
const Token * end ,
const std : : string & toCheck ) ;
void complexDuplicateExpressionCheck ( const std : : list < const Function * > & constFunctions ,
const Token * classStart ,
const std : : string & toCheck ,
const std : : string & alt ) ;
} ;
/// @}
//---------------------------------------------------------------------------
# endif