Skip to content

Commit f866dd5

Browse files
committed
Declarations5: add RULE-8-8
1 parent 0c2f3d5 commit f866dd5

16 files changed

+154
-3
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @id c/misra/missing-static-specifier-function-redeclaration-c
3+
* @name RULE-8-8: If a function has internal linkage then all re-declarations shall include the static storage class
4+
* @description If a function has internal linkage then all re-declarations shall include the static
5+
* storage class specifier to make the internal linkage explicit.
6+
* @kind problem
7+
* @precision very-high
8+
* @problem.severity warning
9+
* @tags external/misra/id/rule-8-8
10+
* readability
11+
* external/misra/obligation/required
12+
*/
13+
14+
import cpp
15+
import codingstandards.c.misra
16+
import codingstandards.cpp.rules.missingstaticspecifierfunctionredeclarationshared.MissingStaticSpecifierFunctionRedeclarationShared
17+
18+
class MissingStaticSpecifierFunctionRedeclarationCQuery extends MissingStaticSpecifierFunctionRedeclarationSharedSharedQuery {
19+
MissingStaticSpecifierFunctionRedeclarationCQuery() {
20+
this = Declarations5Package::missingStaticSpecifierFunctionRedeclarationCQuery()
21+
}
22+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @id c/misra/missing-static-specifier-object-redeclaration-c
3+
* @name RULE-8-8: If an object has internal linkage then all re-declarations shall include the static storage class
4+
* @description If an object has internal linkage then all re-declarations shall include the static
5+
* storage class specifier to make the internal linkage explicit.
6+
* @kind problem
7+
* @precision very-high
8+
* @problem.severity warning
9+
* @tags external/misra/id/rule-8-8
10+
* readability
11+
* external/misra/obligation/required
12+
*/
13+
14+
import cpp
15+
import codingstandards.c.misra
16+
17+
from VariableDeclarationEntry redeclaration, VariableDeclarationEntry de
18+
where
19+
not isExcluded(redeclaration,
20+
Declarations5Package::missingStaticSpecifierObjectRedeclarationCQuery()) and
21+
de.hasSpecifier("static") and
22+
de.getDeclaration().isTopLevel() and
23+
redeclaration.getDeclaration() = de.getDeclaration() and
24+
not redeclaration.hasSpecifier("static") and
25+
de != redeclaration
26+
select redeclaration, "The redeclaration of $@ with internal linkage misses the static specifier.",
27+
de, de.getName()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/missingstaticspecifierfunctionredeclarationshared/MissingStaticSpecifierFunctionRedeclarationShared.ql
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| test.c:2:12:2:12 | declaration of g | The redeclaration of $@ with internal linkage misses the static specifier. | test.c:1:12:1:12 | definition of g | g |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rules/RULE-8-8/MissingStaticSpecifierObjectRedeclarationC.ql

c/misra/test/rules/RULE-8-8/test.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
static int g = 0;
2+
extern int g; // NON_COMPLIANT
3+
4+
static int g1;
5+
static int g1 = 0; // COMPLIANT
6+
7+
int g2;
8+
int g2 = 0; // COMPLIANT

cpp/autosar/test/rules/M3-3-2/MissingStaticSpecifierOnFunctionRedeclaration.qlref

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/missingstaticspecifierfunctionredeclarationshared/MissingStaticSpecifierFunctionRedeclarationShared.ql

cpp/common/src/codingstandards/cpp/exclusions/c/Declarations5.qll

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import codingstandards.cpp.exclusions.RuleMetadata
55

66
newtype Declarations5Query =
77
TIdentifiersDeclaredInTheSameScopeNotDistinctQuery() or
8-
TExternalObjectOrFunctionNotDeclaredInOneFileQuery()
8+
TExternalObjectOrFunctionNotDeclaredInOneFileQuery() or
9+
TMissingStaticSpecifierFunctionRedeclarationCQuery() or
10+
TMissingStaticSpecifierObjectRedeclarationCQuery()
911

1012
predicate isDeclarations5QueryMetadata(Query query, string queryId, string ruleId) {
1113
query =
@@ -23,6 +25,22 @@ predicate isDeclarations5QueryMetadata(Query query, string queryId, string ruleI
2325
// `@id` for the `externalObjectOrFunctionNotDeclaredInOneFile` query
2426
"c/misra/external-object-or-function-not-declared-in-one-file" and
2527
ruleId = "RULE-8-5"
28+
or
29+
query =
30+
// `Query` instance for the `missingStaticSpecifierFunctionRedeclarationC` query
31+
Declarations5Package::missingStaticSpecifierFunctionRedeclarationCQuery() and
32+
queryId =
33+
// `@id` for the `missingStaticSpecifierFunctionRedeclarationC` query
34+
"c/misra/missing-static-specifier-function-redeclaration-c" and
35+
ruleId = "RULE-8-8"
36+
or
37+
query =
38+
// `Query` instance for the `missingStaticSpecifierObjectRedeclarationC` query
39+
Declarations5Package::missingStaticSpecifierObjectRedeclarationCQuery() and
40+
queryId =
41+
// `@id` for the `missingStaticSpecifierObjectRedeclarationC` query
42+
"c/misra/missing-static-specifier-object-redeclaration-c" and
43+
ruleId = "RULE-8-8"
2644
}
2745

2846
module Declarations5Package {
@@ -39,4 +57,18 @@ module Declarations5Package {
3957
// `Query` type for `externalObjectOrFunctionNotDeclaredInOneFile` query
4058
TQueryC(TDeclarations5PackageQuery(TExternalObjectOrFunctionNotDeclaredInOneFileQuery()))
4159
}
60+
61+
Query missingStaticSpecifierFunctionRedeclarationCQuery() {
62+
//autogenerate `Query` type
63+
result =
64+
// `Query` type for `missingStaticSpecifierFunctionRedeclarationC` query
65+
TQueryC(TDeclarations5PackageQuery(TMissingStaticSpecifierFunctionRedeclarationCQuery()))
66+
}
67+
68+
Query missingStaticSpecifierObjectRedeclarationCQuery() {
69+
//autogenerate `Query` type
70+
result =
71+
// `Query` type for `missingStaticSpecifierObjectRedeclarationC` query
72+
TQueryC(TDeclarations5PackageQuery(TMissingStaticSpecifierObjectRedeclarationCQuery()))
73+
}
4274
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Provides a library which includes a `problems` predicate for reporting....
3+
*/
4+
5+
import cpp
6+
import codingstandards.cpp.Customizations
7+
import codingstandards.cpp.Exclusions
8+
9+
abstract class MissingStaticSpecifierFunctionRedeclarationSharedSharedQuery extends Query { }
10+
11+
Query getQuery() { result instanceof MissingStaticSpecifierFunctionRedeclarationSharedSharedQuery }
12+
13+
query predicate problems(
14+
FunctionDeclarationEntry redeclaration, string message, FunctionDeclarationEntry fde,
15+
string msgpiece
16+
) {
17+
not isExcluded(redeclaration, getQuery()) and
18+
fde.hasSpecifier("static") and
19+
fde.getDeclaration().isTopLevel() and
20+
redeclaration.getDeclaration() = fde.getDeclaration() and
21+
not redeclaration.hasSpecifier("static") and
22+
fde != redeclaration and
23+
message = "The redeclaration of $@ with internal linkage misses the static specifier." and
24+
msgpiece = "function"
25+
}

0 commit comments

Comments
 (0)