Skip to content

Commit f5394d0

Browse files
committed
Check called functions with noexcept(unknown)
1 parent 6a0da2b commit f5394d0

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
- `A15-4-4` - `MissingNoExcept.ql`:
2-
- Reduce false positives by not reporting on functions that have a noexcept specification with a complex expression.
2+
- Reduce false positives by not reporting on functions that have a noexcept specification with a complex expression or call other such functions.

cpp/autosar/src/rules/A15-4-4/MissingNoExcept.ql

+33
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,36 @@ import codingstandards.cpp.autosar
1919
import codingstandards.cpp.exceptions.ExceptionSpecifications
2020
import codingstandards.cpp.exceptions.ExceptionFlow
2121

22+
// These functions have a noexcept specification that could not be resolved
23+
// to noexcept(true). So either, they are noexcept(false) functions which
24+
// means, they can throw an exception OR they have an expression which
25+
// could not be resolved to "true" or "false". Even in this case, lets
26+
// be more conservative and assume they may thrown an exception.
27+
class FunctionWithUnknownNoExcept extends Function {
28+
FunctionWithUnknownNoExcept() {
29+
// Exists a noexcept specification but not noexcept(true)
30+
exists(this.getADeclarationEntry().getNoExceptExpr()) and
31+
not isNoExceptTrue(this)
32+
}
33+
}
34+
35+
// This predicate checks if a function can call to other functions
36+
// that may have a noexcept specification which cannot be resolved to
37+
// noexcept(true).
38+
predicate mayCallThrowingFunctions(Function f) {
39+
// Exists a call in this function
40+
exists(Call fc |
41+
fc.getEnclosingFunction() = f and
42+
(
43+
// Either this call is to a function with an unknown noexcept OR
44+
fc.getTarget() instanceof FunctionWithUnknownNoExcept
45+
or
46+
// That function can further have calls to unknown noexcept functions.
47+
mayCallThrowingFunctions(fc.getTarget())
48+
)
49+
)
50+
}
51+
2252
from Function f
2353
where
2454
not isExcluded(f, Exceptions1Package::missingNoExceptQuery()) and
@@ -31,6 +61,9 @@ where
3161
// Not having a noexcept specification that
3262
// could not be computed as true or false above.
3363
not exists(f.getADeclarationEntry().getNoExceptExpr()) and
64+
// Not calling function(s) which have a noexcept specification that
65+
// could not be computed as true.
66+
not mayCallThrowingFunctions(f) and
3467
// Not compiler generated
3568
not f.isCompilerGenerated() and
3669
// The function is defined in this database

0 commit comments

Comments
 (0)