Merge branch 'master' of git@github.com:danmar/cppcheck
This commit is contained in:
commit
7491200d71
|
@ -80,7 +80,7 @@ protected:
|
||||||
ErrorLogger * const _errorLogger;
|
ErrorLogger * const _errorLogger;
|
||||||
|
|
||||||
/** report an error */
|
/** report an error */
|
||||||
void reportError(const Token *tok, const std::string &severity, const std::string &id, const std::string &msg)
|
void reportError(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
std::list<const Token *> callstack;
|
std::list<const Token *> callstack;
|
||||||
callstack.push_back(tok);
|
callstack.push_back(tok);
|
||||||
|
@ -88,12 +88,12 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
/** report an error */
|
/** report an error */
|
||||||
void reportError(const std::list<const Token *> &callstack, const std::string &severity, const std::string &id, std::string msg)
|
void reportError(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, std::string msg)
|
||||||
{
|
{
|
||||||
// No errorLogger => just report the message to stdout
|
// No errorLogger => just report the message to stdout
|
||||||
if (_errorLogger == NULL)
|
if (_errorLogger == NULL)
|
||||||
{
|
{
|
||||||
std::cout << "(" << severity << ") " << msg << std::endl;
|
std::cout << "(" << Severity::stringify(severity) << ") " << msg << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ protected:
|
||||||
locationList.push_back(loc);
|
locationList.push_back(loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
_errorLogger->reportErr(ErrorLogger::ErrorMessage(locationList, severity, msg, id));
|
_errorLogger->reportErr(ErrorLogger::ErrorMessage(locationList, Severity::stringify(severity), msg, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -195,7 +195,7 @@ void CheckAutoVariables::autoVariables()
|
||||||
{
|
{
|
||||||
if (errorAv(tok->tokAt(1), tok->tokAt(4)))
|
if (errorAv(tok->tokAt(1), tok->tokAt(4)))
|
||||||
reportError(tok,
|
reportError(tok,
|
||||||
"error",
|
Severity::error,
|
||||||
"autoVariables",
|
"autoVariables",
|
||||||
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
||||||
}
|
}
|
||||||
|
@ -203,7 +203,7 @@ void CheckAutoVariables::autoVariables()
|
||||||
{
|
{
|
||||||
if (errorAv(tok->tokAt(1), tok->tokAt(7)))
|
if (errorAv(tok->tokAt(1), tok->tokAt(7)))
|
||||||
reportError(tok,
|
reportError(tok,
|
||||||
"error",
|
Severity::error,
|
||||||
"autoVariables",
|
"autoVariables",
|
||||||
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ void CheckAutoVariables::autoVariables()
|
||||||
{
|
{
|
||||||
if (isAutoVar(tok->tokAt(2)))
|
if (isAutoVar(tok->tokAt(2)))
|
||||||
reportError(tok,
|
reportError(tok,
|
||||||
"error",
|
Severity::error,
|
||||||
"autoVariables",
|
"autoVariables",
|
||||||
"Return of the address of an auto-variable");
|
"Return of the address of an auto-variable");
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ void CheckAutoVariables::returnPointerToLocalArray()
|
||||||
|
|
||||||
void CheckAutoVariables::errorReturnPointerToLocalArray(const Token *tok)
|
void CheckAutoVariables::errorReturnPointerToLocalArray(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "returnLocalVariable", "Returning pointer to local array variable");
|
reportError(tok, Severity::error, "returnLocalVariable", "Returning pointer to local array variable");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ private:
|
||||||
void getErrorMessages()
|
void getErrorMessages()
|
||||||
{
|
{
|
||||||
std::cout << "===auto variables===" << "\n";
|
std::cout << "===auto variables===" << "\n";
|
||||||
reportError(0, "error", "autoVariables", "Wrong assignement of an auto-variable to an effective parameter of a function");
|
reportError(0, Severity::error, "autoVariables", "Wrong assignement of an auto-variable to an effective parameter of a function");
|
||||||
errorReturnPointerToLocalArray(0);
|
errorReturnPointerToLocalArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,27 +52,27 @@ void CheckBufferOverrunClass::arrayIndexOutOfBounds(const Token *tok)
|
||||||
|
|
||||||
void CheckBufferOverrunClass::arrayIndexOutOfBounds()
|
void CheckBufferOverrunClass::arrayIndexOutOfBounds()
|
||||||
{
|
{
|
||||||
reportError(_callStack, "all", "arrayIndexOutOfBounds", "Array index out of bounds");
|
reportError(_callStack, Severity::possibleError, "arrayIndexOutOfBounds", "Array index out of bounds");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBufferOverrunClass::bufferOverrun(const Token *tok)
|
void CheckBufferOverrunClass::bufferOverrun(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "all", "bufferOverrun", "Buffer overrun");
|
reportError(tok, Severity::possibleError, "bufferOverrun", "Buffer overrun");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBufferOverrunClass::strncatUsage(const Token *tok)
|
void CheckBufferOverrunClass::strncatUsage(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "all", "strncatUsage", "Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append");
|
reportError(tok, Severity::possibleError, "strncatUsage", "Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBufferOverrunClass::outOfBounds(const Token *tok, const std::string &what)
|
void CheckBufferOverrunClass::outOfBounds(const Token *tok, const std::string &what)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "outOfBounds", what + " is out of bounds");
|
reportError(tok, Severity::error, "outOfBounds", what + " is out of bounds");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBufferOverrunClass::sizeArgumentAsChar(const Token *tok)
|
void CheckBufferOverrunClass::sizeArgumentAsChar(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "all", "sizeArgumentAsChar", "The size argument is given as a char constant");
|
reportError(tok, Severity::possibleError, "sizeArgumentAsChar", "The size argument is given as a char constant");
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -774,42 +774,42 @@ void CheckClass::virtualDestructor()
|
||||||
|
|
||||||
void CheckClass::noConstructorError(const Token *tok, const std::string &classname)
|
void CheckClass::noConstructorError(const Token *tok, const std::string &classname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "noConstructor", "The class '" + classname + "' has no constructor");
|
reportError(tok, Severity::style, "noConstructor", "The class '" + classname + "' has no constructor");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::uninitVarError(const Token *tok, const std::string &classname, const std::string &varname)
|
void CheckClass::uninitVarError(const Token *tok, const std::string &classname, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "uninitVar", "Member variable not initialized in the constructor '" + classname + "::" + varname + "'");
|
reportError(tok, Severity::style, "uninitVar", "Member variable not initialized in the constructor '" + classname + "::" + varname + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname)
|
void CheckClass::operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, "all style", "operatorEqVarError", "Member variable '" + classname + "::" + varname + "' is not assigned a value in '" + classname + "::operator=" + "'");
|
reportError(tok, Severity::possibleStyle, "operatorEqVarError", "Member variable '" + classname + "::" + varname + "' is not assigned a value in '" + classname + "::operator=" + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::unusedPrivateFunctionError(const Token *tok, const std::string &classname, const std::string &funcname)
|
void CheckClass::unusedPrivateFunctionError(const Token *tok, const std::string &classname, const std::string &funcname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "unusedPrivateFunction", "Unused private function '" + classname + "::" + funcname + "'");
|
reportError(tok, Severity::style, "unusedPrivateFunction", "Unused private function '" + classname + "::" + funcname + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::memsetClassError(const Token *tok, const std::string &memfunc)
|
void CheckClass::memsetClassError(const Token *tok, const std::string &memfunc)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "memsetClass", "Using '" + memfunc + "' on class");
|
reportError(tok, Severity::error, "memsetClass", "Using '" + memfunc + "' on class");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::memsetStructError(const Token *tok, const std::string &memfunc, const std::string &classname)
|
void CheckClass::memsetStructError(const Token *tok, const std::string &memfunc, const std::string &classname)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "memsetStruct", "Using '" + memfunc + "' on struct that contains a 'std::" + classname + "'");
|
reportError(tok, Severity::error, "memsetStruct", "Using '" + memfunc + "' on struct that contains a 'std::" + classname + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::operatorEqReturnError(const Token *tok)
|
void CheckClass::operatorEqReturnError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "operatorEq", "'operator=' should return something");
|
reportError(tok, Severity::style, "operatorEq", "'operator=' should return something");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived)
|
void CheckClass::virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "virtualDestructor", "Class " + Base + " which is inherited by class " + Derived + " does not have a virtual destructor");
|
reportError(tok, Severity::error, "virtualDestructor", "Class " + Base + " which is inherited by class " + Derived + " does not have a virtual destructor");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,15 +54,15 @@ void CheckDangerousFunctionsClass::dangerousFunctions()
|
||||||
|
|
||||||
void CheckDangerousFunctionsClass::dangerousFunctionmktemp(const Token *tok)
|
void CheckDangerousFunctionsClass::dangerousFunctionmktemp(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "dangerousFunctionmktemp", "Found 'mktemp'. You should use 'mkstemp' instead");
|
reportError(tok, Severity::style, "dangerousFunctionmktemp", "Found 'mktemp'. You should use 'mkstemp' instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckDangerousFunctionsClass::dangerousFunctiongets(const Token *tok)
|
void CheckDangerousFunctionsClass::dangerousFunctiongets(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "dangerousFunctiongets", "Found 'gets'. You should use 'fgets' instead");
|
reportError(tok, Severity::style, "dangerousFunctiongets", "Found 'gets'. You should use 'fgets' instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckDangerousFunctionsClass::dangerousFunctionscanf(const Token *tok)
|
void CheckDangerousFunctionsClass::dangerousFunctionscanf(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "dangerousFunctionscanf", "Found 'scanf'. You should use 'fgets' instead");
|
reportError(tok, Severity::style, "dangerousFunctionscanf", "Found 'scanf'. You should use 'fgets' instead");
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,37 +226,37 @@ void CheckMemoryLeak::memoryLeak(const Token *tok, const char varname[], AllocTy
|
||||||
|
|
||||||
void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname)
|
void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(tok, "error", "memleak", "Memory leak: " + varname);
|
error(tok, Severity::error, "memleak", "Memory leak: " + varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::memleakallError(const Token *tok, const std::string &varname)
|
void CheckMemoryLeak::memleakallError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(tok, "all", "memleakall", "Memory leak: " + varname);
|
error(tok, Severity::possibleError, "memleakall", "Memory leak: " + varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname)
|
void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(tok, "error", "resourceLeak", "Resource leak: " + varname);
|
error(tok, Severity::error, "resourceLeak", "Resource leak: " + varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::deallocDeallocError(const Token *tok, const std::string &varname)
|
void CheckMemoryLeak::deallocDeallocError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(tok, "error", "deallocDealloc", "Deallocating a deallocated pointer: " + varname);
|
error(tok, Severity::error, "deallocDealloc", "Deallocating a deallocated pointer: " + varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname)
|
void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(tok, "error", "deallocuse", "Using '" + varname + "' after it is deallocated / released");
|
error(tok, Severity::error, "deallocuse", "Using '" + varname + "' after it is deallocated / released");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::mismatchSizeError(const Token *tok, const std::string &sz)
|
void CheckMemoryLeak::mismatchSizeError(const Token *tok, const std::string &sz)
|
||||||
{
|
{
|
||||||
error(tok, "error", "mismatchSize", "The given size " + sz + " is mismatching");
|
error(tok, Severity::error, "mismatchSize", "The given size " + sz + " is mismatching");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckMemoryLeak::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname)
|
void CheckMemoryLeak::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname)
|
||||||
{
|
{
|
||||||
error(callstack, "error", "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname);
|
error(callstack, Severity::error, "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Token *tok) const
|
CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Token *tok) const
|
||||||
|
|
|
@ -65,8 +65,8 @@ public:
|
||||||
void mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname);
|
void mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname);
|
||||||
|
|
||||||
// error message
|
// error message
|
||||||
virtual void error(const Token *tok, const std::string &severity, const std::string &id, const std::string &msg) = 0;
|
virtual void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg) = 0;
|
||||||
virtual void error(const std::list<const Token *> &callstack, const std::string &severity, const std::string &id, const std::string &msg) = 0;
|
virtual void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg) = 0;
|
||||||
|
|
||||||
/** What type of allocated memory does the given function return? */
|
/** What type of allocated memory does the given function return? */
|
||||||
AllocType functionReturnType(const Token *tok) const;
|
AllocType functionReturnType(const Token *tok) const;
|
||||||
|
@ -141,12 +141,12 @@ private:
|
||||||
|
|
||||||
void checkScope(const Token *Tok1, const char varname[], bool classmember, unsigned int sz);
|
void checkScope(const Token *Tok1, const char varname[], bool classmember, unsigned int sz);
|
||||||
|
|
||||||
void error(const Token *tok, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(tok, severity, id, msg);
|
reportError(tok, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const std::list<const Token *> &callstack, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(callstack, severity, id, msg);
|
reportError(callstack, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
@ -197,12 +197,12 @@ private:
|
||||||
void parseClass(const Token *tok1, std::vector<const char *> &classname);
|
void parseClass(const Token *tok1, std::vector<const char *> &classname);
|
||||||
void variable(const char classname[], const Token *tokVarname);
|
void variable(const char classname[], const Token *tokVarname);
|
||||||
|
|
||||||
void error(const Token *tok, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(tok, severity, id, msg);
|
reportError(tok, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const std::list<const Token *> &callstack, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(callstack, severity, id, msg);
|
reportError(callstack, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
@ -251,12 +251,12 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void error(const Token *tok, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(tok, severity, id, msg);
|
reportError(tok, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const std::list<const Token *> &callstack, const std::string &severity, const std::string &id, const std::string &msg)
|
void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg)
|
||||||
{
|
{
|
||||||
reportError(callstack, severity, id, msg);
|
reportError(callstack, severity, id, msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -965,90 +965,90 @@ void CheckOther::checkZeroDivision()
|
||||||
|
|
||||||
void CheckOther::cstyleCastError(const Token *tok)
|
void CheckOther::cstyleCastError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "cstyleCast", "C-style pointer casting");
|
reportError(tok, Severity::style, "cstyleCast", "C-style pointer casting");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::redundantIfDelete0Error(const Token *tok)
|
void CheckOther::redundantIfDelete0Error(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "redundantIfDelete0", "Redundant condition. It is safe to deallocate a NULL pointer");
|
reportError(tok, Severity::style, "redundantIfDelete0", "Redundant condition. It is safe to deallocate a NULL pointer");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::redundantIfRemoveError(const Token *tok)
|
void CheckOther::redundantIfRemoveError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "redundantIfRemove", "Redundant condition. The remove function in the STL will not do anything if element doesn't exist");
|
reportError(tok, Severity::style, "redundantIfRemove", "Redundant condition. The remove function in the STL will not do anything if element doesn't exist");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::dangerousUsageStrtolError(const Token *tok)
|
void CheckOther::dangerousUsageStrtolError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "dangerousUsageStrtol", "Invalid radix in call to strtol or strtoul. Must be 0 or 2-36");
|
reportError(tok, Severity::error, "dangerousUsageStrtol", "Invalid radix in call to strtol or strtoul. Must be 0 or 2-36");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::ifNoActionError(const Token *tok)
|
void CheckOther::ifNoActionError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "ifNoAction", "Found redundant if condition - 'if (condition);'");
|
reportError(tok, Severity::style, "ifNoAction", "Found redundant if condition - 'if (condition);'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::sprintfOverlappingDataError(const Token *tok, const std::string &varname)
|
void CheckOther::sprintfOverlappingDataError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "sprintfOverlappingData", "Overlapping data buffer " + varname + "\nWhen using sprintf the same buffer must not be used both for output and input. The behaviour is undefined when that happens.\nFor example: 'sprintf(str,\"<%s>\",str);'");
|
reportError(tok, Severity::error, "sprintfOverlappingData", "Overlapping data buffer " + varname + "\nWhen using sprintf the same buffer must not be used both for output and input. The behaviour is undefined when that happens.\nFor example: 'sprintf(str,\"<%s>\",str);'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::udivError(const Token *tok)
|
void CheckOther::udivError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "udivError", "Unsigned division. The result will be wrong.");
|
reportError(tok, Severity::error, "udivError", "Unsigned division. The result will be wrong.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::udivWarning(const Token *tok)
|
void CheckOther::udivWarning(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "all style", "udivWarning", "Warning: Division with signed and unsigned operators");
|
reportError(tok, Severity::possibleStyle, "udivWarning", "Warning: Division with signed and unsigned operators");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname)
|
void CheckOther::unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "unusedStructMember", "struct or union member '" + structname + "::" + varname + "' is never used");
|
reportError(tok, Severity::style, "unusedStructMember", "struct or union member '" + structname + "::" + varname + "' is never used");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::passedByValueError(const Token *tok, const std::string &parname)
|
void CheckOther::passedByValueError(const Token *tok, const std::string &parname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "passedByValue", "Function parameter '" + parname + "' is passed by value. It could be passed by reference instead.");
|
reportError(tok, Severity::style, "passedByValue", "Function parameter '" + parname + "' is passed by value. It could be passed by reference instead.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::constStatementError(const Token *tok, const std::string &type)
|
void CheckOther::constStatementError(const Token *tok, const std::string &type)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "constStatement", "Redundant code: Found a statement that begins with " + type + " constant");
|
reportError(tok, Severity::style, "constStatement", "Redundant code: Found a statement that begins with " + type + " constant");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::charArrayIndexError(const Token *tok)
|
void CheckOther::charArrayIndexError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "charArrayIndex", "Warning - using char variable as array index");
|
reportError(tok, Severity::style, "charArrayIndex", "Warning - using char variable as array index");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::charBitOpError(const Token *tok)
|
void CheckOther::charBitOpError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "charBitOp", "Warning - using char variable in bit operation");
|
reportError(tok, Severity::style, "charBitOp", "Warning - using char variable in bit operation");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::variableScopeError(const Token *tok, const std::string &varname)
|
void CheckOther::variableScopeError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "variableScope", "The scope of the variable " + varname + " can be limited");
|
reportError(tok, Severity::style, "variableScope", "The scope of the variable " + varname + " can be limited");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::conditionAlwaysTrueFalse(const Token *tok, const std::string &truefalse)
|
void CheckOther::conditionAlwaysTrueFalse(const Token *tok, const std::string &truefalse)
|
||||||
{
|
{
|
||||||
reportError(tok, "style", "conditionAlwaysTrueFalse", "Condition is always " + truefalse);
|
reportError(tok, Severity::style, "conditionAlwaysTrueFalse", "Condition is always " + truefalse);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::strPlusChar(const Token *tok)
|
void CheckOther::strPlusChar(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "strPlusChar", "Unusual pointer arithmetic");
|
reportError(tok, Severity::error, "strPlusChar", "Unusual pointer arithmetic");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::nullPointerError(const Token *tok)
|
void CheckOther::nullPointerError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "nullPointer", "Possible null pointer dereference");
|
reportError(tok, Severity::error, "nullPointer", "Possible null pointer dereference");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::zerodivError(const Token *tok)
|
void CheckOther::zerodivError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "zerodiv", "Division by zero");
|
reportError(tok, Severity::error, "zerodiv", "Division by zero");
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,13 +31,13 @@ CheckStl instance;
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::iteratorsError(const Token *tok, const std::string &container1, const std::string &container2)
|
void CheckStl::iteratorsError(const Token *tok, const std::string &container1, const std::string &container2)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "iterators", "Same iterator is used with both " + container1 + " and " + container2);
|
reportError(tok, Severity::error, "iterators", "Same iterator is used with both " + container1 + " and " + container2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error message used when dereferencing an iterator that has been erased..
|
// Error message used when dereferencing an iterator that has been erased..
|
||||||
void CheckStl::dereferenceErasedError(const Token *tok, const std::string &itername)
|
void CheckStl::dereferenceErasedError(const Token *tok, const std::string &itername)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "eraseDereference", "Dereferenced iterator '" + itername + "' has been erased");
|
reportError(tok, Severity::error, "eraseDereference", "Dereferenced iterator '" + itername + "' has been erased");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckStl::iterators()
|
void CheckStl::iterators()
|
||||||
|
@ -131,7 +131,7 @@ void CheckStl::stlOutOfBounds()
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var)
|
void CheckStl::stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "stlOutOfBounds", "When " + num + "==" + var + ".size(), " + var + "[" + num + "] is out of bounds");
|
reportError(tok, Severity::error, "stlOutOfBounds", "When " + num + "==" + var + ".size(), " + var + "[" + num + "] is out of bounds");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ void CheckStl::eraseCheckLoop(const Token *it)
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::eraseError(const Token *tok)
|
void CheckStl::eraseError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "erase", "Dangerous usage of erase\nAfter erase has been used the iterator may be invalid so dereferencing it or comparing it with other iterator is invalid.");
|
reportError(tok, Severity::error, "erase", "Dangerous usage of erase\nAfter erase has been used the iterator may be invalid so dereferencing it or comparing it with other iterator is invalid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -317,14 +317,14 @@ void CheckStl::pushback()
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::pushbackError(const Token *tok, const std::string &iterator_name)
|
void CheckStl::pushbackError(const Token *tok, const std::string &iterator_name)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "pushback", "After push_back or push_front, the iterator '" + iterator_name + "' may be invalid");
|
reportError(tok, Severity::error, "pushback", "After push_back or push_front, the iterator '" + iterator_name + "' may be invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::invalidPointerError(const Token *tok, const std::string &pointer_name)
|
void CheckStl::invalidPointerError(const Token *tok, const std::string &pointer_name)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "pushback", "Invalid pointer '" + pointer_name + "' after push_back / push_front");
|
reportError(tok, Severity::error, "pushback", "Invalid pointer '" + pointer_name + "' after push_back / push_front");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -374,5 +374,5 @@ void CheckStl::stlBoundries()
|
||||||
// Error message for bad boundry usage..
|
// Error message for bad boundry usage..
|
||||||
void CheckStl::stlBoundriesError(const Token *tok)
|
void CheckStl::stlBoundriesError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, "error", "stlBoundries", "STL range check should be using != and not < since the order of the pointers isn't guaranteed");
|
reportError(tok, Severity::error, "stlBoundries", "STL range check should be using != and not < since the order of the pointers isn't guaranteed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,4 +334,28 @@ private:
|
||||||
void _writemsg(const Tokenizer *tokenizer, const Token *tok, const char severity[], const std::string &msg, const std::string &id);
|
void _writemsg(const Tokenizer *tokenizer, const Token *tok, const char severity[], const std::string &msg, const std::string &id);
|
||||||
void _writemsg(const Tokenizer *tokenizer, const std::list<const Token *> &callstack, const char severity[], const std::string &msg, const std::string &id);
|
void _writemsg(const Tokenizer *tokenizer, const std::list<const Token *> &callstack, const char severity[], const std::string &msg, const std::string &id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** enum class for severity */
|
||||||
|
class Severity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum e { error, style, possibleError, possibleStyle };
|
||||||
|
static std::string stringify(e severity)
|
||||||
|
{
|
||||||
|
switch (severity)
|
||||||
|
{
|
||||||
|
case error:
|
||||||
|
return "error";
|
||||||
|
case style:
|
||||||
|
return "style";
|
||||||
|
case possibleError:
|
||||||
|
return "possible error";
|
||||||
|
case possibleStyle:
|
||||||
|
return "possible style";
|
||||||
|
};
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -200,7 +200,7 @@ private:
|
||||||
" int data[2];\n"
|
" int data[2];\n"
|
||||||
" data[ sizeof(data[0]) ] = 0;\n"
|
" data[ sizeof(data[0]) ] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void sizeof3()
|
void sizeof3()
|
||||||
|
@ -223,7 +223,7 @@ private:
|
||||||
" str[15] = 0;\n"
|
" str[15] = 0;\n"
|
||||||
" str[16] = 0;\n"
|
" str[16] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ private:
|
||||||
" str[15] = 0;\n"
|
" str[15] = 0;\n"
|
||||||
" str[16] = 0;\n"
|
" str[16] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ private:
|
||||||
" for (i = 0; i < 100; i++)\n"
|
" for (i = 0; i < 100; i++)\n"
|
||||||
" sum += val[i];\n"
|
" sum += val[i];\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -258,7 +258,7 @@ private:
|
||||||
" for (i = 1; i < 100; i++)\n"
|
" for (i = 1; i < 100; i++)\n"
|
||||||
" sum += val[i];\n"
|
" sum += val[i];\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ private:
|
||||||
" for (i = a; i < 100; i++)\n"
|
" for (i = a; i < 100; i++)\n"
|
||||||
" sum += val[i];\n"
|
" sum += val[i];\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ private:
|
||||||
" int i[SIZE];\n"
|
" int i[SIZE];\n"
|
||||||
" i[SIZE] = 0;\n"
|
" i[SIZE] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ private:
|
||||||
" int i[10];\n"
|
" int i[10];\n"
|
||||||
" i[ sizeof(i) - 1 ] = 0;\n"
|
" i[ sizeof(i) - 1 ] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ private:
|
||||||
" struct ABC abc;\n"
|
" struct ABC abc;\n"
|
||||||
" abc.str[10] = 0;\n"
|
" abc.str[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:9]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:9]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -324,7 +324,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" abc->str[10] = 0;\n"
|
" abc->str[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:8]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:8]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ private:
|
||||||
" struct ABC abc;\n"
|
" struct ABC abc;\n"
|
||||||
" abc.str[SIZE] = 0;\n"
|
" abc.str[SIZE] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:11]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:11]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void array_index_9()
|
void array_index_9()
|
||||||
|
@ -357,7 +357,7 @@ private:
|
||||||
" char str[5];\n"
|
" char str[5];\n"
|
||||||
" memclr( str ); // ERROR\n"
|
" memclr( str ); // ERROR\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" memclr(abc->str);\n"
|
" memclr(abc->str);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:8]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:8]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -398,7 +398,7 @@ private:
|
||||||
" abc->str[10] = 0;\n"
|
" abc->str[10] = 0;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:12]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:12]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,7 +415,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" str[10] = 0;\n"
|
" str[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:10]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:10]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void array_index_13()
|
void array_index_13()
|
||||||
|
@ -439,7 +439,7 @@ private:
|
||||||
" char str[3];\n"
|
" char str[3];\n"
|
||||||
" strcpy(str, \"abc\");\n"
|
" strcpy(str, \"abc\");\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -454,7 +454,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" strcpy( abc->str, \"abcdef\" );\n"
|
" strcpy( abc->str, \"abcdef\" );\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:8]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:8]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -468,7 +468,7 @@ private:
|
||||||
" for (i = 0; i <= 10; ++i)\n"
|
" for (i = 0; i <= 10; ++i)\n"
|
||||||
" a[i] = 0;\n"
|
" a[i] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:7]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -480,7 +480,7 @@ private:
|
||||||
" for (int i = 0; i < 8; ++i)\n"
|
" for (int i = 0; i < 8; ++i)\n"
|
||||||
" p[i] = 0;\n"
|
" p[i] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Buffer overrun\n", errout.str());
|
||||||
|
|
||||||
// No false positive
|
// No false positive
|
||||||
check("void foo(int x, int y)\n"
|
check("void foo(int x, int y)\n"
|
||||||
|
@ -501,7 +501,7 @@ private:
|
||||||
" char str[3];\n"
|
" char str[3];\n"
|
||||||
" sprintf(str, \"%s\", \"abc\");\n"
|
" sprintf(str, \"%s\", \"abc\");\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void snprintf1()
|
void snprintf1()
|
||||||
|
@ -555,7 +555,7 @@ private:
|
||||||
" strncpy(str, a, 10);\n"
|
" strncpy(str, a, 10);\n"
|
||||||
" strncat(str, b, 10);\n"
|
" strncat(str, b, 10);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void strncat2()
|
void strncat2()
|
||||||
|
@ -565,7 +565,7 @@ private:
|
||||||
" char str[5];\n"
|
" char str[5];\n"
|
||||||
" strncat(str, a, 5);\n"
|
" strncat(str, a, 5);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Dangerous usage of strncat. Tip: the 3rd parameter means maximum number of characters to append\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -577,7 +577,7 @@ private:
|
||||||
" char str[10];\n"
|
" char str[10];\n"
|
||||||
" cin >> str;\n"
|
" cin >> str;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Buffer overrun\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Buffer overrun\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -619,7 +619,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" str[3] = 0;\n"
|
" str[3] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -631,14 +631,14 @@ private:
|
||||||
" char *s = new char[10];\n"
|
" char *s = new char[10];\n"
|
||||||
" s[10] = 0;\n"
|
" s[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
|
|
||||||
check("void foo()\n"
|
check("void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char *s = malloc(10);\n"
|
" char *s = malloc(10);\n"
|
||||||
" s[10] = 0;\n"
|
" s[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ private:
|
||||||
" char s[10];\n"
|
" char s[10];\n"
|
||||||
" memset(s, 5, '*');\n"
|
" memset(s, 5, '*');\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) The size argument is given as a char constant\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) The size argument is given as a char constant\n", errout.str());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ private:
|
||||||
" void operator=(const Fred &fred) { }\n"
|
" void operator=(const Fred &fred) { }\n"
|
||||||
" int i;\n"
|
" int i;\n"
|
||||||
"};\n");
|
"};\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all style) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible style) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void initvar_operator_eq3()
|
void initvar_operator_eq3()
|
||||||
|
@ -382,7 +382,7 @@ private:
|
||||||
"\n"
|
"\n"
|
||||||
"void Fred::operator=(const Fred &f)\n"
|
"void Fred::operator=(const Fred &f)\n"
|
||||||
"{ }", true);
|
"{ }", true);
|
||||||
ASSERT_EQUALS("[test.cpp:13]: (all style) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:13]: (possible style) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='\n", errout.str());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ private:
|
||||||
" unsigned int uvar = 2;\n"
|
" unsigned int uvar = 2;\n"
|
||||||
" return ivar / uvar;\n"
|
" return ivar / uvar;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all style) Warning: Division with signed and unsigned operators\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible style) Warning: Division with signed and unsigned operators\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void division2()
|
void division2()
|
||||||
|
@ -85,7 +85,7 @@ private:
|
||||||
" unsigned int uvar = 2;\n"
|
" unsigned int uvar = 2;\n"
|
||||||
" return uvar / ivar;\n"
|
" return uvar / ivar;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (all style) Warning: Division with signed and unsigned operators\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (possible style) Warning: Division with signed and unsigned operators\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void division3()
|
void division3()
|
||||||
|
@ -98,7 +98,7 @@ private:
|
||||||
" u32 uvar = 2;\n"
|
" u32 uvar = 2;\n"
|
||||||
" return uvar / ivar;\n"
|
" return uvar / ivar;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:7]: (all style) Warning: Division with signed and unsigned operators\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7]: (possible style) Warning: Division with signed and unsigned operators\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void division4()
|
void division4()
|
||||||
|
|
|
@ -607,7 +607,7 @@ private:
|
||||||
" return;\n"
|
" return;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n", true);
|
"}\n", true);
|
||||||
ASSERT_EQUALS("[test.cpp:9]: (all) Memory leak: str\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:9]: (possible error) Memory leak: str\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1128,7 +1128,7 @@ private:
|
||||||
check(code.c_str(), false);
|
check(code.c_str(), false);
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
check(code.c_str(), true);
|
check(code.c_str(), true);
|
||||||
ASSERT_EQUALS("[test.cpp:12]: (all) Memory leak: str\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:12]: (possible error) Memory leak: str\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void switch3()
|
void switch3()
|
||||||
|
@ -1923,7 +1923,7 @@ private:
|
||||||
"{\n"
|
"{\n"
|
||||||
" Fred *f = new Fred;\n"
|
" Fred *f = new Fred;\n"
|
||||||
"}\n", true);
|
"}\n", true);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Memory leak: f\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Memory leak: f\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2519,7 +2519,7 @@ private:
|
||||||
" delete [] str2;\n"
|
" delete [] str2;\n"
|
||||||
"}\n", true);
|
"}\n", true);
|
||||||
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Memory leak: Fred::str1\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Memory leak: Fred::str1\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2691,7 +2691,7 @@ private:
|
||||||
" int * p;\n"
|
" int * p;\n"
|
||||||
" A() { p = new int; }\n"
|
" A() { p = new int; }\n"
|
||||||
"};\n", true);
|
"};\n", true);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Memory leak: A::p\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Memory leak: A::p\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void class11()
|
void class11()
|
||||||
|
@ -2704,7 +2704,7 @@ private:
|
||||||
"};\n"
|
"};\n"
|
||||||
"A::A() : p(new int[10])\n"
|
"A::A() : p(new int[10])\n"
|
||||||
"{ }", true);
|
"{ }", true);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (all) Memory leak: A::p\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) Memory leak: A::p\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue