Skip to content

Commit ce5b364

Browse files
authored
Merge pull request #825 from rak3-sh/rp/fix-824
#824 [Partial Fix] : A15-4-4 - Dont report on functions having a noexcept specification with a complex expression
2 parents db71d1b + f5394d0 commit ce5b364

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- `A15-4-4` - `MissingNoExcept.ql`:
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

+36
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
@@ -28,6 +58,12 @@ where
2858
not isNoExceptTrue(f) and
2959
// Not explicitly marked noexcept(false)
3060
not isNoExceptExplicitlyFalse(f) and
61+
// Not having a noexcept specification that
62+
// could not be computed as true or false above.
63+
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
3167
// Not compiler generated
3268
not f.isCompilerGenerated() and
3369
// The function is defined in this database

0 commit comments

Comments
 (0)