* Fix #9391 False negative: Uninitialized struct member (default constructor) * Format * Initialize variables * Init
This commit is contained in:
parent
be6daa94bb
commit
38bdece3fe
|
@ -206,7 +206,7 @@ void CheckClass::constructors()
|
||||||
std::vector<Usage> usageList = createUsageList(scope);
|
std::vector<Usage> usageList = createUsageList(scope);
|
||||||
|
|
||||||
for (const Function &func : scope->functionList) {
|
for (const Function &func : scope->functionList) {
|
||||||
if (!func.hasBody() || !(func.isConstructor() || func.type == Function::eOperatorEqual))
|
if ((!func.hasBody() && !func.isDefault()) || !(func.isConstructor() || func.type == Function::eOperatorEqual))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Bail: If initializer list is not recognized as a variable or type then skip since parsing is incomplete
|
// Bail: If initializer list is not recognized as a variable or type then skip since parsing is incomplete
|
||||||
|
@ -694,7 +694,8 @@ bool CheckClass::isBaseClassFunc(const Token *tok, const Scope *scope)
|
||||||
void CheckClass::initializeVarList(const Function &func, std::list<const Function *> &callstack, const Scope *scope, std::vector<Usage> &usage)
|
void CheckClass::initializeVarList(const Function &func, std::list<const Function *> &callstack, const Scope *scope, std::vector<Usage> &usage)
|
||||||
{
|
{
|
||||||
if (!func.functionScope)
|
if (!func.functionScope)
|
||||||
throw InternalError(nullptr, "Internal Error: Invalid syntax"); // #5702
|
return;
|
||||||
|
|
||||||
bool initList = func.isConstructor();
|
bool initList = func.isConstructor();
|
||||||
const Token *ftok = func.arg->link()->next();
|
const Token *ftok = func.arg->link()->next();
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
|
12
lib/ctu.h
12
lib/ctu.h
|
@ -60,18 +60,18 @@ namespace CTU {
|
||||||
Location(const Tokenizer *tokenizer, const Token *tok);
|
Location(const Tokenizer *tokenizer, const Token *tok);
|
||||||
Location(const std::string &fileName, nonneg int lineNumber, nonneg int column) : fileName(fileName), lineNumber(lineNumber), column(column) {}
|
Location(const std::string &fileName, nonneg int lineNumber, nonneg int column) : fileName(fileName), lineNumber(lineNumber), column(column) {}
|
||||||
std::string fileName;
|
std::string fileName;
|
||||||
nonneg int lineNumber;
|
nonneg int lineNumber{};
|
||||||
nonneg int column;
|
nonneg int column{};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UnsafeUsage {
|
struct UnsafeUsage {
|
||||||
UnsafeUsage() = default;
|
UnsafeUsage() = default;
|
||||||
UnsafeUsage(const std::string &myId, nonneg int myArgNr, const std::string &myArgumentName, const Location &location, MathLib::bigint value) : myId(myId), myArgNr(myArgNr), myArgumentName(myArgumentName), location(location), value(value) {}
|
UnsafeUsage(const std::string &myId, nonneg int myArgNr, const std::string &myArgumentName, const Location &location, MathLib::bigint value) : myId(myId), myArgNr(myArgNr), myArgumentName(myArgumentName), location(location), value(value) {}
|
||||||
std::string myId;
|
std::string myId;
|
||||||
nonneg int myArgNr;
|
nonneg int myArgNr{};
|
||||||
std::string myArgumentName;
|
std::string myArgumentName;
|
||||||
Location location;
|
Location location;
|
||||||
MathLib::bigint value;
|
MathLib::bigint value{};
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ namespace CTU {
|
||||||
CallBase(const Tokenizer *tokenizer, const Token *callToken);
|
CallBase(const Tokenizer *tokenizer, const Token *callToken);
|
||||||
virtual ~CallBase() {}
|
virtual ~CallBase() {}
|
||||||
std::string callId;
|
std::string callId;
|
||||||
int callArgNr;
|
int callArgNr{};
|
||||||
std::string callFunctionName;
|
std::string callFunctionName;
|
||||||
Location location;
|
Location location;
|
||||||
protected:
|
protected:
|
||||||
|
@ -119,7 +119,7 @@ namespace CTU {
|
||||||
bool loadFromXml(const tinyxml2::XMLElement *xmlElement);
|
bool loadFromXml(const tinyxml2::XMLElement *xmlElement);
|
||||||
|
|
||||||
std::string myId;
|
std::string myId;
|
||||||
nonneg int myArgNr;
|
nonneg int myArgNr{};
|
||||||
};
|
};
|
||||||
|
|
||||||
std::list<FunctionCall> functionCalls;
|
std::list<FunctionCall> functionCalls;
|
||||||
|
|
|
@ -422,14 +422,20 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void simple10() { // ticket #4388
|
void simple10() {
|
||||||
check("class Fred {\n"
|
check("class Fred {\n" // ticket #4388
|
||||||
"public:\n"
|
"public:\n"
|
||||||
" Fred() = default;\n"
|
" Fred() = default;\n"
|
||||||
"private:\n"
|
"private:\n"
|
||||||
" int x;\n"
|
" int x;\n"
|
||||||
"};");
|
"};");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n", errout.str());
|
||||||
|
|
||||||
|
check("struct S {\n" // #9391
|
||||||
|
" S() = default;\n"
|
||||||
|
" int i;\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (warning) Member variable 'S::i' is not initialized in the constructor.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void simple11() { // ticket #4536, #6214
|
void simple11() { // ticket #4536, #6214
|
||||||
|
|
Loading…
Reference in New Issue