Skip to content

Commit 3365b5a

Browse files
committed
Address feedback comments
1 parent 3e54854 commit 3365b5a

4 files changed

Lines changed: 32 additions & 40 deletions

File tree

cpp/common/src/codingstandards/cpp/lifetimes/CppObjects.qll

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -144,30 +144,29 @@ abstract class ObjectIdentityBase extends Element {
144144
* Note that this does not hold for `e->x` or `e[x]` where `e` is a pointer.
145145
*/
146146
Expr getASubobjectAccessOf(Expr e) {
147-
exists(Field f |
148-
not f.getUnderlyingType() instanceof ReferenceType and
149-
f.getAnAccess().(FieldAccess) = result.getAChild*()
150-
) and
151-
(
152-
result = e
153-
or
154-
result.(DotFieldAccess).getQualifier() = getASubobjectAccessOf(e)
155-
)
147+
result = e
148+
or
149+
result.(DotFieldAccess).getQualifier() = getASubobjectAccessOf(e) and
150+
not result.(DotFieldAccess).getTarget().getUnderlyingType() instanceof ReferenceType
156151
or
157152
result.(ArrayExpr).getArrayBase() = getASubobjectAccessOf(e) and
158153
not result.(ArrayExpr).getArrayBase().getUnspecifiedType() instanceof PointerType
159154
}
160155

161156
/**
162-
* gets an access where the pointee is the subobject
157+
* Finds subobjects of the pointee for expression `e`,
158+
* where `e` has the type pointer type.
159+
*
160+
* For `e` this will be subobject accesses of `*e`.
161+
* Or for `e->x` the subobject access is `x`.
163162
*/
164163
Expr getASubobjectAccessOfPointee(Expr e) {
165-
e.getParent() instanceof AddressOfExpr and
164+
e.getParent() instanceof PointerDereferenceExpr and
166165
result = getASubobjectAccessOf(e.getParent())
167166
or
168-
// the accessed field is a pointer to a subobject
169-
e.getParent().(PointerFieldAccess).getTarget().getUnspecifiedType() instanceof PointerType and
170-
result = getASubobjectAccessOf(e.getParent())
167+
// for e1->e2 : getASubobjectAccessOfPointee(e1) = e2 and or subobjects of e2
168+
result = getASubobjectAccessOf(e.getParent().(PointerFieldAccess)) and
169+
not result.(PointerFieldAccess).getTarget().getUnderlyingType() instanceof ReferenceType
171170
}
172171

173172
/**

cpp/misra/src/rules/RULE-6-8-4/MemberFunctionsRefqualified.ql

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,11 @@ class MembersReturningObject extends MembersReturningObjectOrSubobject {
3636
exists(ReturnStmt r, ThisExpr t |
3737
r.getEnclosingFunction() = this and
3838
(
39-
//direct access only
39+
//return `this`
4040
r.getAChild() = t
4141
or
42-
//or one level of indirection
43-
exists(PointerDereferenceExpr p |
44-
p.getAChild() = t and
45-
r.getAChild() = p
46-
)
42+
//accesses of subobjects through the `this` pointer
43+
r.getAChild() = getASubobjectAccessOf(t)
4744
) and
4845
t.getActualType().stripType() = this.getDeclaringType()
4946
)
@@ -60,16 +57,16 @@ class MembersReturningSubObject extends MembersReturningObjectOrSubobject {
6057
MembersReturningSubObject() {
6158
exists(ReturnStmt r, FieldAccess access, Expr e |
6259
r.getEnclosingFunction() = this and
63-
//direct access only
64-
r.getAChild() = e and
6560
(
66-
//pointer or reference to pointer subobject returned
67-
e = getASubobjectAccessOfPointee(access) and
68-
(e.getType() instanceof PointerType or e.getType() instanceof ReferenceType)
61+
//subobject returned by address
62+
r.getAChild() = access.getParent() and
63+
e = getASubobjectAccessOf(access) and
64+
access.getParent() instanceof AddressOfExpr
6965
or
7066
//reference to subobject returned
71-
(this.getType() instanceof ReferenceType or e.getType() instanceof ReferenceType) and
72-
not access.getTarget().getType() instanceof PointerType
67+
r.getAChild() = e and
68+
e = getASubobjectAccessOf(access) and
69+
this.getType() instanceof ReferenceType
7370
)
7471
)
7572
}
@@ -117,3 +114,6 @@ where
117114
not f instanceof AppropriatelyQualified and
118115
not f instanceof DefaultedAssignmentOperator
119116
select f, "Member function is not properly ref qualified."
117+
// from Expr e, PointerFieldAccess p
118+
// where e.getParent() = p
119+
// select e, p, p.getTarget(), p.getQualifier(), p.getParent()
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
| test.cpp:12:14:12:20 | Members returning object or subobject | Member function is not properly ref qualified. |
22
| test.cpp:24:12:24:23 | Members returning object or subobject | Member function is not properly ref qualified. |
3-
| test.cpp:28:6:28:18 | Members returning object or subobject | Member function is not properly ref qualified. |
43
| test.cpp:42:16:42:16 | Members returning object or subobject | Member function is not properly ref qualified. |
54
| test.cpp:42:16:42:16 | Members returning object or subobject | Member function is not properly ref qualified. |
65
| test.cpp:42:16:42:16 | Members returning object or subobject | Member function is not properly ref qualified. |
76
| test.cpp:61:8:61:8 | Members returning object or subobject | Member function is not properly ref qualified. |
87
| test.cpp:71:9:71:10 | Members returning object or subobject | Member function is not properly ref qualified. |
98
| test.cpp:79:8:79:9 | Members returning object or subobject | Member function is not properly ref qualified. |
10-
| test.cpp:82:8:82:9 | Members returning object or subobject | Member function is not properly ref qualified. |
11-
| test.cpp:85:8:85:9 | Members returning object or subobject | Member function is not properly ref qualified. |
129
| test.cpp:89:9:89:10 | Members returning object or subobject | Member function is not properly ref qualified. |
13-
| test.cpp:93:9:93:10 | Members returning object or subobject | Member function is not properly ref qualified. |
1410
| test.cpp:103:8:103:8 | Members returning object or subobject | Member function is not properly ref qualified. |
1511
| test.cpp:113:9:113:10 | Members returning object or subobject | Member function is not properly ref qualified. |
1612
| test.cpp:121:8:121:9 | Members returning object or subobject | Member function is not properly ref qualified. |
17-
| test.cpp:124:8:124:9 | Members returning object or subobject | Member function is not properly ref qualified. |
18-
| test.cpp:127:8:127:9 | Members returning object or subobject | Member function is not properly ref qualified. |
1913
| test.cpp:131:9:131:10 | Members returning object or subobject | Member function is not properly ref qualified. |
20-
| test.cpp:135:9:135:10 | Members returning object or subobject | Member function is not properly ref qualified. |

cpp/misra/test/rules/RULE-6-8-4/test.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,18 @@ class B {
8080
return i; // NON_COMPLIANT
8181
}
8282
int &f6() {
83-
return *ip; // COMPLIANT[FALSE_POSITIVE] -- reads pointer
83+
return *ip; // COMPLIANT -- reads pointer
8484
}
8585
int &f7() {
86-
return **ip2; // COMPLIANT[FALSE_POSITIVE]-- reads pointer
86+
return **ip2; // COMPLIANT -- reads pointer
8787
}
8888

8989
int *&f8() {
9090
// return &p; // won't compile
9191
return ip; // NON_COMPLIANT
9292
}
9393
int *&f9() {
94-
return *ip2; // COMPLIANT[FALSE_POSITIVE] -- reads pointer
94+
return *ip2; // COMPLIANT -- reads pointer
9595
}
9696
};
9797

@@ -122,17 +122,17 @@ class D {
122122
return this->i; // NON_COMPLIANT
123123
}
124124
int &f6() {
125-
return *this->ip; // COMPLIANT[FALSE_POSITIVE] -- reads pointer
125+
return *this->ip; // COMPLIANT -- reads pointer
126126
}
127127
int &f7() {
128-
return **this->ip2; // COMPLIANT[FALSE_POSITIVE] -- reads pointer
128+
return **this->ip2; // COMPLIANT -- reads pointer
129129
}
130130

131131
int *&f8() {
132132
// return &p; // won't compile
133133
return this->ip; // NON_COMPLIANT
134134
}
135135
int *&f9() {
136-
return *this->ip2; // COMPLIANT[FALSE_POSITIVE] -- reads pointer
136+
return *this->ip2; // COMPLIANT -- reads pointer
137137
}
138138
};

0 commit comments

Comments
 (0)