Skip to content

Commit

Permalink
Merge pull request #608 from github/lcartey/a7-1-2
Browse files Browse the repository at this point in the history
A7-1-2: Exclude generated variables and variables in uninstantiated templates
  • Loading branch information
knewbury01 authored Jun 6, 2024
2 parents 7644032 + d8986c9 commit 7c7d0ac
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 26 deletions.
2 changes: 2 additions & 0 deletions change_notes/2024-06-03-constexpr-variable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- `A7-1-2` - `VariableMissingConstexpr.ql`:
- Fixes #607. Remove false positives for compiler generated variables and in uninstantiated templates
8 changes: 6 additions & 2 deletions cpp/autosar/src/rules/A7-1-2/VariableMissingConstexpr.ql
Original file line number Diff line number Diff line change
Expand Up @@ -62,5 +62,9 @@ where
// Not assigned by a user in a constructor
not exists(ConstructorFieldInit cfi | cfi.getTarget() = v and not cfi.isCompilerGenerated()) and
// Ignore union members
not v.getDeclaringType() instanceof Union
select v, "Variable " + v.getName() + " could be marked 'constexpr'."
not v.getDeclaringType() instanceof Union and
// Exclude variables in uninstantiated templates, as they may be incomplete
not v.isFromUninstantiatedTemplate(_) and
// Exclude compiler generated variables, which are not user controllable
not v.isCompilerGenerated()
select v, "Variable '" + v.getName() + "' could be marked 'constexpr'."
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@
| test.cpp:162:3:162:26 | VariantMemberInitialized | VariantMemberInitialized function could be marked as 'constexpr'. |
| test.cpp:163:3:163:26 | VariantMemberInitialized | VariantMemberInitialized function could be marked as 'constexpr'. |
| test.cpp:190:3:190:22 | VariantMemberNotInit | VariantMemberNotInit function could be marked as 'constexpr'. |
| test.cpp:269:26:269:26 | init | init function could be marked as 'constexpr'. |
| test.cpp:269:26:269:29 | init | init function could be marked as 'constexpr'. |
| test.cpp:271:26:271:26 | init | init function could be marked as 'constexpr'. |
| test.cpp:277:6:277:32 | test_template_instantiation | test_template_instantiation function could be marked as 'constexpr'. |
46 changes: 23 additions & 23 deletions cpp/autosar/test/rules/A7-1-2/VariableMissingConstexpr.expected
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
| test.cpp:4:5:4:6 | g1 | Variable g1 could be marked 'constexpr'. |
| test.cpp:6:5:6:6 | g2 | Variable g2 could be marked 'constexpr'. |
| test.cpp:13:14:13:15 | lc | Variable lc could be marked 'constexpr'. |
| test.cpp:15:14:15:16 | lca | Variable lca could be marked 'constexpr'. |
| test.cpp:23:15:23:17 | lc2 | Variable lc2 could be marked 'constexpr'. |
| test.cpp:25:15:25:18 | lc2a | Variable lc2a could be marked 'constexpr'. |
| test.cpp:41:14:41:15 | l2 | Variable l2 could be marked 'constexpr'. |
| test.cpp:44:16:44:17 | lc | Variable lc could be marked 'constexpr'. |
| test.cpp:45:17:45:19 | lc2 | Variable lc2 could be marked 'constexpr'. |
| test.cpp:55:7:55:8 | m2 | Variable m2 could be marked 'constexpr'. |
| test.cpp:130:7:130:8 | m1 | Variable m1 could be marked 'constexpr'. |
| test.cpp:141:7:141:8 | m1 | Variable m1 could be marked 'constexpr'. |
| test.cpp:221:7:221:8 | l1 | Variable l1 could be marked 'constexpr'. |
| test.cpp:235:7:235:8 | l6 | Variable l6 could be marked 'constexpr'. |
| test.cpp:237:7:237:8 | l8 | Variable l8 could be marked 'constexpr'. |
| test.cpp:240:7:240:9 | l10 | Variable l10 could be marked 'constexpr'. |
| test.cpp:243:7:243:9 | l12 | Variable l12 could be marked 'constexpr'. |
| test.cpp:248:7:248:9 | l15 | Variable l15 could be marked 'constexpr'. |
| test.cpp:250:7:250:9 | l16 | Variable l16 could be marked 'constexpr'. |
| test.cpp:251:7:251:9 | l17 | Variable l17 could be marked 'constexpr'. |
| test.cpp:257:7:257:9 | l21 | Variable l21 could be marked 'constexpr'. |
| test.cpp:262:7:262:9 | l24 | Variable l24 could be marked 'constexpr'. |
| test.cpp:263:7:263:9 | l25 | Variable l25 could be marked 'constexpr'. |
| test.cpp:4:5:4:6 | g1 | Variable 'g1' could be marked 'constexpr'. |
| test.cpp:6:5:6:6 | g2 | Variable 'g2' could be marked 'constexpr'. |
| test.cpp:13:14:13:15 | lc | Variable 'lc' could be marked 'constexpr'. |
| test.cpp:15:14:15:16 | lca | Variable 'lca' could be marked 'constexpr'. |
| test.cpp:23:15:23:17 | lc2 | Variable 'lc2' could be marked 'constexpr'. |
| test.cpp:25:15:25:18 | lc2a | Variable 'lc2a' could be marked 'constexpr'. |
| test.cpp:41:14:41:15 | l2 | Variable 'l2' could be marked 'constexpr'. |
| test.cpp:44:16:44:17 | lc | Variable 'lc' could be marked 'constexpr'. |
| test.cpp:45:17:45:19 | lc2 | Variable 'lc2' could be marked 'constexpr'. |
| test.cpp:55:7:55:8 | m2 | Variable 'm2' could be marked 'constexpr'. |
| test.cpp:130:7:130:8 | m1 | Variable 'm1' could be marked 'constexpr'. |
| test.cpp:141:7:141:8 | m1 | Variable 'm1' could be marked 'constexpr'. |
| test.cpp:221:7:221:8 | l1 | Variable 'l1' could be marked 'constexpr'. |
| test.cpp:235:7:235:8 | l6 | Variable 'l6' could be marked 'constexpr'. |
| test.cpp:237:7:237:8 | l8 | Variable 'l8' could be marked 'constexpr'. |
| test.cpp:240:7:240:9 | l10 | Variable 'l10' could be marked 'constexpr'. |
| test.cpp:243:7:243:9 | l12 | Variable 'l12' could be marked 'constexpr'. |
| test.cpp:248:7:248:9 | l15 | Variable 'l15' could be marked 'constexpr'. |
| test.cpp:250:7:250:9 | l16 | Variable 'l16' could be marked 'constexpr'. |
| test.cpp:251:7:251:9 | l17 | Variable 'l17' could be marked 'constexpr'. |
| test.cpp:257:7:257:9 | l21 | Variable 'l21' could be marked 'constexpr'. |
| test.cpp:262:7:262:9 | l24 | Variable 'l24' could be marked 'constexpr'. |
| test.cpp:263:7:263:9 | l25 | Variable 'l25' could be marked 'constexpr'. |
12 changes: 11 additions & 1 deletion cpp/autosar/test/rules/A7-1-2/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,14 @@ constexpr void fp_reported_in_466(int p) {
// compile time constant
int l26 =
add4(1, l3); // COMPLIANT - l3 is not compile time constant on all paths
}
}

template <typename T> T *init(T **t) {}

template <typename T> T *init() {
T *t = nullptr; // COMPLIANT - initialized below
init(&t); // Init is ignored in uninitialized template
return t;
}

void test_template_instantiation() { int *t = init<int>(); }

0 comments on commit 7c7d0ac

Please sign in to comment.