parent
e904f7341e
commit
07caf17eb3
|
@ -1353,6 +1353,10 @@ void CheckClass::checkMemset()
|
||||||
|
|
||||||
if (numIndirToVariableType == 1)
|
if (numIndirToVariableType == 1)
|
||||||
type = var->typeScope();
|
type = var->typeScope();
|
||||||
|
|
||||||
|
if (!type && mSettings->library.detectContainerOrIterator(var->typeStartToken())) {
|
||||||
|
memsetError(tok, tok->str(), var->getTypeName(), {}, /*isContainer*/ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1468,15 +1472,16 @@ void CheckClass::mallocOnClassError(const Token* tok, const std::string &memfunc
|
||||||
"since no constructor is called and class members remain uninitialized. Consider using 'new' instead.", CWE665, Certainty::normal);
|
"since no constructor is called and class members remain uninitialized. Consider using 'new' instead.", CWE665, Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type)
|
void CheckClass::memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type, bool isContainer)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::error, "memsetClass",
|
const std::string typeStr = isContainer ? std::string() : (type + " that contains a ");
|
||||||
"$symbol:" + memfunc +"\n"
|
const std::string msg = "$symbol:" + memfunc + "\n"
|
||||||
"$symbol:" + classname +"\n"
|
"$symbol:" + classname + "\n"
|
||||||
"Using '" + memfunc + "' on " + type + " that contains a " + classname + ".\n"
|
"Using '" + memfunc + "' on " + typeStr + classname + ".\n"
|
||||||
"Using '" + memfunc + "' on " + type + " that contains a " + classname + " is unsafe, because constructor, destructor "
|
"Using '" + memfunc + "' on " + typeStr + classname + " is unsafe, because constructor, destructor "
|
||||||
"and copy operator calls are omitted. These are necessary for this non-POD type to ensure that a valid object "
|
"and copy operator calls are omitted. These are necessary for this non-POD type to ensure that a valid object "
|
||||||
"is created.", CWE762, Certainty::normal);
|
"is created.";
|
||||||
|
reportError(tok, Severity::error, "memsetClass", msg, CWE762, Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type)
|
void CheckClass::memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type)
|
||||||
|
|
|
@ -206,7 +206,7 @@ private:
|
||||||
void missingMemberCopyError(const Token *tok, Function::Type functionType, const std::string& classname, const std::string& varname);
|
void missingMemberCopyError(const Token *tok, Function::Type functionType, const std::string& classname, const std::string& varname);
|
||||||
void operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname, bool inconclusive);
|
void operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname, bool inconclusive);
|
||||||
void unusedPrivateFunctionError(const Token *tok, const std::string &classname, const std::string &funcname);
|
void unusedPrivateFunctionError(const Token *tok, const std::string &classname, const std::string &funcname);
|
||||||
void memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type);
|
void memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type, bool isContainer = false);
|
||||||
void memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type);
|
void memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type);
|
||||||
void memsetErrorFloat(const Token *tok, const std::string &type);
|
void memsetErrorFloat(const Token *tok, const std::string &type);
|
||||||
void mallocOnClassError(const Token* tok, const std::string &memfunc, const Token* classTok, const std::string &classname);
|
void mallocOnClassError(const Token* tok, const std::string &memfunc, const Token* classTok, const std::string &classname);
|
||||||
|
|
|
@ -3109,6 +3109,16 @@ private:
|
||||||
" memset(b, 0, sizeof(b));\n"
|
" memset(b, 0, sizeof(b));\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// #1655
|
||||||
|
Settings s;
|
||||||
|
LOAD_LIB_2(s.library, "std.cfg");
|
||||||
|
checkNoMemset("void f() {\n"
|
||||||
|
" char c[] = \"abc\";\n"
|
||||||
|
" std::string s;\n"
|
||||||
|
" memcpy(&s, c, strlen(c) + 1);\n"
|
||||||
|
"}\n", s);
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (error) Using 'memcpy' on std::string.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void memsetOnInvalid() { // Ticket #5425
|
void memsetOnInvalid() { // Ticket #5425
|
||||||
|
|
Loading…
Reference in New Issue