2009-01-31 20:29:27 +01:00
/*
* Cppcheck - A tool for static C / C + + code analysis
2015-11-18 20:04:50 +01:00
* Copyright ( C ) 2007 - 2015 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"
2009-01-31 20:29:27 +01:00
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 */
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 */
2014-11-20 14:20:09 +01: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 . 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-08-30 16:45:47 +02:00
checkOther . checkInterlockedDecrement ( ) ;
checkOther . checkUnusedLabel ( ) ;
2009-03-21 07:53:23 +01:00
}
2010-03-14 19:11:03 +01:00
/** @brief Run checks against the simplified token list */
2014-11-20 14:20:09 +01: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
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
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-19 20:02:28 +01:00
checkOther . checkSwitchCaseFallThrough ( ) ;
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 ( ) ;
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
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 ( ) ;
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 %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 ( ) ;
2011-02-19 09:33:29 +01:00
/** @brief %Check for switch case fall through without comment */
void checkSwitchCaseFallThrough ( ) ;
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-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 ( ) ;
2012-03-11 11:01:39 +01:00
private :
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 ) ;
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 ) ;
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 ) ;
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 ) ;
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 ) ;
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 ) ;
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 ) ;
2015-01-03 18:01:49 +01:00
void duplicateExpressionTernaryError ( const Token * tok ) ;
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-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 ) ;
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 ) ;
2015-08-30 16:45:47 +02:00
void unusedLabelError ( const Token * tok ) ;
2012-07-22 09:17:00 +02:00
2014-11-20 14:20:09 +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
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 . misusedScopeObjectError ( NULL , " 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 " ) ;
2015-08-05 11:20:28 +02:00
c . raceAfterInterlockedDecrementError ( 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 " ) ;
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 " ) ;
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 " ) ;
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 " ) ;
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 , " + " ) ;
2012-09-15 20:19:02 +02:00
c . clarifyStatementError ( 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 , " && " ) ;
2015-01-03 18:01:49 +01:00
c . duplicateExpressionTernaryError ( 0 ) ;
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-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 ) ;
2015-01-17 14:33:14 +01:00
c . redundantPointerOpError ( 0 , " varname " , false ) ;
2015-08-30 16:45:47 +02:00
c . unusedLabelError ( 0 ) ;
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 " ;
}
2014-11-20 14:20:09 +01: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
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 "
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 "
" - 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
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 "
2012-07-22 09:17:00 +02:00
2014-02-15 19:06:00 +01:00
// portability
2014-09-30 14:56:12 +02:00
" - memset() with a float as the 2nd parameter \n "
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 "
" - passing parameter by value \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 "
" - suspicious comparison of ' \\ 0' with a char* variable \n "
" - 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 "
2015-08-30 16:45:47 +02:00
" - redundant pointer operation on pointer like &*some_ptr. \n "
" - find unused 'goto' labels. \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