Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d9da42b

Browse filesBrowse files
authored
Merge branch 'main' into knewbury01/Declarations3
2 parents 68304ab + f793d14 commit d9da42b
Copy full SHA for d9da42b

13 files changed

+93
-18
lines changed
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- `M0-1-9` - `DeadCode.ql`:
2+
- More compiler generated statements are now excluded from being reported as dead code, including compiler generated statements for `static_assert` calls.
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- `A2-10-5` - `IdentifierNameOfANonMemberObjectWithExternalOrInternalLinkageIsReused.ql`
2+
- Reduce false positives by excluding variable template instantiations.
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- `M3-2-1` - `DeclarationsOfAnObjectShallHaveCompatibleTypes.ql`
2+
- Reduced false positives by excluding non-object variables (for example, member variables).
3+
- Reduced false positives by excluding variable templates and template instantiations.
4+
- Improved the reported error message by including the conflicting type names.

‎cpp/autosar/src/rules/A2-10-5/IdentifierNameOfANonMemberObjectWithExternalOrInternalLinkageIsReused.ql

Copy file name to clipboardExpand all lines: cpp/autosar/src/rules/A2-10-5/IdentifierNameOfANonMemberObjectWithExternalOrInternalLinkageIsReused.ql
+5-1Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ where
3232
not isExcluded(o2,
3333
NamingPackage::identifierNameOfANonMemberObjectWithExternalOrInternalLinkageIsReusedQuery()) and
3434
not o1 = o2 and
35-
o1.getName() = o2.getName()
35+
o1.getName() = o2.getName() and
36+
// Only consider variables from uninstantiated templates, to avoid false positives where o1 and
37+
// o2 are the same object across different template instantiations
38+
not o1.isFromTemplateInstantiation(_) and
39+
not o2.isFromTemplateInstantiation(_)
3640
select o2,
3741
"Identifier name of non-member object $@ reuses the identifier name of non-member object $@.", o2,
3842
o2.getName(), o1, o1.getName()

‎cpp/autosar/src/rules/M0-1-9/DeadCode.ql

Copy file name to clipboardExpand all lines: cpp/autosar/src/rules/M0-1-9/DeadCode.ql
+6-2Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ predicate isDeadStmt(Stmt s) {
5151
// - The initializers for each of the variables are pure
5252
exists(DeclStmt ds |
5353
ds = s and
54-
forall(Declaration d | d = ds.getADeclaration() |
54+
// Use forex so that we don't flag "fake" generated `DeclStmt`s (e.g. those generated by the
55+
// extractor for static_asserts) with no actual declarations
56+
forex(Declaration d | d = ds.getADeclaration() |
5557
exists(LocalScopeVariable v |
5658
d = v and
5759
v.getInitializer().getExpr().isPure() and
@@ -123,5 +125,7 @@ where
123125
// output". We therefore exclude unreachable statements as they are, by definition, not executed.
124126
not s.getBasicBlock() = any(UnreachableBasicBlock ubb).getABasicBlock() and
125127
// Exclude code generated by macros, because the code may be "live" in other instantiations
126-
not s.isAffectedByMacro()
128+
not s.isAffectedByMacro() and
129+
// Exclude compiler generated statements
130+
not s.isCompilerGenerated()
127131
select s, "This statement is dead code."

‎cpp/autosar/src/rules/M3-2-1/DeclarationsOfAnObjectShallHaveCompatibleTypes.ql

Copy file name to clipboardExpand all lines: cpp/autosar/src/rules/M3-2-1/DeclarationsOfAnObjectShallHaveCompatibleTypes.ql
+13-3Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,23 @@ import cpp
2020
import codingstandards.cpp.autosar
2121
import codingstandards.cpp.Typehelpers
2222

23+
predicate isNonTemplateObjectVariable(GlobalOrNamespaceVariable gv) {
24+
not gv.isFromTemplateInstantiation(_) and
25+
not gv.isFromUninstantiatedTemplate(_)
26+
}
27+
2328
from VariableDeclarationEntry decl1, VariableDeclarationEntry decl2
2429
where
2530
not isExcluded(decl1, DeclarationsPackage::declarationsOfAnObjectShallHaveCompatibleTypesQuery()) and
2631
not isExcluded(decl2, DeclarationsPackage::declarationsOfAnObjectShallHaveCompatibleTypesQuery()) and
2732
not areCompatible(decl1.getType(), decl2.getType()) and
2833
// Note that normally `VariableDeclarationEntry` includes parameters, which are not covered
2934
// by this query. We implicitly exclude them with the `getQualifiedName()` predicate.
30-
decl1.getVariable().getQualifiedName() = decl2.getVariable().getQualifiedName()
31-
select decl1, "The object $@ is not compatible with re-declaration $@", decl1, decl1.getName(),
32-
decl2, decl2.getName()
35+
decl1.getVariable().getQualifiedName() = decl2.getVariable().getQualifiedName() and
36+
// Only consider global/namespace variables which aren't templated
37+
isNonTemplateObjectVariable(decl1.getVariable()) and
38+
isNonTemplateObjectVariable(decl2.getVariable())
39+
select decl1,
40+
"The object $@ of type " + decl1.getType().toString() +
41+
" is not compatible with re-declaration $@ of type " + decl2.getType().toString(), decl1,
42+
decl1.getName(), decl2, decl2.getName()
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
| test1a.cpp:6:12:6:13 | g3 | Identifier name of non-member object $@ reuses the identifier name of non-member object $@. | test1a.cpp:6:12:6:13 | g3 | g3 | test1b.cpp:7:12:7:13 | g3 | g3 |
2+
| test1a.cpp:17:43:17:43 | number_two | Identifier name of non-member object $@ reuses the identifier name of non-member object $@. | test1a.cpp:17:43:17:43 | number_two | number_two | test1b.cpp:12:43:12:43 | number_two | number_two |
23
| test1b.cpp:7:12:7:13 | g3 | Identifier name of non-member object $@ reuses the identifier name of non-member object $@. | test1b.cpp:7:12:7:13 | g3 | g3 | test1a.cpp:6:12:6:13 | g3 | g3 |
4+
| test1b.cpp:12:43:12:43 | number_two | Identifier name of non-member object $@ reuses the identifier name of non-member object $@. | test1b.cpp:12:43:12:43 | number_two | number_two | test1a.cpp:17:43:17:43 | number_two | number_two |

‎cpp/autosar/test/rules/A2-10-5/test1a.cpp

Copy file name to clipboardExpand all lines: cpp/autosar/test/rules/A2-10-5/test1a.cpp
+14Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,17 @@ static int g1 = 0;
55
static int g2; // COMPLIANT
66
static int g3 = 1; // NON_COMPLIANT
77
static void f1(){}; // NON_COMPLIANT
8+
9+
// Variable template has multiple declarations: one for the uninstantiated
10+
// template and one for each instantiation
11+
template <class T> constexpr T number_one = T(1); // COMPLIANT
12+
13+
int test() { return number_one<int>; }
14+
15+
long test2() { return number_one<long>; }
16+
17+
template <class T> constexpr T number_two = T(1); // NON_COMPLIANT
18+
19+
int test3() { return number_two<int>; }
20+
21+
long test4() { return number_two<long>; }

‎cpp/autosar/test/rules/A2-10-5/test1b.cpp

Copy file name to clipboardExpand all lines: cpp/autosar/test/rules/A2-10-5/test1b.cpp
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,9 @@ static int g3 = 0; // NON_COMPLIANT
88
}
99

1010
static void f1() {} // NON_COMPLIANT
11+
12+
template <class T> constexpr T number_two = T(1); // NON_COMPLIANT
13+
14+
int test3() { return number_two<int>; }
15+
16+
long test4() { return number_two<long>; }

‎cpp/autosar/test/rules/M0-1-9/test.cpp

Copy file name to clipboardExpand all lines: cpp/autosar/test/rules/M0-1-9/test.cpp
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,7 @@ int test_dead_code(int x) {
7676
} catch (...) { // NON_COMPLIANT
7777
}
7878

79+
static_assert(1); // COMPLIANT
80+
7981
return live5 + live6; // COMPLIANT
8082
}
+12-12Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | a4 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | a4 |
2-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | a5 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | a5 |
3-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | a6 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | a6 |
4-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | a7 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | a7 |
5-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | a2 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | a2 |
6-
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | a11 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | a11 |
7-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | a4 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | a4 |
8-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | a5 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | a5 |
9-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | a6 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | a6 |
10-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | a7 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | a7 |
11-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | a2 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | a2 |
12-
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | The object $@ is not compatible with re-declaration $@ | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | a11 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | a11 |
1+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | The object $@ of type long is not compatible with re-declaration $@ of type int | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | a4 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | a4 |
2+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | The object $@ of type int is not compatible with re-declaration $@ of type long | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | a5 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | a5 |
3+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | The object $@ of type long is not compatible with re-declaration $@ of type int | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | a6 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | a6 |
4+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | The object $@ of type int is not compatible with re-declaration $@ of type LL | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | a7 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | a7 |
5+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | The object $@ of type int is not compatible with re-declaration $@ of type long | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | a2 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | a2 |
6+
| test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | The object $@ of type int[100] is not compatible with re-declaration $@ of type int[101] | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | a11 | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | a11 |
7+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | The object $@ of type int is not compatible with re-declaration $@ of type long | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:11:12:11:13 | declaration of a4 | a4 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:4:6:4:7 | definition of a4 | a4 |
8+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | The object $@ of type long is not compatible with re-declaration $@ of type int | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:13:13:13:14 | declaration of a5 | a5 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:5:5:5:6 | definition of a5 | a5 |
9+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | The object $@ of type int is not compatible with re-declaration $@ of type long | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:17:1:17:3 | declaration of a6 | a6 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:6:6:6:7 | definition of a6 | a6 |
10+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | The object $@ of type LL is not compatible with re-declaration $@ of type int | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:19:11:19:12 | declaration of a7 | a7 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:7:5:7:6 | definition of a7 | a7 |
11+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | The object $@ of type long is not compatible with re-declaration $@ of type int | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:23:13:23:14 | declaration of a2 | a2 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:14:5:14:6 | definition of a2 | a2 |
12+
| test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | The object $@ of type int[101] is not compatible with re-declaration $@ of type int[100] | test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp:28:12:28:14 | declaration of a11 | a11 | test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp:19:5:19:7 | definition of a11 | a11 |

‎cpp/autosar/test/rules/M3-2-1/test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp

Copy file name to clipboardExpand all lines: cpp/autosar/test/rules/M3-2-1/test_declarations_of_an_object_shall_have_compatible_types_unit1.cpp
+16Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,19 @@ int a2; // NON_COMPLIANT
1717
int a9[100]; // COMPLIANT
1818
int a10[100]; // COMPLIANT
1919
int a11[100]; // NON_COMPLIANT - different sizes
20+
21+
// Variable templates can cause false positives
22+
template <class T> constexpr T number_one = T(1); // COMPLIANT
23+
24+
int test() { return number_one<int>; }
25+
26+
long test2() { return number_one<long>; }
27+
28+
template <class T> class ClassB {
29+
private:
30+
T mA; // Should be ignored, as not an object
31+
double mB; // Should be ignored, as not an object
32+
};
33+
34+
void test3() { ClassB<int> b; }
35+
void test4() { ClassB<long> b; }

‎cpp/autosar/test/rules/M3-2-1/test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp

Copy file name to clipboardExpand all lines: cpp/autosar/test/rules/M3-2-1/test_declarations_of_an_object_shall_have_compatible_types_unit2.cpp
+9Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,12 @@ extern long a2; // NON_COMPLIANT
2626
extern int a9[100]; // COMPLIANT
2727
LI a10[100]; // COMPLIANT
2828
extern int a11[101]; // NON_COMPLIANT - different sizes
29+
30+
template <class T> class ClassB {
31+
private:
32+
T mA; // Should be ignored, as not an object
33+
int mB; // Should be ignored, as not an object
34+
};
35+
36+
void testb_1() { ClassB<int> b; }
37+
void testb_2() { ClassB<long> b; }

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.