Skip to content

Commit 1ca7c5b

Browse files
authored
Merge pull request github#11091 from JarLob/assign
Fix AV Rule 76
2 parents 83caf01 + ad0b36a commit 1ca7c5b

File tree

5 files changed

+107
-3
lines changed

5 files changed

+107
-3
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Fixed a bug in `cpp/jsf/av-rule-76` that caused the query to miss results when an implicitly-defined copy constructor or copy assignment operator was generated.

cpp/ql/src/jsf/4.10 Classes/AV Rule 76.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ predicate hasNontrivialDestructor(Class c) {
3838
from Class c
3939
where
4040
(hasPointerMember(c) or hasNontrivialDestructor(c)) and
41-
not (
42-
c.getAMemberFunction() instanceof CopyConstructor and
43-
c.getAMemberFunction() instanceof CopyAssignmentOperator
41+
(
42+
c.hasImplicitCopyAssignmentOperator() or
43+
c.hasImplicitCopyConstructor()
4444
) and
4545
not c instanceof Struct
4646
select c,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
| test.cpp:5:7:5:12 | Class2 | AV Rule 76: A copy constructor and an assignment operator shall be declared for classes that contain pointers to data items or nontrivial destructors. |
2+
| test.cpp:16:7:16:12 | Class3 | AV Rule 76: A copy constructor and an assignment operator shall be declared for classes that contain pointers to data items or nontrivial destructors. |
3+
| test.cpp:33:7:33:12 | Class4 | AV Rule 76: A copy constructor and an assignment operator shall be declared for classes that contain pointers to data items or nontrivial destructors. |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jsf/4.10 Classes/AV Rule 76.ql
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
class Class1 // good: no pointer members, default assignment operator and copy constructor
2+
{
3+
};
4+
5+
class Class2 // bad: pointer members, default assignment operator and copy constructor
6+
{
7+
private:
8+
int* _a;
9+
10+
public:
11+
Class2(int* a):_a(a)
12+
{
13+
}
14+
};
15+
16+
class Class3 // bad: pointer members, custom assignment operator and default copy constructor
17+
{
18+
private:
19+
int* _a;
20+
21+
public:
22+
Class3(int* a) :_a(a)
23+
{
24+
}
25+
26+
Class3& operator=(const Class3& rhs)
27+
{
28+
this->_a = rhs._a;
29+
return *this;
30+
}
31+
};
32+
33+
class Class4 // bad: pointer members, default assignment operator and custom copy constructor
34+
{
35+
private:
36+
int* _a;
37+
38+
public:
39+
Class4(int* a) :_a(a)
40+
{
41+
}
42+
43+
Class4(const Class4& rhs):_a(rhs._a)
44+
{
45+
}
46+
};
47+
48+
class Class5 // good: pointer members, custom assignment operator and copy constructor
49+
{
50+
private:
51+
int* _a;
52+
53+
public:
54+
Class5(int* a) :_a(a)
55+
{
56+
}
57+
58+
Class5(const Class5& rhs) :_a(rhs._a)
59+
{
60+
}
61+
62+
Class5& operator=(const Class5& rhs)
63+
{
64+
this->_a = rhs._a;
65+
return *this;
66+
}
67+
};
68+
69+
class Class6 // good: pointer members, deleted assignment operator and copy constructor
70+
{
71+
private:
72+
int* _a;
73+
74+
public:
75+
Class6(int* a) :_a(a)
76+
{
77+
}
78+
79+
Class6& operator=(const Class6& rhs) = delete;
80+
Class6(const Class6& rhs) = delete;
81+
};
82+
83+
class Class7 // good: pointer members, disallowed assignment operator and copy constructor
84+
{
85+
private:
86+
int* _a;
87+
88+
public:
89+
Class7(int* a) :_a(a)
90+
{
91+
}
92+
93+
private:
94+
Class7& operator=(const Class7& rhs); // no implementation to get linker error!
95+
Class7(const Class7& rhs); // no implementation to get linker error!
96+
};

0 commit comments

Comments
 (0)