Skip to content

Commit 51d0269

Browse files
committed
fixes
1 parent a3f17fd commit 51d0269

File tree

2 files changed

+17
-26
lines changed

2 files changed

+17
-26
lines changed

c/cert/src/rules/CON40-C/AtomicVariableTwiceInExpression.ql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import cpp
1616
import codingstandards.c.cert
17+
import codingstandards.cpp.Concurrency
1718

1819
from MacroInvocation mi, Variable v, Locatable whereFound
1920
where
@@ -22,13 +23,13 @@ where
2223
// There isn't a way to safely use this construct in a way that is also
2324
// possible the reliably detect so advise against using it.
2425
(
25-
mi.getMacroName() = ["atomic_store", "atomic_store_explicit"]
26+
mi instanceof AtomicStore
2627
or
2728
// This construct is generally safe, but must be used in a loop. To lower
2829
// the false positive rate we don't look at the conditions of the loop and
2930
// instead assume if it is found in a looping construct that it is likely
3031
// related to the safety property.
31-
mi.getMacroName() = ["atomic_compare_exchange_weak", "atomic_compare_exchange_weak_explicit"] and
32+
mi instanceof AtomicCompareExchange and
3233
not exists(Loop l | mi.getAGeneratedElement().(Expr).getParent*() = l)
3334
) and
3435
whereFound = mi

c/cert/src/rules/CON41-C/WrapFunctionsThatCanFailSpuriouslyInLoop.ql

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,18 @@
1212
* external/cert/obligation/rule
1313
*/
1414

15-
import cpp
16-
import codingstandards.c.cert
15+
import cpp
16+
import codingstandards.c.cert
17+
import codingstandards.cpp.Concurrency
18+
1719

18-
/**
19-
* Models calls to routines in the `stdatomic` library. Note that these
20-
* are typically implemented as macros within Clang and GCC's standard
21-
* libraries.
22-
*/
23-
class SpuriouslyFailingFunctionCallType extends MacroInvocation {
24-
SpuriouslyFailingFunctionCallType() {
25-
getMacroName() = ["atomic_compare_exchange_weak", "atomic_compare_exchange_weak_explicit"]
26-
}
27-
}
28-
29-
from SpuriouslyFailingFunctionCallType fc
30-
where
31-
not isExcluded(fc, Concurrency3Package::wrapFunctionsThatCanFailSpuriouslyInLoopQuery()) and
32-
(
33-
exists(StmtParent sp | sp = fc.getStmt() and not sp.(Stmt).getParentStmt*() instanceof Loop)
34-
or
35-
exists(StmtParent sp |
36-
sp = fc.getExpr() and not sp.(Expr).getEnclosingStmt().getParentStmt*() instanceof Loop
37-
)
38-
)
39-
select fc, "Function that can spuriously fail not wrapped in a loop."
20+
from AtomicCompareExchange ace
21+
where
22+
not isExcluded(ace, Concurrency3Package::wrapFunctionsThatCanFailSpuriouslyInLoopQuery()) and
23+
(
24+
forex(StmtParent sp | sp = ace.getStmt() | not sp.(Stmt).getParentStmt*() instanceof Loop) or
25+
forex(Expr e | e = ace.getExpr() | not e.getEnclosingStmt().getParentStmt*()
26+
instanceof Loop)
27+
)
28+
select ace, "Function that can spuriously fail not wrapped in a loop."
29+

0 commit comments

Comments
 (0)