llvm-project/clang-tools-extra/test/clang-tidy/misc-non-private-member-var...

381 lines
9.3 KiB
C++
Raw Normal View History

[clang-tidy] Non-private member variables in classes (MISRA, CppCoreGuidelines, HICPP) Summary: Finds classes that not only contain the data (non-static member variables), but also have logic (non-static member functions), and diagnoses all member variables that have any other scope other than `private`. They should be made `private`, and manipulated exclusively via the member functions. Optionally, classes with all member variables being `public` could be ignored, and optionally all `public` member variables could be ignored. Options ------- * IgnoreClassesWithAllMemberVariablesBeingPublic Allows to completely ignore classes if **all** the member variables in that class have `public` visibility. * IgnorePublicMemberVariables Allows to ignore (not diagnose) **all** the member variables with `public` visibility scope. References: * MISRA 11-0-1 Member data in non-POD class types shall be private. * https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c2-use-class-if-the-class-has-an-invariant-use-struct-if-the-data-members-can-vary-independently * https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-private * https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rh-protected Reviewers: JonasToth, aaron.ballman, alexfh, hokein, xazax.hun Reviewed By: aaron.ballman Subscribers: Eugene.Zelenko, zinovy.nis, cfe-commits, rnkovacs, nemanjai, mgorny, xazax.hun, kbarton Tags: #clang-tools-extra Differential Revision: https://reviews.llvm.org/D52771 llvm-svn: 344757
2018-10-19 04:16:44 +08:00
// RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t
// RUN: %check_clang_tidy -check-suffixes=PUBLIC,NONPRIVATE,PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: 0}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 0}]}' --
// RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: 0}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 1}]}' --
// RUN: %check_clang_tidy -check-suffixes=PUBLIC,PROTECTED %s cppcoreguidelines-non-private-member-variables-in-classes %t -- --
// RUN: %check_clang_tidy -check-suffixes=PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: 1}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 0}]}' --
// RUN: %check_clang_tidy -check-suffixes=PROTECTED %s misc-non-private-member-variables-in-classes %t -- -config='{CheckOptions: [{key: misc-non-private-member-variables-in-classes.IgnorePublicMemberVariables, value: 1}, {key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 1}]}' --
//----------------------------------------------------------------------------//
// Only data, do not warn
struct S0 {
int S0_v0;
public:
int S0_v1;
protected:
int S0_v2;
private:
int S0_v3;
};
class S1 {
int S1_v0;
public:
int S1_v1;
protected:
int S1_v2;
private:
int S1_v3;
};
//----------------------------------------------------------------------------//
// All functions are static, do not warn.
struct S2 {
static void S2_m0();
int S2_v0;
public:
static void S2_m1();
int S2_v1;
protected:
static void S2_m3();
int S2_v2;
private:
static void S2_m4();
int S2_v3;
};
class S3 {
static void S3_m0();
int S3_v0;
public:
static void S3_m1();
int S3_v1;
protected:
static void S3_m3();
int S3_v2;
private:
static void S3_m4();
int S3_v3;
};
//============================================================================//
// union != struct/class. do not diagnose.
union U0 {
void U0_m0();
int U0_v0;
public:
void U0_m1();
int U0_v1;
protected:
void U0_m2();
int U0_v2;
private:
void U0_m3();
int U0_v3;
};
//============================================================================//
// Has non-static method with default visibility.
struct S4 {
void S4_m0();
int S4_v0;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v0' has public visibility
public:
int S4_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S4_v1' has public visibility
protected:
int S4_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S4_v2' has protected visibility
private:
int S4_v3;
};
class S5 {
void S5_m0();
int S5_v0;
public:
int S5_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S5_v1' has public visibility
protected:
int S5_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S5_v2' has protected visibility
private:
int S5_v3;
};
//----------------------------------------------------------------------------//
// Has non-static method with public visibility.
struct S6 {
int S6_v0;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v0' has public visibility
public:
void S6_m0();
int S6_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S6_v1' has public visibility
protected:
int S6_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S6_v2' has protected visibility
private:
int S6_v3;
};
class S7 {
int S7_v0;
public:
void S7_m0();
int S7_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S7_v1' has public visibility
protected:
int S7_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S7_v2' has protected visibility
private:
int S7_v3;
};
//----------------------------------------------------------------------------//
// Has non-static method with protected visibility.
struct S8 {
int S8_v0;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v0' has public visibility
public:
int S8_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S8_v1' has public visibility
protected:
void S8_m0();
int S8_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S8_v2' has protected visibility
private:
int S8_v3;
};
class S9 {
int S9_v0;
public:
int S9_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S9_v1' has public visibility
protected:
void S9_m0();
int S9_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S9_v2' has protected visibility
private:
int S9_v3;
};
//----------------------------------------------------------------------------//
// Has non-static method with private visibility.
struct S10 {
int S10_v0;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v0' has public visibility
public:
int S10_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S10_v1' has public visibility
protected:
int S10_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S10_v2' has protected visibility
private:
void S10_m0();
int S10_v3;
};
class S11 {
int S11_v0;
public:
int S11_v1;
// CHECK-MESSAGES-PUBLIC: :[[@LINE-1]]:7: warning: member variable 'S11_v1' has public visibility
protected:
int S11_v2;
// CHECK-MESSAGES-PROTECTED: :[[@LINE-1]]:7: warning: member variable 'S11_v2' has protected visibility
private:
void S11_m0();
int S11_v3;
};
//============================================================================//
// Static variables are ignored.
// Has non-static methods and static variables.
struct S12 {
void S12_m0();
static int S12_v0;
public:
void S12_m1();
static int S12_v1;
protected:
void S12_m2();
static int S12_v2;
private:
void S12_m3();
static int S12_v3;
};
class S13 {
void S13_m0();
static int S13_v0;
public:
void S13_m1();
static int S13_v1;
protected:
void S13_m2();
static int S13_v2;
private:
void S13_m3();
static int S13_v3;
};
struct S14 {
void S14_m0();
int S14_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v0' has public visibility
public:
void S14_m1();
int S14_v1;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S14_v1' has public visibility
protected:
void S14_m2();
private:
void S14_m3();
};
class S15 {
void S15_m0();
public:
void S15_m1();
int S15_v1;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S15_v1' has public visibility
protected:
void S15_m2();
private:
void S15_m3();
};
//----------------------------------------------------------------------------//
template <typename T>
struct S97 {
void method();
T S97_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:5: warning: member variable 'S97_v0' has public visibility
};
template struct S97<char *>;
template <>
struct S97<double> {
void method();
double S97d_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:10: warning: member variable 'S97d_v0' has public visibility
};
//----------------------------------------------------------------------------//
#define FIELD(x) int x;
// Do diagnose fields originating from macros.
struct S98 {
void method();
FIELD(S98_v0);
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:9: warning: member variable 'S98_v0' has public visibility
};
//----------------------------------------------------------------------------//
// Don't look in descendant classes.
class S99 {
void method();
struct S99_0 {
int S99_S0_v0;
};
public:
struct S99_1 {
int S99_S0_v0;
};
protected:
struct S99_2 {
int S99_S0_v0;
};
private:
struct S99_3 {
int S99_S0_v0;
};
};
//----------------------------------------------------------------------------//
// Only diagnose once, don't let the inheritance fool you.
struct S100 {
int S100_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S100_v0' has public visibility
void m0();
};
struct S101_default_inheritance : S100 {
int S101_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S101_v0' has public visibility
void m1();
};
struct S102_public_inheritance : public S100 {
int S102_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S102_v0' has public visibility
void m1();
};
struct S103_protected_inheritance : protected S100 {
int S103_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S103_v0' has public visibility
void m1();
};
struct S104_private_inheritance : private S100 {
int S104_v0;
// CHECK-MESSAGES-NONPRIVATE: :[[@LINE-1]]:7: warning: member variable 'S104_v0' has public visibility
void m1();
};