forked from mathieu/cppcheck
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheckclass.h
More file actions
146 lines (121 loc) · 5.01 KB
/
Copy pathcheckclass.h
File metadata and controls
146 lines (121 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2009 Daniel Marjamäki and Cppcheck team.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/
*/
//---------------------------------------------------------------------------
#ifndef CheckClassH
#define CheckClassH
//---------------------------------------------------------------------------
#include "check.h"
#include "settings.h"
class Token;
/// @addtogroup Checks
/// @{
class CheckClass : public Check
{
public:
/** This constructor is used when registering the CheckClass */
CheckClass() : Check()
{ }
/** This constructor is used when running checks.. */
CheckClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
: Check(tokenizer, settings, errorLogger)
{ }
void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
{
CheckClass checkClass(tokenizer, settings, errorLogger);
checkClass.noMemset();
}
void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
{
CheckClass checkClass(tokenizer, settings, errorLogger);
if (settings->_checkCodingStyle)
{
checkClass.constructors();
checkClass.operatorEq();
checkClass.privateFunctions();
}
checkClass.virtualDestructor();
}
// Check that all class constructors are ok.
void constructors();
// Check that all private functions are called.
void privateFunctions();
// Check that the memsets are valid.
// The 'memset' function can do dangerous things if used wrong.
// Important: The checking doesn't work on simplified tokens list.
void noMemset();
// 'operator=' should return something..
void operatorEq(); // Warning upon "void operator=(.."
// The destructor in a base class should be virtual
void virtualDestructor();
private:
class Var
{
public:
Var(const char *name = 0, bool init = false, Var *next = 0)
{
this->name = name;
this->init = init;
this->next = next;
}
const char *name;
bool init;
Var *next;
};
void initializeVarList(const Token *tok1, const Token *ftok, Var *varlist, const char classname[], std::list<std::string> &callstack);
void initVar(Var *varlist, const char varname[]);
Var *getVarList(const Token *tok1, bool withClasses);
// Check constructors for a specified class
void checkConstructors(const Token *tok1, const char funcname[]);
// Reporting errors..
void noConstructorError(const Token *tok, const std::string &classname);
void uninitVarError(const Token *tok, const std::string &classname, const std::string &varname);
void operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname);
void unusedPrivateFunctionError(const Token *tok, const std::string &classname, const std::string &funcname);
void memsetClassError(const Token *tok, const std::string &memfunc);
void memsetStructError(const Token *tok, const std::string &memfunc, const std::string &classname);
void operatorEqReturnError(const Token *tok);
void virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived);
void getErrorMessages()
{
noConstructorError(0, "classname");
uninitVarError(0, "classname", "varname");
operatorEqVarError(0, "classname", "");
unusedPrivateFunctionError(0, "classname", "funcname");
memsetClassError(0, "memfunc");
memsetStructError(0, "memfunc", "classname");
operatorEqReturnError(0);
virtualDestructorError(0, "Base", "Derived");
}
std::string name() const
{
return "Class";
}
std::string classInfo() const
{
return "Check the code for each class.\n"
" * Missing constructors\n"
" * Are all variables initialized by the constructors?\n"
" * [[CheckMemset|Warn if memset, memcpy etc are used on a class]]\n"
" * If it's a base class, check that the destructor is virtual\n"
" * The operator= should return a constant reference to itself\n"
" * Are there unused private functions\n";
}
};
/// @}
//---------------------------------------------------------------------------
#endif