Skip to content

Commit 61b7454

Browse files
Share OOP55-CPP with UB from ptr-to-member use
1 parent d7d4769 commit 61b7454

File tree

8 files changed

+170
-1
lines changed

8 files changed

+170
-1
lines changed

cpp/common/src/codingstandards/cpp/exclusions/cpp/Undefined.qll

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ newtype UndefinedQuery =
88
TCriticalUnspecifiedBehaviorQuery() or
99
TUndefinedBehaviorAuditQuery() or
1010
TCriticalUnspecifiedBehaviorAuditQuery() or
11-
TPossibleDataRaceBetweenThreadsQuery()
11+
TPossibleDataRaceBetweenThreadsQuery() or
12+
TNullPointerToMemberAccessUndefinedBehaviorQuery() or
13+
TUninitializedStaticPointerToMemberUndefinedBehaviorQuery() or
14+
TNonExistentMemberAccessUndefinedBehaviorQuery()
1215

1316
predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, string category) {
1417
query =
@@ -55,6 +58,33 @@ predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, s
5558
"cpp/misra/possible-data-race-between-threads" and
5659
ruleId = "RULE-4-1-3" and
5760
category = "required"
61+
or
62+
query =
63+
// `Query` instance for the `nullPointerToMemberAccessUndefinedBehavior` query
64+
UndefinedPackage::nullPointerToMemberAccessUndefinedBehaviorQuery() and
65+
queryId =
66+
// `@id` for the `nullPointerToMemberAccessUndefinedBehavior` query
67+
"cpp/misra/null-pointer-to-member-access-undefined-behavior" and
68+
ruleId = "RULE-4-1-3" and
69+
category = "required"
70+
or
71+
query =
72+
// `Query` instance for the `uninitializedStaticPointerToMemberUndefinedBehavior` query
73+
UndefinedPackage::uninitializedStaticPointerToMemberUndefinedBehaviorQuery() and
74+
queryId =
75+
// `@id` for the `uninitializedStaticPointerToMemberUndefinedBehavior` query
76+
"cpp/misra/uninitialized-static-pointer-to-member-undefined-behavior" and
77+
ruleId = "RULE-4-1-3" and
78+
category = "required"
79+
or
80+
query =
81+
// `Query` instance for the `nonExistentMemberAccessUndefinedBehavior` query
82+
UndefinedPackage::nonExistentMemberAccessUndefinedBehaviorQuery() and
83+
queryId =
84+
// `@id` for the `nonExistentMemberAccessUndefinedBehavior` query
85+
"cpp/misra/non-existent-member-access-undefined-behavior" and
86+
ruleId = "RULE-4-1-3" and
87+
category = "required"
5888
}
5989

6090
module UndefinedPackage {
@@ -92,4 +122,25 @@ module UndefinedPackage {
92122
// `Query` type for `possibleDataRaceBetweenThreads` query
93123
TQueryCPP(TUndefinedPackageQuery(TPossibleDataRaceBetweenThreadsQuery()))
94124
}
125+
126+
Query nullPointerToMemberAccessUndefinedBehaviorQuery() {
127+
//autogenerate `Query` type
128+
result =
129+
// `Query` type for `nullPointerToMemberAccessUndefinedBehavior` query
130+
TQueryCPP(TUndefinedPackageQuery(TNullPointerToMemberAccessUndefinedBehaviorQuery()))
131+
}
132+
133+
Query uninitializedStaticPointerToMemberUndefinedBehaviorQuery() {
134+
//autogenerate `Query` type
135+
result =
136+
// `Query` type for `uninitializedStaticPointerToMemberUndefinedBehavior` query
137+
TQueryCPP(TUndefinedPackageQuery(TUninitializedStaticPointerToMemberUndefinedBehaviorQuery()))
138+
}
139+
140+
Query nonExistentMemberAccessUndefinedBehaviorQuery() {
141+
//autogenerate `Query` type
142+
result =
143+
// `Query` type for `nonExistentMemberAccessUndefinedBehavior` query
144+
TQueryCPP(TUndefinedPackageQuery(TNonExistentMemberAccessUndefinedBehaviorQuery()))
145+
}
95146
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @id cpp/misra/non-existent-member-access-undefined-behavior
3+
* @name RULE-4-1-3: Pointer-to-member access of nonexistent member leads to undefined behavior
4+
* @description Using a pointer-to-member expression where the dynamic type of the first operand
5+
* does not contain the member pointed to by the second operand results in undefined
6+
* behavior.
7+
* @kind problem
8+
* @precision very-high
9+
* @problem.severity error
10+
* @tags external/misra/id/rule-4-1-3
11+
* correctness
12+
* scope/system
13+
* external/misra/enforcement/undecidable
14+
* external/misra/obligation/required
15+
*/
16+
17+
import cpp
18+
import codingstandards.cpp.misra
19+
import codingstandards.cpp.rules.accessofnonexistingmemberthroughpointertomember.AccessOfNonExistingMemberThroughPointerToMember
20+
21+
class NonExistentMemberAccessUndefinedBehaviorQuery extends AccessOfNonExistingMemberThroughPointerToMemberSharedQuery
22+
{
23+
NonExistentMemberAccessUndefinedBehaviorQuery() {
24+
this = UndefinedPackage::nonExistentMemberAccessUndefinedBehaviorQuery()
25+
}
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* @id cpp/misra/null-pointer-to-member-access-undefined-behavior
3+
* @name RULE-4-1-3: Null pointer-to-member access leads to undefined behavior
4+
* @description Using a null pointer-to-member value as the second operand in a pointer-to-member
5+
* expression results in undefined behavior.
6+
* @kind path-problem
7+
* @precision high
8+
* @problem.severity error
9+
* @tags external/misra/id/rule-4-1-3
10+
* correctness
11+
* scope/system
12+
* external/misra/enforcement/undecidable
13+
* external/misra/obligation/required
14+
*/
15+
16+
import cpp
17+
import codingstandards.cpp.misra
18+
import codingstandards.cpp.rules.accessofundefinedmemberthroughnullpointer.AccessOfUndefinedMemberThroughNullPointer
19+
20+
class NullPointerToMemberAccessUndefinedBehaviorQuery extends AccessOfUndefinedMemberThroughNullPointerSharedQuery
21+
{
22+
NullPointerToMemberAccessUndefinedBehaviorQuery() {
23+
this = UndefinedPackage::nullPointerToMemberAccessUndefinedBehaviorQuery()
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* @id cpp/misra/uninitialized-static-pointer-to-member-undefined-behavior
3+
* @name RULE-4-1-3: Uninitialized static pointer-to-member access leads to undefined behavior
4+
* @description Using an uninitialized static pointer-to-member in a pointer-to-member expression
5+
* results in undefined behavior.
6+
* @kind problem
7+
* @precision very-high
8+
* @problem.severity error
9+
* @tags external/misra/id/rule-4-1-3
10+
* correctness
11+
* scope/system
12+
* external/misra/enforcement/undecidable
13+
* external/misra/obligation/required
14+
*/
15+
16+
import cpp
17+
import codingstandards.cpp.misra
18+
import codingstandards.cpp.rules.accessofundefinedmemberthroughuninitializedstaticpointer.AccessOfUndefinedMemberThroughUninitializedStaticPointer
19+
20+
class UninitializedStaticPointerToMemberUndefinedBehaviorQuery extends AccessOfUndefinedMemberThroughUninitializedStaticPointerSharedQuery
21+
{
22+
UninitializedStaticPointerToMemberUndefinedBehaviorQuery() {
23+
this = UndefinedPackage::uninitializedStaticPointerToMemberUndefinedBehaviorQuery()
24+
}
25+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/accessofnonexistingmemberthroughpointertomember/AccessOfNonExistingMemberThroughPointerToMember.ql
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/accessofundefinedmemberthroughnullpointer/AccessOfUndefinedMemberThroughNullPointer.ql
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/accessofundefinedmemberthroughuninitializedstaticpointer/AccessOfUndefinedMemberThroughUninitializedStaticPointer.ql

rule_packages/cpp/Undefined.json

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,45 @@
6969
"concurrency",
7070
"scope/system"
7171
]
72+
},
73+
{
74+
"description": "Using a null pointer-to-member value as the second operand in a pointer-to-member expression results in undefined behavior.",
75+
"kind": "path-problem",
76+
"name": "Null pointer-to-member access leads to undefined behavior",
77+
"precision": "high",
78+
"severity": "error",
79+
"shared_implementation_short_name": "AccessOfUndefinedMemberThroughNullPointer",
80+
"short_name": "NullPointerToMemberAccessUndefinedBehavior",
81+
"tags": [
82+
"correctness",
83+
"scope/system"
84+
]
85+
},
86+
{
87+
"description": "Using an uninitialized static pointer-to-member in a pointer-to-member expression results in undefined behavior.",
88+
"kind": "problem",
89+
"name": "Uninitialized static pointer-to-member access leads to undefined behavior",
90+
"precision": "very-high",
91+
"severity": "error",
92+
"shared_implementation_short_name": "AccessOfUndefinedMemberThroughUninitializedStaticPointer",
93+
"short_name": "UninitializedStaticPointerToMemberUndefinedBehavior",
94+
"tags": [
95+
"correctness",
96+
"scope/system"
97+
]
98+
},
99+
{
100+
"description": "Using a pointer-to-member expression where the dynamic type of the first operand does not contain the member pointed to by the second operand results in undefined behavior.",
101+
"kind": "problem",
102+
"name": "Pointer-to-member access of nonexistent member leads to undefined behavior",
103+
"precision": "very-high",
104+
"severity": "error",
105+
"shared_implementation_short_name": "AccessOfNonExistingMemberThroughPointerToMember",
106+
"short_name": "NonExistentMemberAccessUndefinedBehavior",
107+
"tags": [
108+
"correctness",
109+
"scope/system"
110+
]
72111
}
73112
],
74113
"title": "There shall be no occurrence of undefined or critical unspecified behaviour"

0 commit comments

Comments
 (0)