Skip to content

Commit 32c87af

Browse files
committed
Use the effective category in the exclusion process
In this commit we expand the meta data `Query` class to provide an effective category that is determined by combining a query's category and a possible active Guideline Recategorization Plan. The exclusion process now validates for a query with an associated deviation record whether the effective category allows a deviation. If this is not allowed, then the deviation record is not applied. Any deviation record applied to a query with an effective category not permitting deviation is considered invalid and will be listed in the analysis report.
1 parent edea6cc commit 32c87af

File tree

8 files changed

+69
-35
lines changed

8 files changed

+69
-35
lines changed

cpp/common/src/codingstandards/cpp/Exclusions.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ predicate isExcluded(Element e, Query query) {
3232
or
3333
not exists(e.getFile())
3434
or
35-
// There exists a `DeviationRecord` that applies to this element and query
35+
// There exists a `DeviationRecord` that applies to this element and query, and the query's effective category permits deviation.
36+
query.getEffectiveCategory().permitsDeviation() and
3637
exists(DeviationRecord dr | applyDeviationsAtQueryLevel() |
3738
// The element is in a file which has a deviation for this query
3839
exists(string path |

cpp/common/src/codingstandards/cpp/deviations/Deviations.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,13 @@ class DeviationRecord extends XMLElement {
332332
hasPermitId() and
333333
not hasADeviationPermit() and
334334
result = "There is no deviation permit with id `" + getPermitId() + "`."
335+
or
336+
exists(Query q | q.getQueryId() = getQueryId() |
337+
not q.getEffectiveCategory().permitsDeviation() and
338+
result =
339+
"The deviation is applied to a query with the rule category '" +
340+
q.getEffectiveCategory().toString() + "' that does not permit a deviation."
341+
)
335342
}
336343

337344
/** Holds if the deviation record is valid */

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,47 @@
11
import cpp
22
private import cpp.RuleMetadata as CPPRuleMetadata
33
private import c.RuleMetadata as CRuleMetadata
4+
private import codingstandards.cpp.guideline_recategorizations.GuidelineRecategorizations
45

56
newtype TQuery =
67
TQueryCPP(CPPRuleMetadata::TCPPQuery t) or
78
TQueryC(CRuleMetadata::TCQuery t)
89

10+
private predicate isMisraRuleCategory(string category) {
11+
category = ["disapplied", "advisory", "required", "mandatory"]
12+
}
13+
14+
newtype TEffectiveCategory =
15+
TInvalid(string reason) {
16+
exists(GuidelineRecategorization gr | reason = gr.getAnInvalidReason())
17+
} or
18+
TDisapplied() or
19+
TAdvisory() or
20+
TRequired() or
21+
TMandatory() or
22+
TNonMisraRuleCategory(string category) {
23+
exists(Query q | q.getCategory() = category | not isMisraRuleCategory(category))
24+
}
25+
26+
class EffectiveCategory extends TEffectiveCategory {
27+
string toString() {
28+
this instanceof TInvalid and result = "invalid"
29+
or
30+
this instanceof TDisapplied and result = "disapplied"
31+
or
32+
this instanceof TAdvisory and result = "advisory"
33+
or
34+
this instanceof TRequired and result = "required"
35+
or
36+
this instanceof TMandatory and result = "mandatory"
37+
or
38+
this = TNonMisraRuleCategory(result)
39+
}
40+
41+
/** Holds if the effective category permits a deviation */
42+
predicate permitsDeviation() { not this instanceof TMandatory and not this instanceof TInvalid }
43+
}
44+
945
class Query extends TQuery {
1046
string getQueryId() {
1147
CPPRuleMetadata::isQueryMetadata(this, result, _, _) or
@@ -22,5 +58,14 @@ class Query extends TQuery {
2258
CRuleMetadata::isQueryMetadata(this, _, _, result)
2359
}
2460

61+
EffectiveCategory getEffectiveCategory() {
62+
if exists(GuidelineRecategorization gr | gr.getQuery() = this)
63+
then
64+
exists(GuidelineRecategorization gr | gr.getQuery() = this |
65+
result = gr.getEffectiveCategory()
66+
)
67+
else result.toString() = this.getCategory()
68+
}
69+
2570
string toString() { result = getQueryId() }
2671
}

cpp/common/src/codingstandards/cpp/guideline_recategorizations/GuidelineRecategorizations.qll

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,6 @@ class GuidelineRecategorizations extends CodingStandardsConfigSection {
1212
GuidelineRecategorizations() { hasName("guideline-recategorizations") }
1313
}
1414

15-
newtype TEffectiveCategory =
16-
TInvalid(string reason) {
17-
exists(GuidelineRecategorization gr | reason = gr.getAnInvalidReason())
18-
} or
19-
TDisapplied() or
20-
TAdvisory() or
21-
TRequired() or
22-
TMandatory()
23-
24-
class EffectiveCategory extends TEffectiveCategory {
25-
string toString() {
26-
this instanceof TInvalid and result = "invalid"
27-
or
28-
this instanceof TDisapplied and result = "disapplied"
29-
or
30-
this instanceof TAdvisory and result = "advisory"
31-
or
32-
this instanceof TRequired and result = "required"
33-
or
34-
this instanceof TMandatory and result = "mandatory"
35-
}
36-
37-
/** Holds if the effective category permits a deviation */
38-
predicate permitsDeviation() { not this instanceof TMandatory and not this instanceof TInvalid }
39-
}
40-
4115
class GuidelineRecategorization extends XMLElement {
4216
GuidelineRecategorization() {
4317
getParent() instanceof GuidelineRecategorizations and
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
| coding-standards.xml:96:7:99:33 | deviation-permits-entry | deviations/invalid_deviations/coding-standards.xml: Deviation permit does not specify a permit identifier. |
2-
| coding-standards.xml:100:7:103:33 | deviation-permits-entry | deviations/invalid_deviations/coding-standards.xml: Deviation permit specifies unknown property `invalid-property`. |
1+
| coding-standards.xml:100:7:103:33 | deviation-permits-entry | deviations/invalid_deviations/coding-standards.xml: Deviation permit does not specify a permit identifier. |
2+
| coding-standards.xml:104:7:107:33 | deviation-permits-entry | deviations/invalid_deviations/coding-standards.xml: Deviation permit specifies unknown property `invalid-property`. |

cpp/common/test/deviations/invalid_deviations/InvalidDeviationRecords.expected

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
| coding-standards.xml:5:7:5:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: No rule-id and query-id specified for this deviation record. |
1+
| coding-standards.xml:5:7:5:27 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: No rule-id and query-id specified for this deviation record. |
22
| coding-standards.xml:6:7:8:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: The rule-id `bad rule id` for this deviation matches none of the available queries. |
33
| coding-standards.xml:9:7:11:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: A query-id of `bad rule id` is specified for this deviation, but not rule-id is specified. |
44
| coding-standards.xml:15:7:17:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: A query-id of `cpp/autosar/useless-assignment` is specified for this deviation, but not rule-id is specified. |
@@ -11,3 +11,4 @@
1111
| coding-standards.xml:51:7:61:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: A deviation `approved-by` is specified without providing both a `name` and `date`. |
1212
| coding-standards.xml:74:7:78:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: There is no deviation permit with id `non-existing-permit`. |
1313
| coding-standards.xml:79:7:81:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: No rule-id and query-id specified for this deviation record. |
14+
| coding-standards.xml:85:7:88:26 | deviations-entry | deviations/invalid_deviations/coding-standards.xml: The deviation is applied to a query with the rule category 'mandatory' that does not permit a deviation. |

cpp/common/test/deviations/invalid_deviations/coding-standards.xml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
<?xml version="1.0" ?>
1+
<?xml version="1.0"?>
22
<codingstandards>
33
<!--GENERATED: DO NOT MODIFY. Changes should be made to coding-standards.yml instead.-->
44
<deviations>
5-
<deviations-entry/>
5+
<deviations-entry />
66
<deviations-entry>
77
<rule-id>bad rule id</rule-id>
88
</deviations-entry>
@@ -22,7 +22,7 @@
2222
<deviations-entry>
2323
<rule-id>A0-1-1</rule-id>
2424
<query-id>cpp/autosar/useless-assignment</query-id>
25-
<raised-by/>
25+
<raised-by />
2626
</deviations-entry>
2727
<deviations-entry>
2828
<rule-id>A0-1-1</rule-id>
@@ -46,7 +46,7 @@
4646
<name>foo3</name>
4747
<date>1970-01-01Z</date>
4848
</raised-by>
49-
<approved-by/>
49+
<approved-by />
5050
</deviations-entry>
5151
<deviations-entry>
5252
<rule-id>A0-1-1</rule-id>
@@ -82,6 +82,10 @@
8282
<deviations-entry>
8383
<permit-id>DP2</permit-id>
8484
</deviations-entry>
85+
<deviations-entry>
86+
<rule-id>RULE-13-6</rule-id>
87+
<query-id>c/misra/sizeof-operand-with-side-effect</query-id>
88+
</deviations-entry>
8589
</deviations>
8690
<deviation-permits>
8791
<deviation-permits-entry>
@@ -102,4 +106,4 @@
102106
<invalid-property>invalid-property</invalid-property>
103107
</deviation-permits-entry>
104108
</deviation-permits>
105-
</codingstandards>
109+
</codingstandards>

cpp/common/test/deviations/invalid_deviations/coding-standards.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ deviations:
4444
permit-id: non-existing-permit
4545
- permit-id: DP1
4646
- permit-id: DP2
47+
- rule-id: RULE-13-6
48+
query-id: c/misra/sizeof-operand-with-side-effect
4749
deviation-permits:
4850
- permit-id: DP1
4951
justification: foo bar baz

0 commit comments

Comments
 (0)