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+