@@ -57,8 +57,8 @@ predicate isSignal(FunctionCall signalCall, Function signalHandler) {
5757 * struct sigaction sigactVar = ...
5858 * sigaction(SIGX, &sigactVar, ...)
5959 */
60- predicate isSigaction ( FunctionCall sigactionCall , Function signalHandler , boolean isReentrancyBlocked ) {
61- exists ( Variable sigactVar , Struct sigactStruct , Field handlerField |
60+ predicate isSigaction ( FunctionCall sigactionCall , Function signalHandler , Variable sigactVar ) {
61+ exists ( Struct sigactStruct , Field handlerField |
6262 sigactionCall .getTarget ( ) .getName ( ) = "sigaction"
6363 and sigactionCall .getArgument ( 1 ) .getAChild * ( ) = sigactVar .getAnAccess ( )
6464
@@ -79,45 +79,46 @@ predicate isSigaction(FunctionCall sigactionCall, Function signalHandler, boolea
7979 and dfa .getQualifier + ( ) = sigactVar .getAnAccess ( )
8080 )
8181 or
82- exists ( VariableDeclarationEntry varDec , ClassAggregateLiteral init |
82+ exists ( ClassAggregateLiteral initLit |
8383 // struct sigaction sigactVar = {.sa_sigaction = signalHandler};
84- varDec .getVariable ( ) = sigactVar
85- and sigactVar .getInitializer ( ) .getExpr ( ) = init
86- and signalHandler .getAnAccess ( ) = init .getAFieldExpr ( handlerField ) .getAChild * ( )
87-
88- // new signals are blocked via sa_mask
89- and if exists ( Field mask | mask .getName ( ) = "sa_mask" and exists ( init .getAFieldExpr ( mask ) ) ) then
90- isReentrancyBlocked = true
91- else
92- isReentrancyBlocked = false
84+ // varDec.getVariable() = sigactVar
85+ sigactVar .getInitializer ( ) .getExpr ( ) = initLit
86+ and signalHandler .getAnAccess ( ) = initLit .getAFieldExpr ( handlerField ) .getAChild * ( )
9387 )
9488 )
95-
96- // new signals are blocked via sa_mask
97- and if ( isReentrancyBlocked = true or exists ( ValueFieldAccess dfa |
98- dfa .getQualifier + ( ) = sigactVar .getAnAccess ( )
99- and dfa .getTarget ( ) .getName ( ) = "sa_mask"
100- ) ) then
101- isReentrancyBlocked = true
102- else
103- isReentrancyBlocked = false
10489 )
10590}
10691
107- string fmtMsg ( boolean isReentrancyBlocked ) {
108- ( isReentrancyBlocked = true and result = "" )
92+ predicate isSignalDeliveryBlocked ( Variable sigactVar ) {
93+ // TODO: should only find writes and for specific signals
94+ exists ( ValueFieldAccess dfa |
95+ dfa .getQualifier + ( ) = sigactVar .getAnAccess ( ) and dfa .getTarget ( ) .getName ( ) = "sa_mask"
96+ )
10997 or
110- ( isReentrancyBlocked = false and result = "Delivery of new signals may be not blocked when the handler executes. " )
98+ exists ( Field mask |
99+ mask .getName ( ) = "sa_mask"
100+ and exists ( sigactVar .getInitializer ( ) .getExpr ( ) .( ClassAggregateLiteral ) .getAFieldExpr ( mask ) )
101+ )
102+ }
103+
104+ string deliveryNotBlockedMsg ( ) {
105+ result = "Delivery of new signals may be not blocked when the handler executes. "
111106}
112107
113- from FunctionCall fc , Function signalHandler , boolean isReentrancyBlocked
108+ from FunctionCall fc , Function signalHandler , string msg
114109where
115110 isAsyncUnsafe ( signalHandler )
116111 and (
117- ( isSignal ( fc , signalHandler ) and isReentrancyBlocked = false )
112+ ( isSignal ( fc , signalHandler ) and msg = deliveryNotBlockedMsg ( ) )
118113 or
119- isSigaction ( fc , signalHandler , isReentrancyBlocked )
114+ exists ( Variable sigactVar |
115+ isSigaction ( fc , signalHandler , sigactVar )
116+ and if isSignalDeliveryBlocked ( sigactVar ) then
117+ msg = ""
118+ else
119+ msg = deliveryNotBlockedMsg ( )
120+ )
120121 )
121- select signalHandler , "is a non-trivial signal handler that uses not async-safe functions. " + fmtMsg ( isReentrancyBlocked ) +
122+ select signalHandler , "is a non-trivial signal handler that uses not async-safe functions. " + msg +
122123 "Handler is registered by $@" , fc , fc .toString ( )
123124
0 commit comments