2009-01-31 20:29:27 +01:00
/*
* Cppcheck - A tool for static C / C + + code analysis
2014-02-15 07:45:39 +01:00
* Copyright ( C ) 2007 - 2014 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
*/
//---------------------------------------------------------------------------
2013-09-04 20:59:49 +02:00
# ifndef checkotherH
# define checkotherH
2009-01-31 20:29:27 +01:00
//---------------------------------------------------------------------------
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
2014-04-03 19:35:50 +02:00
/** Is expressions same? */
bool isSameExpression ( const Token * tok1 , const Token * tok2 , const std : : set < std : : string > & constFunctions ) ;
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 */
2013-08-07 16:27:37 +02: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 )
2013-08-07 16:27:37 +02: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 ( ) ;
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-02-04 20:55:38 +01:00
checkOther . checkSelfAssignment ( ) ;
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
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 ( ) ;
2013-06-10 08:13:08 +02:00
checkOther . checkNanInArithmeticExpression ( ) ;
2013-06-15 17:49:10 +02:00
checkOther . checkCommaSeparatedReturn ( ) ;
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 ( ) ;
2013-02-27 21:02:12 +01:00
checkOther . checkCastIntToCharAndBack ( ) ;
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 ( ) ;
2009-12-06 18:41:28 +01:00
2013-02-11 20:26:27 +01:00
checkOther . redundantGetAndSetUserId ( ) ;
2010-10-25 03:14:21 +02:00
checkOther . checkIncorrectLogicOperator ( ) ;
2010-10-01 17:23:22 +02:00
checkOther . checkMisusedScopedObject ( ) ;
2011-01-06 11:31:58 +01:00
checkOther . checkMemsetZeroBytes ( ) ;
2014-02-15 19:06:00 +01:00
checkOther . checkMemsetInvalid2ndParam ( ) ;
2011-02-08 19:49:29 +01:00
checkOther . checkIncorrectStringCompare ( ) ;
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 ( ) ;
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-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 ( ) ;
2013-09-26 07:07:48 +02:00
checkOther . checkComparisonFunctionIsAlwaysTrueOrFalse ( ) ;
2009-03-20 18:16:21 +01:00
}
2009-01-31 20:29:27 +01:00
2013-02-10 07:43:09 +01:00
/** To check the dead code in a program, which is inaccessible 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
/**
2013-12-23 10:06:45 +01:00
* @ brief Invalid function usage ( invalid input value / 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
2013-12-23 10:06:45 +01:00
* - wrong input value according to library
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 ( ) ;
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 ( ) ;
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
2013-09-07 07:40:10 +02:00
/** @brief %Check zero division / useless condition */
void checkZeroDivisionOrUselessCondition ( ) ;
2013-06-10 08:13:08 +02:00
/** @brief Check for NaN (not-a-number) in an arithmetic expression */
void checkNanInArithmeticExpression ( ) ;
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
2013-02-11 20:26:27 +01:00
/** @brief % Check for seteuid(geteuid()) or setuid(getuid())*/
void redundantGetAndSetUserId ( ) ;
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 ( ) ;
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-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 ( ) ;
2011-01-06 11:31:58 +01:00
/** @brief %Check for filling zero bytes with memset() */
void checkMemsetZeroBytes ( ) ;
2014-02-15 19:06:00 +01:00
/** @brief %Check for invalid 2nd parameter of memset() */
void checkMemsetInvalid2ndParam ( ) ;
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-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-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-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-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
2012-03-11 11:01:39 +01:00
private :
2013-01-30 16:50:12 +01:00
bool isUnsigned ( const Variable * var ) const ;
2013-03-12 15:42:00 +01:00
static bool isSigned ( const Variable * var ) ;
2013-01-30 16:50:12 +01:00
2012-08-24 00:03:22 +02:00
// Error messages..
2013-09-26 07:07:48 +02:00
void checkComparisonFunctionIsAlwaysTrueOrFalseError ( const Token * tok , const std : : string & strFunctionName , 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 ) ;
2014-03-28 14:55:17 +01:00
void oppositeInnerConditionError ( const Token * tok1 , const Token * tok2 ) ;
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 ) ;
2013-02-11 20:26:27 +01:00
void redundantGetAndSetUserIdError ( 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 ) ;
2009-03-21 17:58:13 +01:00
void sprintfOverlappingDataError ( const Token * tok , const std : : string & varname ) ;
2013-12-23 10:06:45 +01:00
void invalidFunctionArgError ( const Token * tok , const std : : string & functionName , int argnr , const std : : string & validstr ) ;
void invalidFunctionArgBoolError ( const Token * tok , const std : : string & functionName , int argnr ) ;
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 ) ;
2014-03-20 16:12:58 +01:00
void zerodivError ( const Token * tok , bool inconclusive ) ;
void zerodivcondError ( const Token * tokcond , const Token * tokdiv , bool inconclusive ) ;
2013-06-10 08:13:08 +02:00
void nanInArithmeticExpressionError ( const Token * tok ) ;
2010-04-05 19:57:54 +02:00
void mathfunctionCallError ( const Token * tok , const unsigned int numParam = 1 ) ;
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 ) ;
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 ) ;
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 ) ;
2011-01-06 11:31:58 +01:00
void memsetZeroBytesError ( const Token * tok , const std : : string & varname ) ;
2014-02-15 19:06:00 +01:00
void memsetFloatError ( const Token * tok , const std : : string & var_value ) ;
void memsetValueOutOfRangeError ( const Token * tok , const std : : string & value ) ;
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-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-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 ) ;
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 ) ;
2013-06-15 17:49:10 +02:00
void commaSeparatedReturnError ( 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
2010-12-29 12:43:29 +01:00
c . sprintfOverlappingDataError ( 0 , " varname " ) ;
2013-12-23 10:06:45 +01:00
c . invalidFunctionArgError ( 0 , " func_name " , 1 , " 1-4 " ) ;
c . invalidFunctionArgBoolError ( 0 , " func_name " , 1 ) ;
2012-01-28 12:32:28 +01:00
c . udivError ( 0 , false ) ;
2014-03-20 16:12:58 +01:00
c . zerodivError ( 0 , false ) ;
c . zerodivcondError ( 0 , 0 , false ) ;
2010-12-29 12:43:29 +01:00
c . mathfunctionCallError ( 0 ) ;
c . misusedScopeObjectError ( NULL , " varname " ) ;
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 ) ;
2013-02-17 17:33:32 +01:00
c . checkPipeParameterSizeError ( 0 , " varname " , " dimension " ) ;
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 " ) ;
2013-02-15 18:01:10 +01:00
c . redundantAssignmentError ( 0 , 0 , " var " , false ) ;
2012-07-22 09:17:00 +02:00
2010-10-31 10:07:35 +01:00
// style/warning
2013-09-30 19:43:21 +02:00
c . checkComparisonFunctionIsAlwaysTrueOrFalseError ( 0 , " isless " , " varName " , false ) ;
2013-02-27 21:02:12 +01:00
c . checkCastIntToCharAndBackError ( 0 , " func_name " ) ;
2014-03-28 14:55:17 +01:00
c . oppositeInnerConditionError ( 0 , 0 ) ;
2010-12-29 12:43:29 +01:00
c . cstyleCastError ( 0 ) ;
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 ) ;
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 " ) ;
2012-03-15 20:38:28 +01:00
c . incorrectLogicOperatorError ( 0 , " foo > 3 && foo < 4 " , true ) ;
2014-05-07 14:54:50 +02:00
c . redundantConditionError ( 0 , " If x > 11 the condition x > 10 is always true. " ) ;
2011-01-06 11:31:58 +01:00
c . memsetZeroBytesError ( 0 , " varname " ) ;
2014-02-15 19:06:00 +01:00
c . memsetFloatError ( 0 , " varname " ) ;
c . memsetValueOutOfRangeError ( 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-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-11 08:41:39 +02:00
c . SuspiciousSemicolonError ( 0 ) ;
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 ) ;
2013-06-10 08:13:08 +02:00
c . nanInArithmeticExpressionError ( 0 ) ;
2013-06-15 17:49:10 +02:00
c . commaSeparatedReturnError ( 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-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 "
2013-02-17 17:33:32 +01:00
" * provide wrong dimensioned array to pipe() system command (--std=posix) \n "
2013-02-27 21:02:12 +01:00
" * cast the return values of getc(),fgetc() and getchar() to character and compare it to EOF \n "
2013-12-23 10:06:45 +01:00
" * invalid input values for functions \n "
2010-05-04 08:14:45 +02:00
2013-09-07 07:40:10 +02:00
// warning
" * either division by zero or useless condition \n "
2014-02-15 19:06:00 +01:00
" * memset() with a value out of range as the 2nd parameter \n "
2013-09-07 07:40:10 +02:00
2014-02-15 19:06:00 +01:00
// performance
2012-07-22 09:17:00 +02:00
" * 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
2014-02-15 19:06:00 +01:00
// portability
" * memset() with a float as the 2nd parameter \n "
2009-10-29 21:34:43 +01:00
// style
2013-02-10 07:43:09 +01:00
" * Find dead code which is inaccessible 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 "
" * [[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 "
2013-02-10 07:43:09 +01:00
" * unusual 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-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 "
2013-09-26 07:07:48 +02:00
" * Comparison of values leading always to true or false \n "
2011-03-30 16:44:16 +02:00
" * Clarify calculation with parentheses \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-11 08:41:39 +02:00
" * Suspicious use of ; at the end of 'if/for/while' statement. \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 "
2013-02-11 20:26:27 +01:00
" * redundant get and set function of user id (--std=posix). \n "
2013-06-10 08:13:08 +02:00
" * Passing NULL pointer to function with variable number of arguments leads to UB on some platforms. \n "
2013-06-15 17:49:10 +02:00
" * NaN (not a number) value used in arithmetic expression. \n "
" * comma in return statement (the comma can easily be misread as a semicolon). \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