From ad7dfa258cf8e37ebec7cdb46ec37d96de596e44 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 7 Feb 2020 16:22:50 +0000 Subject: [PATCH 1/7] Rename `ParenExpr.getExpression()` to `getExpr()` for consistency with similar predicates in other classes. --- ql/src/semmle/go/Expr.qll | 18 +++++++++--------- .../semmle/go/controlflow/ControlFlowGraph.qll | 2 +- .../go/controlflow/ControlFlowGraphImpl.qll | 6 +++--- ql/src/semmle/go/controlflow/IR.qll | 2 +- .../go/dataflow/internal/DataFlowUtil.qll | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ql/src/semmle/go/Expr.qll b/ql/src/semmle/go/Expr.qll index 2fa9559809c..18a53eca034 100644 --- a/ql/src/semmle/go/Expr.qll +++ b/ql/src/semmle/go/Expr.qll @@ -314,12 +314,12 @@ class StructLit extends CompositeLit { */ class ParenExpr extends @parenexpr, Expr { /** Gets the expression between parentheses. */ - Expr getExpression() { result = getChildExpr(0) } + Expr getExpr() { result = getChildExpr(0) } - override Expr stripParens() { result = getExpression().stripParens() } + override Expr stripParens() { result = getExpr().stripParens() } override predicate isPlatformIndependentConstant() { - getExpression().isPlatformIndependentConstant() + getExpr().isPlatformIndependentConstant() } override string toString() { result = "(...)" } @@ -388,7 +388,7 @@ class SliceExpr extends @sliceexpr, Expr { */ class TypeAssertExpr extends @typeassertexpr, Expr { /** Gets the base expression whose type is being asserted. */ - Expr getExpression() { result = getChildExpr(0) } + Expr getExpr() { result = getChildExpr(0) } /** Gets the expression representing the asserted type. */ Expr getTypeExpr() { result = getChildExpr(1) } @@ -396,7 +396,7 @@ class TypeAssertExpr extends @typeassertexpr, Expr { override predicate mayHaveOwnSideEffects() { any() } override predicate isPlatformIndependentConstant() { - getExpression().isPlatformIndependentConstant() + getExpr().isPlatformIndependentConstant() } override string toString() { result = "type assertion" } @@ -1160,7 +1160,7 @@ private predicate isTypeExprBottomUp(Expr e) { e instanceof InterfaceTypeExpr or e instanceof MapTypeExpr or e instanceof ChanTypeExpr or - isTypeExprBottomUp(e.(ParenExpr).getExpression()) or + isTypeExprBottomUp(e.(ParenExpr).getExpr()) or isTypeExprBottomUp(e.(StarExpr).getBase()) or isTypeExprBottomUp(e.(Ellipsis).getOperand()) } @@ -1208,7 +1208,7 @@ private predicate isTypeExprTopDown(Expr e) { or e = any(SelectorExpr sel | isTypeExprTopDown(sel)).getBase() or - e = any(ParenExpr pe | isTypeExprTopDown(pe)).getExpression() + e = any(ParenExpr pe | isTypeExprTopDown(pe)).getExpr() or e = any(StarExpr se | isTypeExprTopDown(se)).getBase() or @@ -1240,7 +1240,7 @@ class ReferenceExpr extends Expr { not this = any(MethodSpec md).getNameExpr() and not this = any(StructLit sl).getKey(_) or - this.(ParenExpr).getExpression() instanceof ReferenceExpr + this.(ParenExpr).getExpr() instanceof ReferenceExpr or this.(StarExpr).getBase() instanceof ReferenceExpr or @@ -1282,7 +1282,7 @@ class ValueExpr extends Expr { this instanceof BasicLit or this instanceof FuncLit or this instanceof CompositeLit or - this.(ParenExpr).getExpression() instanceof ValueExpr or + this.(ParenExpr).getExpr() instanceof ValueExpr or this instanceof SliceExpr or this instanceof TypeAssertExpr or this instanceof CallOrConversionExpr or diff --git a/ql/src/semmle/go/controlflow/ControlFlowGraph.qll b/ql/src/semmle/go/controlflow/ControlFlowGraph.qll index 6d5a3f618ea..fd965d35151 100644 --- a/ql/src/semmle/go/controlflow/ControlFlowGraph.qll +++ b/ql/src/semmle/go/controlflow/ControlFlowGraph.qll @@ -155,7 +155,7 @@ module ControlFlow { private predicate ensuresAux(Expr expr, boolean b) { expr = cond and b = outcome or - expr = any(ParenExpr par | ensuresAux(par, b)).getExpression() + expr = any(ParenExpr par | ensuresAux(par, b)).getExpr() or expr = any(NotExpr ne | ensuresAux(ne, b.booleanNot())).getOperand() or diff --git a/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll b/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll index c8c17af2899..f02df29cc8a 100644 --- a/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -29,7 +29,7 @@ private predicate isCondRoot(Expr e) { private predicate isCond(Expr e) { isCondRoot(e) or e = any(LogicalBinaryExpr lbe | isCond(lbe)).getRightOperand() or - e = any(ParenExpr par | isCond(par)).getExpression() + e = any(ParenExpr par | isCond(par)).getExpr() } /** @@ -703,7 +703,7 @@ module CFG { or i = 0 and result = this.(LabeledStmt).getStmt() or - i = 0 and result = this.(ParenExpr).getExpression() + i = 0 and result = this.(ParenExpr).getExpr() or result = this.(PlainBlock).getStmt(i) } @@ -1851,7 +1851,7 @@ module CFG { result = Panic() } - override ControlFlowTree getChildTree(int i) { i = 0 and result = getExpression() } + override ControlFlowTree getChildTree(int i) { i = 0 and result = getExpr() } } private class UnaryExprTree extends ControlFlowTree, UnaryExpr { diff --git a/ql/src/semmle/go/controlflow/IR.qll b/ql/src/semmle/go/controlflow/IR.qll index c477913c62d..bca948f9f7d 100644 --- a/ql/src/semmle/go/controlflow/IR.qll +++ b/ql/src/semmle/go/controlflow/IR.qll @@ -1486,7 +1486,7 @@ module IR { */ Instruction evalExprInstruction(Expr e) { result = MkExprNode(e) or - result = evalExprInstruction(e.(ParenExpr).getExpression()) + result = evalExprInstruction(e.(ParenExpr).getExpr()) } /** diff --git a/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll b/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll index b51f85d440e..466a18d8b04 100644 --- a/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll +++ b/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -735,7 +735,7 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) { exists(Expr pred, Expr succ | succ.(LogicalBinaryExpr).getAnOperand() = pred or succ.(ConversionExpr).getOperand() = pred or - succ.(TypeAssertExpr).getExpression() = pred + succ.(TypeAssertExpr).getExpr() = pred | nodeFrom = exprNode(pred) and nodeTo = exprNode(succ) From 5571f1eac762fbf5fd9833b7d319db43ab64fcbc Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 7 Feb 2020 16:24:35 +0000 Subject: [PATCH 2/7] Rename `Comparison` to `ComparisonExpr`. --- ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql | 4 ++-- ql/src/RedundantCode/CompareIdenticalValues.ql | 2 +- ql/src/RedundantCode/NegativeLengthCheck.ql | 2 +- ql/src/semmle/go/Expr.qll | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql b/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql index c2d2f80a6b6..7dde89c445f 100644 --- a/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql +++ b/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql @@ -51,10 +51,10 @@ class AssocNestedExpr extends BinaryExpr { class HarmlessNestedExpr extends BinaryExpr { HarmlessNestedExpr() { exists(BinaryExpr parent | this = parent.getAChildExpr() | - parent instanceof Comparison and + parent instanceof ComparisonExpr and (this instanceof ArithmeticExpr or this instanceof ShiftExpr) or - parent instanceof LogicalExpr and this instanceof Comparison + parent instanceof LogicalExpr and this instanceof ComparisonExpr ) } } diff --git a/ql/src/RedundantCode/CompareIdenticalValues.ql b/ql/src/RedundantCode/CompareIdenticalValues.ql index 5ce12c4f395..4f63b222018 100644 --- a/ql/src/RedundantCode/CompareIdenticalValues.ql +++ b/ql/src/RedundantCode/CompareIdenticalValues.ql @@ -13,7 +13,7 @@ import go -from Comparison cmp, Expr l +from ComparisonExpr cmp, Expr l where l = cmp.getLeftOperand() and l.getGlobalValueNumber() = cmp.getRightOperand().getGlobalValueNumber() and diff --git a/ql/src/RedundantCode/NegativeLengthCheck.ql b/ql/src/RedundantCode/NegativeLengthCheck.ql index c199d09fbc8..90d4b96f495 100644 --- a/ql/src/RedundantCode/NegativeLengthCheck.ql +++ b/ql/src/RedundantCode/NegativeLengthCheck.ql @@ -11,7 +11,7 @@ import go -from Comparison cmp, BuiltinFunction len, int ub, string r +from ComparisonExpr cmp, BuiltinFunction len, int ub, string r where (len = Builtin::len() or len = Builtin::cap()) and ( diff --git a/ql/src/semmle/go/Expr.qll b/ql/src/semmle/go/Expr.qll index 18a53eca034..2ccd8f8f565 100644 --- a/ql/src/semmle/go/Expr.qll +++ b/ql/src/semmle/go/Expr.qll @@ -800,12 +800,12 @@ class ShiftExpr extends @shiftexpr, BitwiseBinaryExpr { } /** * A comparison expression, that is, `==`, `!=`, `<`, `<=`, `>=` or `>`. */ -class Comparison extends @comparison, BinaryExpr { } +class ComparisonExpr extends @comparison, BinaryExpr { } /** * An equality test, that is, `==` or `!=`. */ -class EqualityTestExpr extends @equalitytest, Comparison { +class EqualityTestExpr extends @equalitytest, ComparisonExpr { /** Gets the polarity of this equality test, that is, `true` for `==` and `false` for `!=`. */ boolean getPolarity() { none() } } @@ -813,7 +813,7 @@ class EqualityTestExpr extends @equalitytest, Comparison { /** * A relational comparison, that is, `<`, `<=`, `>=` or `>`. */ -class RelationalComparisonExpr extends @relationalcomparison, Comparison { +class RelationalComparisonExpr extends @relationalcomparison, ComparisonExpr { /** Holds if this comparison is strict, that is, it implies inequality. */ predicate isStrict() { none() } From 65c116538cae1bd0627f15f07e754b321c89c846 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Wed, 5 Feb 2020 16:20:36 +0000 Subject: [PATCH 3/7] Write library overview. --- ql/docs/learn-ql/ast.dot | 21 + ql/docs/learn-ql/ast.png | Bin 0 -> 11863 bytes ql/docs/learn-ql/cfg.dot | 7 + ql/docs/learn-ql/cfg.png | Bin 0 -> 14157 bytes ql/docs/learn-ql/cfg2.dot | 13 + ql/docs/learn-ql/cfg2.png | Bin 0 -> 19764 bytes ql/docs/learn-ql/dfg.dot | 10 + ql/docs/learn-ql/dfg.png | Bin 0 -> 10774 bytes ql/docs/learn-ql/introduce-libraries.rst | 617 +++++++++++++++++++++++ ql/docs/learn-ql/ssa.dot | 14 + ql/docs/learn-ql/ssa.png | Bin 0 -> 16781 bytes 11 files changed, 682 insertions(+) create mode 100644 ql/docs/learn-ql/ast.dot create mode 100644 ql/docs/learn-ql/ast.png create mode 100644 ql/docs/learn-ql/cfg.dot create mode 100644 ql/docs/learn-ql/cfg.png create mode 100644 ql/docs/learn-ql/cfg2.dot create mode 100644 ql/docs/learn-ql/cfg2.png create mode 100644 ql/docs/learn-ql/dfg.dot create mode 100644 ql/docs/learn-ql/dfg.png create mode 100644 ql/docs/learn-ql/introduce-libraries.rst create mode 100644 ql/docs/learn-ql/ssa.dot create mode 100644 ql/docs/learn-ql/ssa.png diff --git a/ql/docs/learn-ql/ast.dot b/ql/docs/learn-ql/ast.dot new file mode 100644 index 00000000000..eca1e0c4e7b --- /dev/null +++ b/ql/docs/learn-ql/ast.dot @@ -0,0 +1,21 @@ +digraph ast { + "x" [shape=rect]; + "y" [shape=rect]; + "z" [shape=rect]; + "x + y" [shape=rect]; + "(x + y)" [shape=rect]; + "(x + y) * z" [shape=rect]; + invis1 [style=invis]; + invis2 [style=invis]; + invis3 [style=invis]; + + "(x + y) * z" -> "(x + y)" [label=0]; + "(x + y) * z" -> "z" [label=1]; + "(x + y)" -> "x + y" [label=0]; + "x + y" -> "x" [label=0]; + "x + y" -> "y" [label=1]; + + "z" -> invis1 [style=invis]; + invis1 -> invis2 [style=invis]; + invis1 -> invis3 [style=invis]; +} diff --git a/ql/docs/learn-ql/ast.png b/ql/docs/learn-ql/ast.png new file mode 100644 index 0000000000000000000000000000000000000000..46098b6f0d51a99f7d5828b1d06c2dbc8a301a41 GIT binary patch literal 11863 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 KbiTatgZ~3et%#KX literal 0 HcmV?d00001 diff --git a/ql/docs/learn-ql/cfg.dot b/ql/docs/learn-ql/cfg.dot new file mode 100644 index 00000000000..1d4114467f0 --- /dev/null +++ b/ql/docs/learn-ql/cfg.dot @@ -0,0 +1,7 @@ +digraph cfg { + rankdir=LR; + "x := 0" -> "p != nil"; + "p != nil" -> "x = p.f"; + "p != nil" -> "return x"; + "x = p.f" -> "return x"; +} diff --git a/ql/docs/learn-ql/cfg.png b/ql/docs/learn-ql/cfg.png new file mode 100644 index 0000000000000000000000000000000000000000..87c5187344fe580587a2173e06bbf31e13a242a2 GIT binary patch literal 14157 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 literal 0 HcmV?d00001 diff --git a/ql/docs/learn-ql/cfg2.dot b/ql/docs/learn-ql/cfg2.dot new file mode 100644 index 00000000000..525eddb774e --- /dev/null +++ b/ql/docs/learn-ql/cfg2.dot @@ -0,0 +1,13 @@ +digraph cfg2 { + rankdir=LR; + + "p != nil is true" [shape=box]; + "p != nil is false" [shape=box]; + + "x := 0" -> "p != nil"; + "p != nil" -> "p != nil is true"; + "p != nil is true" -> "x = p.f"; + "p != nil" -> "p != nil is false"; + "p != nil is false" -> "return x"; + "x = p.f" -> "return x"; +} diff --git a/ql/docs/learn-ql/cfg2.png b/ql/docs/learn-ql/cfg2.png new file mode 100644 index 0000000000000000000000000000000000000000..adff43adf978b12f7dcc1d4653a5292a2b916496 GIT binary patch literal 19764 zcma)kcR1E>|Mz8NL}sC~g$5#{NXTf}nW4;-RYr=CnUR&UA{j*@AuA;b*|Y4*NFk$$ zj540rr~Cf>j^p{`IgaPJJHGd~zPYZ?b)N6@{eG?U3e(X#zGd@{%_I_O%gGa}r%5F8 zS^Rq-4Hf=56}?{`|3_t|eq5EbLHsZ6_2auF5-;hb>QQ}<`_rGVnd$XzD9#%7SvD9h zvTS|F#kBR)3ufV4fpR9_MoWL_hO1?^?G-ETIa^|%$+oRf>-L^Bnry#pN1I#IF<)2L zXY1E)(Ql`7;6 z_dje)rKi4-A+gd$;sK<)zziCT~4j!jFkUl;^(hEEiT^L+1VKy9$xcz>F3;!&xb2~ zH@F)c8yi|$RBzn4@o-60NQlb7z#uy}x2B`K6t<_B_)-X zl|>~jEuEc{qkQxznX9WSi6oP}W&8H+BqjX*g_#(McmICIO`A3~w6z_xwH3nOxE&Mo z){LXVYl(qJ!J9QU1A!504pJT3aP-8kjhC?6@_SprV^cLo6IiSaGq`Q?v5Z zU6wlh8JU@zu3fvP8`3GJs-`xwIP-D#_ir^NB@)(*coc?^Kn0&aX_tp8CqBPA7!euC z$JZ%;a4h`Rt=V7S)KyhghgasuLqkKAR8=WYsjH{w=7#gB1Y7hKSQZo&snkbtB?}7O zve&#wuB{t;qPDKCx~pre!11V{jEs!zn)Ia3sos3ubLXO7yf~yA@?MBpnTdlV)OUS_ z`rxHcRUgYPr>Cd;r>lfm%?`iiIABBb(tV1GEnIL?Cl^~;^Wm}f$kY^_qN3vR-@gyB z;}lf%RkdNP67G}w19IBB8~^HrC9H{3fuEoJwbv4x`yqYFfkJEQwp2xJRu3|Db@iH? zbnLVBJifdN3f#wz9m7Kh1_n}4F>v-x{z*!RjU8TJ`}@Luifw&u$=t@q#;<0?qBBD+ zQQCp+>$h)eT>NTb8dHBRXZinga_R*t9!(*+<9lgEvzrHo6=jBCq=NbtJ3aWKko{l|HT)A=a zUyVEeU38+~Aw?r2BZG2&8@JEs_MJNc6x0mFCTB2cr|sIc%i_X?5UeDAc#~<_rFSI` zy&dIl7g|ykc?t^)GZV8}og?0#@t9$&+Dn^67d; zM)deb<8@5=0&hr81={&Qwa zoUi@(bhQ1!5tpBXN6ad{x08{P6+C~=;%+P&keJ9(xv}n5`|h3P_xG8`WtX^u8F`|D zf+%%Ej_E3^uzC<{W1qfv@7@CM71szJMeds5Eh_r@TeGxN2fv(BDy97O>sKGPT3K27 z_T9UI=U!hQne5KZU@Ql{o414AOKJ-x>S#kTW-JxM&e7km0CM6|hFg)pY zy?Qk`J)KWT>pl(6J0m0Gz*?w1D{*eH;G(K0Ptw*!afN4O@T1m0d_7A#7P;eQu2H_# zWY-fNJ-wPJuEVNaENar*Uni*k`-$2=zo+KLT6cbWb&YXgU?79xaciQuC3zH&BE!Lh z2UnMdd@~qAGLj+nxSDlj%&8i zf4glMM?&+vXvKA!YCK1;oUjHU5>qI?aJCEOZ;! zB2zt~o1yZzN)I0=HuP+T2Qw`#?d;qfv-@t*Y8>%`^UcJON-rp2qGJ=OdaRwARAH{B zrsjxQGS!n;gQI`(pkPjShA2^its;_=ti8|91|}ybXRD-B?v|D=={zgRz%3st>o!)^ z&~Tzkw?vDZo4cc@Cm79T>$Yt!Yk%C0jg4t+hUnPEf^OZ~d}Cwnn*VfkhN?fY1|@Vv zoyy3d2^=fp`PkI783&4*R9jnH)!n@ft)?EGVn?xP_w$v%e^pdeD6q}%!dQhTQ(A-t z1^Lim+{Rj%U4!zDyShH_XgY#sXgyGDH~Z@sOVj$E9N7-a2be1(SQ?MNi=qz{eFvxO zWiT=#BIrp~Xo?s!m%BrVTbPb_s*3GCq~+w?dT_+6`oo8!o|#KSm67kl*&k+S(_oBLeR&st zFLhI6TN}gva}`SV_Bl#R>bkALI$PDklr%Kx$&@g`lD>HyzB&?rX%gBvZ9uX<4|QvVq#*b9KHYF@l;Z(VN`jdFkM%=m0`!;xh04Pc2z8jStQAc&FRZTJc?AaH7 z|0eUk)Ol(DX+1s53m1;7k4dxAhE2Nj(eMq=dGH4DN=a>X=y~d2S}G$VDmwDxN7TZ? zl}DMGN3rP_T^gI3zO1gypU~2(>qu9T@cd{MHJ1l^OoV1*ArQZPzn7Ce9cJhp)M$dR*;Ty*rU|6zoZ&2QhnUH<#? z4N<6+)YR7KdmalD%*DmUv(5Y8STx1%aldrg!h!@WaAmrWxoTXDeCU*8zoX2;!h*eb zTXQpA+2x_&va*Aitp)bodq2H&r$ci&wgO-PVbocECbIzDc6<}td#wr$%; zehK@{Z{T!CQJx3mR1Te+37hC74-N3N>x`?`EBR8HrBEor>V4UbfB-VYoMuN#97>H z(Qzvq+ZT)-42*XTF#-}7+BikdzTAqP1=Ma-O> z^duln6&DwmNZM75+u0A=iYPY<^sn9f_lIDd61{3GJNqa~ukWS%zV$y-`$f(?r$j>_ zP!bt|){I|Ym&O#R6QS_iw$IQ46*)0bvX5l3Fwt31Qt~eO;N`TmG@YNlMyF2)pcoI( zijuI_MpIL(-#-Y?u6U1)zkh!^Ha1rO%=l=1bob&}6BCo4#z_IKwvyIc_p+}1;SEw! zRwl=G;FvVDw&uAO@?H#LBH+!-moJ@NU6rvdz%=$}-#lS|QPTPTJvk}M{hU4^D+XT2 z6FuRWx}&<0YQz*Ysn~zHu^zJ>EnFk_9AGT5JvAYWz4xjd?Cc~?3eT2@SK&HH&?#>`=iek*}iRT3@g9;@Zm$f z@lwsg3+>z*_YQ0#Mp9m$sF|4=QNTSfZ|LoJcDQ@@E(HmDcRqg3qhhab^4RV8cq)a| zb~7CveTRP#$RslB)13>2#s#1&7v-hn%JmEl+3cU30(>CA-#(*fwU}DYUmIemO1vpH z*sq;!yr`+HqJjrw1l*Ut_$sLZ4Grg6b5L9Tv>uPg@cd6xw0E#0p!8aln}pr_U1Qa| z4jwK&ae!k%>dHWP84apFlNk#iLs=+y5}@e&@h!#m3CCO7>^sMP5AIrN5+A%x<> zg$pFV86(Qs8sgk4mdw*ur%tzG*QZrWB7InV5b~&9ZFe508!739Z&!Itd1&<~< zbg)F@LAFMU+&1hp$C2w&)z#JF7dv?GAHMeNOjHWs+_j&B=`UWq7;rPc>SmW;Ss4hd zO2!txiH?qr^T_qB_wL=BU0e(f3{;78cXD##6BHDTJ!5?2$Po$4YD#RdL^BG#YIIKA z<%{b5BVLBX^{WGz%rSW7r%y#5J$_u%+nZ3{7ZVq!7Q(=ln2O!Hci04g1?O7L#^zC# z^-G_>GH5r3nG${(CULgUuB!lb(b$=7KZz0e>vz4Oz5QM?r6^9>_i3XCGd0ego$D&5 zmyWH?wL7C(dG04hp>5?G@09~&N>{F2vH$$wofWgS_2}ig6Eu9EU%CsBP5@Q&1u-e4 zYD-B=-*eA5D_17zhxs!p1IVg<`uzFLipk!R?gMu~kXpQs8yO{FHEyH7bvb<8qnE`5 zX2W;9ufpCdHO$1yia#bkUg$#GePFGv-4}~D0f`unH~UAM58cUcP4!);_3`l`_^r~1 zrmqG$c4;VTiis}_$p{$XmoT45Wn7&Z$Cc2B7kQ^M8xpqtgxi%J4R7I)|o z(G5}7jXd_Rm8879)YzK^_Gczmb~H|T(sjB|0!Nlay87c&*y^hHi&w8CB@bWv{Bm1) zdAYNj8^x?=$0vUZYNqYm!yj+$|i?Unqb>guxU0EfT# z=JNo^6<(bg*zsz2$+0;0(0~VOC3`T{T>dQBt**|uyBm(AXU9jWHEitvp$=^!!php( z(%$|Sc=&b3T|mn_t*oq+6iZFYxDH<(#v#UZVFk{{Y}Wi4YU@|l`ip6FxbnWi%v82`XA>bpO}~!2CO-BW7VT*iv}AN zCg${~^1I(}U7hUO6C?ano||!gtX0L^TmI|Uug=S}mOwE^_gca;Oju2h-9gQbHkR*#wB;93b08H^yxUw+l}=lMS_cHX=wo>`Q_&Bb9HmW0lr!3 z^SAo_dloD*IAQ=mZ?;NS_GNo%TJNh@i7~3Hqf@1EZS9*>Z`|()prWl?x28RN#sFfl zLs%$%pc2y!q?P~RL3SuXExc7=0Javx39QxnT9X+7y#@x|RK4|CLAk%;y}v27V1^cl zn*Q1%*5E$6U5$?yN%C+HtOGV1X$bxqc`XuzktBppWhC(_4Sg`U0wP%7cNL{ zRNHaAc8yz=AIc9eYnX`_4gFX|Tj9}iFsP_KUkas=8UXzfUX`Hi>Q zifdiN{)IDVQP`ZEoJ?D{24NxI4h~kf{oc2CFOF5?u7#125s%-K+elzyp(iI~IT^4z zb`h`KUSFwdWZuu^+3&!#u29ldl(jHG04&I1?>MWYJH-ty9= z!Hf;#8C_3LS)4pzw218N-GoH;tvNwsyMnvByHH`zhYx{KQ4GX(<>WM(oo{Y#mi&<8 z+dtX%%{4c6HMimwMtF@p-s^U3Y^}H7E@5FwAEDn13murh3)B6qoD9?ua-J65H#hzE z{W~qxKmh>(j_upKUuE7Bnw??S9G?1#6K7oMEsK`mvbyXtFsrYPSw}P$)I>!^MF&9t zu^HhbN4P94Ej5&X{`?tDAo%9yhnSHX%8HQxY=zF`tYa6?y}1#Ymc~nncK8sX5fL`O zq;Q5gI5@<|JuxPsWlD~FK-458QYb>@RR;R{HdMQP`wy7w==fDvE06u~K2LYU-rhbg zxC(=kl=-2XZ+DNz?~`IJef=q_1`ZldNVqjvEub>VzUTs5(7em-09LK z2Gl)1BJJxqK7a}o3Jo2d3ZNq))I4~=fKd%LLI3brWHp*XCtzcG-BAN06O&u@(LAG2 zTxjU&RdK)wvGLinC_}sqf1@=IT(qj8=dYi>HwYZTlbXbMi)*D zQsCt!wWlglgUx4U34w{>%@cdB%Or~ySeI==&(uy;cn5KkI7ndVV*%OF^)#M4+S&$l zAGsd-HJ}8|Dc}5!?GE~f85zXXV&qX!LMLDQ^Sj26j6(d%giZv9gtE5VTBUWrhas2I5;FcYl* zEPOBCNM-_fCWJ{0UE3Q=m}2N#byyw=0P25KzC{isU<5w^5~!r3!?e1#7L%G9{p{>3 zt4}XnI1XOo3})c^(`xc9uQO9UK^(xtK9lR+f7%e>>lJ@ic6MSdUS9bgfMfavtg{-h zuh6EEMK?$*3?lVTF-1ilLiGV$V8GLJ%6l;3K{6O})j;R}wWH-_4?rFZfTh;cd!MJJ zkswo8uv|AcH@C61MJQHi03`d@LK8nTZ5m4xOXV4Q;~QO7r9`=D6CZXBGln>~!*2s6Y+E=my?edB$oMnWEj;`F{ksjQ zi>kJEG>I22Q~1@@8U80vo>U*YUlkV{%d~(0{x4s@s$v9%LTh(%cII9B@tM{AqEj7; zxDhiWG$n-#5)Ut0Lv2q_JU-v;U4nvPauq_OuI0N#L?ZCnm>5D-AnNGq>hguNiSk2b zEmt94f&M$w|ZJqKkzmBdsueO#W-(o@6dbqw#VGL!>_o$EYR4} zveo?r|I&27OC&>LYl4T-s9JRXmVlYKqe@_}bw|ckP%E?I+@-__#lkkM2lT%oD zINjW@U;O?3{TU1fyZ6rTrlzLmhc*pl6^aAY4^@Mfj*ivcgPZ`#&(6I*b^reT&|9}o z6^*|l*BrLCwr;#H>lXUx(JoyhBVmw*i_9A*G%=%N;FSb|)c0c(NlY zqJ5lo)25r(g{N6qSX42^?jLdqAn}4XWZaQn354i2$|Ie2vQZ32pH_H zgmv9*@O4)1XyI7v&Aa@4mws^FLq8!(AuB8EE1=q=;$nTKSC@2gsKOvyK&yD78Kvrf zex6Q3T3S$qEw`=q?5R_?PN=Kn5VD^(F*$`Mb&-5XtCRAaIKW8*dRQ2AXyS=JWN8Xu zx(Jzx8Fi)8YGU5c&Cc?2GK7$LA+`&k`t0JaNq_k8AuJ(*9pVMw)vH%k&z!kO;zh5o z9T-S@YFroq&Zfo7egT+E_1w7!jvq@khgY_zwhNy-ch06Zl$nzB9V&(Fl?kTCh6bhy z7n5*6pkG+FyD|L= z#JPjYb5cu-&D~hKsjW>2$kzr^9q~%4>gwSnUMx{PXa<3cGe3W}d)rP; zP2JsC|EtX_0aBJ6=7y(1l{_{$r$O6{7T*8?H|+j>&hK4MSY57NWAEFf|B!VV?S~a- zlYjqy?ZqFT)tj1|H?inAxNfZbyf1Mu;@`JV9j)Z}P_a3oJfg!hGPAM@6kTW+x;$9H z?0!PjP)%)S8=_$rDYc^ zKw+Y7Vju^-vx*_3pt{W}tW})*s?7Wb_u)f_Zewm7NX;W!FNnfdn0{Ejmu;LjSPNj> z=OzzNS=Zmc863>w;NVbgRTzq+|6&Dz}R)onDao~LJ20JJ;1y9J?3Ty|~i8>W0v zKN>?+7D1N0y#BI%wCXcM18N|eEBY9Yx5g_T9gt9U!kHpo6iqzr)-4wI6M4q~!-*m$ znl&cNSNx2!qOGT=X9-(s6XP{O!OXpZc?#akI#V|wKuu1I>9HnNm6=QVvnzn&Ly>6& ztX93gIDL|Y3BUb-$E?M#`F6#-7*;XSJc_sEG>&1UmAii1eCD|gt%RhcfCyVSYB2_< zn@Ii8UYYRWpIg>YeSuYpNt5UVDYMDD)OSTzR6sxl z1k>Q>AnVG?ip{sCI8`&V`}ACLvB1?dQ|C)h5---@e-9>A470#7sV6Q)M`^v$0t!n? z1i>J_0wYH%T)ZX9ji|tXvH+%ASy+_mw`>WEk7uLZvSpk5A^wrkQ57)uPz?L>t20U2 zHFhOf1SL)`E?Uw7Xrulmb-q4crCE&YO$rHs@>>SqfR=sOtmygc>*dnv|5S|kyt;_FuA9O zKT$x5ioObRSEp(4YFFR|9R2t>GgHDnY;A3AZgs^CYOo3zlh2<8OIxO|&W9%OvF=U@ zMspozLn{VHKXfdLbEWn7cU7$!_B@LH*D+c>)>ma=+aw-GElFMogj`QgPY;qDMUW)} zgKYrz7DfG#N~uVwEs48*cxHd50Bi|lZGJ#9=xRjl0Q?Du|2Ax$U%y;QeqaJ{=Yk0+ z4lGOL1OOy!T4FV&HIE&m!rm~ku#o@9rSC1T#H93)=eBKs5D5_w?;7VB#T0-xYK>O; zUx$)-p3Q#+i#>re`(Aq;EOq)A3{`8m>xtf$>l?lM{IxYT-vO5KL5=0%;Q@h>5*(As z1Di#K)WiLr#Q?Fc4x-IqIGK$jJUlT$bNTY+)y0pOje!cYRqXZd+`TK|G#~{MJPf0> zwp;;dob_nt2O95Ua{n*ADDC#oiQsq#NvzVdudcD54e#UQXE(51wO zCL^H{&?xNOTQu{k@p)ZC!(hlmq>Y0=lJQP6DDGGdNb#=7>f)F8BK^*kY%oGGB8V0ePoplZh4u%jx zfrCf53t%&)mp*TX(hE`txkgI;sTA$w>>f?54-V=v)V3PeW`+~_Vo+O6=W5wSqg1)zO)iWw-^K?zw~8XCn&1P8Pz zG=|R`eDmfe#A863{h=%!C@V4zY+_qRJB4bX+cl!oIsqFM?#pBN&E53iY)ni{I-_n7 z#?in@I)ZN#pw5TCgTJ(0>|6y6HFbz>Sjmy*wzj%#-G@Ztz|YU`@>rz1&@4XO;drsL zn?X$mUJlS8x&w{D4^bhIV>PZQr9AUD+=TNEuUB(0nKre(9^-6ed_2U@j|B5ZrHfDc zB=*zrnc1F6@!iZYRsvqVdX-(1mMs%mKYA2eEgZDr`IQz|yfiAIy04Gpzj-8oe=1@32NEz>s_W{gFk)xt=W~nH?el28v2PecVeo;i!Eco5O7rOG z>1)%D20BCHLl{E4YlNm2s;T(-rmYap*-)A(=;|)eGZDoJhX8E>36T8rH7KZ0pFTy= z!4YLmUpP<1ss@5#c7tdU+)EtRcV(pl`VR(4h)Eg9M)jkUcb(BWWbT#~3&9B{RtX?H ziu;Jk)b$dfS-3dx7|1~Dlk*sz+ztbVfb4Vt1cJF(EYFT4%DQD$MHe~tA6NxBht2Mk ztNj9+r-hYOfbPR%BVZNCJdAw*9)_(I0KrRdp%9smNBCuBw}Xa+;1KHNn?V48 z{ZyN!nT)a(=oqzgaH#3*WQO@j{`s;sXf!QUsfC$QpV|Y#2%Kk7?Y1fSLVEP}8@LQk1i6)2| z#6G%+2}}i~*uczFRUHp1|S5uhbU9KJ@ld`(4%B za}q}uJg#oYcSCei2X&b(Lv$I!L=4zOr^>ZiKw5emsEnx4HG3_zMO7pX?2oh?sSkrF zGDD?7EzwHdM#dy!hxBGNgvG^0;)gLuAX$cBExXERfXNcC_mOTRj?vfGC&z=7U&)Vr z*JID~)fe>H+I@jV_0HKx!a}0LxRwVp9R7QW9xMfHm9#8B@e9Xd0!{$jp#qoDV@Por zejI~&K>Qg72PL<*v$J^5v$J$aB@pG0;h|$-poStveXq36Y@w&;6%eRtVd(8z3I#p8 zpOQjk^T2zENE3$8M1PSmgiSK*Ej#|o_?c*@V*onOd)`PJWjGBUc%mc8yTU7KN@+7l0jEYrIz2P9LUb!Mg8pfIT zSotLg=;w#dLP64cAWthHAz`ch1Q3Ln$}P`dMqNXk?DB(;4)0?*OZO0-J2=4OG2u5q z^jN{ONw=Yj(N-vG!*?QRxrCI|F0{Sc!NCV`SA5)F`EINwz{|V?pPNOQroZem51Gz5 z;i>ej{r>&|lobcoARdPq#0^52rdN6iF~MBi-M2MW?j(AnDnc?nLn*)~WJ-{xlnKuD z>e^2lz90e@;|Qt_&&_(s6Oskc9xdrP>}Kc&$HmURB$OT+63C^_xB?8}oCVp-lU^W} zH=(5B{V)c1Nl3)3u8gNrk_wB9ZFS9BZc1*Y3aL42Y@DbR_4~I= zcUKn>*6vxKgS8kl&Ja~Ew>8yS74nLS5s?j$5Nweph&nKFh|ZTuEIaUnj=nx6!Wkq# zuzR@wn=ri1&|iC;X!#Q5Jr7*^^n$Oz1Kt>%f7A1S>=1#`Rz+}r15;2Gi z_S2VD^nLv_Yt*NF)pUF@NlGTf>1k*v&BDw_b_^i&clEgOU6tp`p}-Qc+x@W?Ks+*z zeSYZnB}W70HpNv?q;7a1K7ftRJ?%P+S0}AsR(h1SXZLQxxcoiI!msh0YvLr0rS00& z>8n@f$23JuifIrLC689un0AYP*7TK&MEHGhL&1!*+MLda#8(L?XIC6q5=4a)s@%e% z$ahwSh;R4-NQKF5MfNc#uDQKEzevGb&)|XH8;vZqf&Ve}o98Oc)-(S+__!0hZum{) zn{>)}uHY=rJV`IW;F!6}jB9Vh48a-gZ$d@mt^JhRN=GP#q zSlHW}j9cUJN`5pqHqv751MKL=eS^l0Kx%A9)3(gVk0k>|O!uM}lTt5dIt^BApPQS5 zX<7xj+|t5AXS_<=GF#+32H@XT_rJfV>b-}$mQFa_zJH%yA$5N&ofGlgKH#Z#i*6M# z3GmE?fS7xm&Ec$|+mV((r8U6%kvH$Zb*_I~BGY@3YY+eJ0&o@1fWw2dUsGCh5b+T2 zzJt+1Qz3Z+ef%EQb$^KM4@B;V5gY^4@;2O%?iZgCK|hJ6K$FnC?UWg?45d=sS}MdP2ur5{ zaK}s8#msn7g)M%jN5#d(vt>>kGc`>nS$sj^THLr6x0hOFCkF?ONPH5&P%Nt3XlDd5 z3Us%8o18p_sZSGK&-(9(nKLv1Q3?{)59v&S1zEYr9RJGq$EgkIONmFH*45RiYH3BG z8A^QAd>{{T5FbqtauOdk11B#^f|7(y;FIUhuN(E*UY}5@P}cjXP}Wh;d+GBvh=?!i z#&b%lAh^}^^ss?%ZJRI%0)H0LNYu&PD1lgr{YPjv6e3m6%RJC6xhoUA9ki|}&S(Ht ztHwKm%Xk_B|67B{Aw88_6*ZR$<%|(}DaRq_G@ZpEoj9XBoDY!0J%kOFl(ZSx3|*kC z&WRX?7`P_F+n8cOSovWcpliXm49U;mk7UsA#hi?P;e&)dk^TBeKB$0PlL%H1)0l`r zAZAEL!e>^4$@uBhCz5xiwLA1{)nmsFQ20TY7)HVnW7)rUK^jayg6nW;Yg?}pmRdUX ziQeNc2t|=A)}swuLy~Nfbq8=l#gb-a-*_$0@)54!Xx$bh@u+Y{28M}_ zbPDK7_k8}}$pnxJ%s6}bb3Sb|(pzktPBDBm20eS>IWL4yeR_1hJEwz`dLbU7q}Z3y zQB!xGk@#8!V^KCQuK&)-R(VUf-@x}RNz!zf5q2FUOYlI%1Zau})H9Qg#py{SG_)Nw z>nIK3h9k<7o|*a1Tl&C(oYDy5rp9FTh;tg;vsgFzZgC(^;}ZLAgOxs}PJ{eu@syPy zzd}MniBfhfNcQ%L_?Mo?psWT2WX3fCh=QSV_l3&6mc;5Jwg-YjS>i*Je?AD;^m13W zE|iKo0@MPc!2d<4M*y%Fg!6=^rW!DBQ61{d>X^98(_%gAMCaD0Wd@zBLG+Zzf z;otZ>wBh`%X&V&bUO8dCJX-mL=9?Jq$gvU;RW_rh$0fua1)0l(5n%QIXyyows;lb( zpx6+w;4hecnuF#*Td3K@^{+%G8;Ha5{Q2&$K4sGAfkBoC34?!xds^t z4hbvO6xQ9Rt6jdo7lbB84H{Yl-N)f!K&9sRRBXPuX~9M=p;T6M*j z_!~Jn_HmEar-IDk>1}^RWaw$@0SXEFO7a6HG!`+83t$8kBNFAv8o-xG1Fy!(MFxfy zk=H!KFEK0+P=#-inT8#+W-D+ug;t)#DeFqP&+us#3~1Ot^!`)>@q)Oq0SrngWymFU zKW#L0lSTBDxM+c%W8EAtinzWeRL@$JI^Vv1;Rs0=H>?mBY>@9Zy-=0{m1?hWR8!At zlF8h@1iOnDI}ZDyQX`8!=WRjFQlBUovG3Wlhern23G} zn&K^adDYgi9DJGZ=fT?vMGzcAxWM9L4vtL3c1bEwXGo?z@M{k1>cItEIveD6<+{Te(uBH61OqI)wl^ZaXdk%WWdl9=6(ppHG5GhzdNNa?5 zp?h9?{qs<7Zn-{CK5&&PW{bq-L3w~gs*j~k4+Fa@UB}zF;31`>`fx|du*9FwsT*g; z643$3rNpHzBGHV^*#*z51b28=mq(+CAwfV`kow}>jf1#s^54u!`5?Hm!^|^QZtf`T zK9Gjwlj09vh>i8B)9pVI>xK(79_HCOfajS<9As`~>imoOB zQHoQ+`^DK${!GQFZwt&yA{hkwi@R93o)ez=^eH_cJ4m|zh@=DF5Le2KO-#PvU5J&Adlg?bel!oM@o@J2P%01G zi;4h$-oi1nLM&tX$E%;t$clM*cz74Z+{}3f{-C(ADoMoQVG{7;kulb`3~IlA+2JjE z-~fxHZ40t9RA{vX^}2evL1g!C8XUK`V6%iE^-p=@3%d`<0U{4?Kj3_Gyd}bfQvFXt z5Lh5)4;IV#g)<+a8{>UK<(^*kkN@y!hZV}^kng&@lmBCmIMLbaX=Ocq{UDqQ0eN{& zBBn(|E?HQ>)uIsKI1srV_sk|B4#ibWW2+#>s>D^!LgWDTB+gN1+JRnwe}CtzSC1iu zfRsoGEVE5WpppCJIq5>BX}d2=0k0n3xFxC-ikaub`SD|dv!uj8sFn|jn)F^4M=E6~ zo7d!FON++p!Uyd`?vq=Ii$hRNGSE7a^LV#gOso!Fy8r=ccu(~DIJUZ*_$IEXl;o3*;VAqFSg#%gB+PdZD&6~!! zq5>I~*4_R0vDZDNPciq9Weos+L30|Oo{m6VRjNG63`XlIOh^JwLQ5wu=Q({W?e;wU zs-(H8sTyLU3o@#R23l>buQ^}2vK1HJ3}LOo^PvXrgaJjUF}T)pxoak)^by{L7=l=g z*@f?V^c>=(!`FV)LM~V3+R?2FiiqnP>EEP2iYHa+nLF5%Zy?VPQT+g|7qU5U;(1{y z;h?;QA%C*3wWVc8#RjsF$g}&^k6NM$LHN|plk}ERg=UMuasWtH8VVNI-iX{8@IWsn z{#785LoQz^iCiOa69LYbA!k7F62855P}V>H3VIRT{ViBv4g?{HS%!vJe2=vaX7upL zh(B7h5ooJ1!(vTY5GWLx*YG0d@ZeVWgD!$hmd6L+lsn5eKUH~DA91!~mP z)DVG5CgrpzPiUcp3R#vxQO0!|C9Bnu5FWzf$Pzqv8zc@TBsO=u&NOnnFHQHpqaSRV_bZZS@YA*u=ep$oF0P7Lc~Tu(;wzW_1m{(rKP1# zuC{GZ7e7^avJz2gte=IAO%VE#HLjjsVLD{+82bk#*WK?V3io_x1!8WBq;{(c{b|5_<>H=&NCp%D@hJ4oUZSEu{fWN9t+w&8vW z@@+3}tjWnAIYK15P;ypKa}p)2gR8`Vw-8=$z5r9uZo(ADxiK;Vy$OwbrpuC@%c2n^VNfp!VEp5 za`VyL39I16mG3M+hTcR&*ItnjI(MYfo0X(cIotxXd%-T`S5^r1VV|3GB8RaBR@1s?2$Frc;Sd@iCn<$$7l4ahwe1nJve-g0pk(naO}14 zEG{k+Yj*=F6Z{F)4EM?wh!;d66*uNT%)T3+PtVQ{MQpPQ7l091gv({qHeda;#{iZv z4A3$84RjYqn&)!5bFs12eY$k�iU21>Ywo zl#GnnCnqNf=Quc+3LKy4(15Z;M84HFu=!gC5|E_ZII}2eXu5!O6c7ZkR1}0y{m-UH zb)%V6|HrJw$Sj+3JZq->STbbX#`plPxeXe-U-&_q}cd)etZo8cGP2jYzuUo7#v23%#dKA zy^`QCK@ry=7ZMX|^PV+Y=i7I89qsh!*|RBj-3KKk>|8#JXV<|2wtbcejtgtV@LQ@R z?i;{)z_cYLG;d06zwn0~{8h3{>f5((h%YqmT8m>u;(B6gN|F)xlajLa^pDWIyl?x> z2w@cetH+CQb&t3#WmSk@=-R8Tp8E(;6Dc%XtqUNBqk>2#Mm#O(UiXdxV#%PiWTod7 z6x?1hLll8(wtVq5Xewd|xhbRIWoeHe*WVvERWJL_mhkU7_RMh~p?dp^vYI|VYu6JV zOG`)`#Y~DjkGd!Fub};fu%Is5+Z%d55Ss1k#rsPi>~tSYhww0P1UrE*W9XHY)ja!6 z3jSXh0{RDE-X9BLJwR23ZveQ-oe*5Rl7@ENE_OfI$2|Ur`~s*ZrKyd`%uijqN73S zK=ujcQ2vZZcSj;41x74I-iqffWQ1#FbtY_0XYMD9w9rX!4CvY|%6RwILyxBUKVsEu zcC8wce`H5*tZi6~P9K>%Gu7`gGHRRm`n@xh#ZRxjdb9faA<^w67!5PCKU!|M1EXVW z%!y~lRjkaN0bTFkTP;S)AUgN{@B`@eFngnL{)q3;*bzyERXv7FZfAdaOWuc1a{-T*AKLx=o4!$c`F5tT|T?p{$hy<5g>uakyx5L`}5!19HM>@8p`$vcQ z5zps*?b`8^CmYSJ$6WOkGgbmN$ul#Hp2*9~LlRvH(m6ym;aIG7#M+sM_NW8ce zfx)bk+fB?BG+^A}cE*)(K>DQC#`k>~g6M7dC(+rFYi0yv;oY^XcG64e`Qf9u++nDW zcrqA`VF?!x4?7}m)&2cvNKAwT6c-mq1iW9Am(!BIKx$(93)g`8ROV^9_O>=Qk_b15 zUs+#jZf-7#x7Z|ad2uFrH-fjMTJYq|t4PPQld>X3gTy^&u4P&E=9voP0?MQLzCL5H z9m_%RT!T?5aa}if2aqLyVq>Uqrq!tUU>s8Sx7YJkGW?5O;#LP@d;zxa4qapX} znEGv4&(uoAUdY1C+!_N2%_k>kl0@YS2{2oKFA@GHT&Nqb&%a}VvP|l8fc^%%nZ=X|JWWzb4mY7=$ z8`TQHQRANBMgxhY;JfZ9VVJJdx6q{SpdmJx()8g2E11VduS?cmP%K=pBcvn{!?ZVV zcyN_WX36cxCs~MRJ26i>>`OSfx#ML%KX;#=oV3ScC9VqZmXo`lRdz~h{NMY@R(<_= z{;B7Cu5H@{ePnh-63^<gsu*KKsqH(Ko{jA2(4nNHRC?Hn z$ccNM^)^&?`pj*)}j%XSg>G7#4x%p5jG< z(m~O3{NMHJZ(Lq}v9JQpgs?^p_=RX4!i3dBLp+g@ktAD1YHkw3O6xCrkj@~Xhf|TF0cEU z?>zVI>({i>QZ~X{^uu4qRl`$ibNcu)A>Z1?-@h%Lotf~k2q;t|YLb5Xi8I{0yRrzl zFx!`y?AQm1zoevu+L)?U1z5Dm4zPUML=4o2g z4ZJZqIW7~@G9^kOH1x!=|5i8N*G@4k)Haalw4I#WIXH+>oRpkQM#6mqf33%E&W5VH zuEiU*VX|~al)rePl-sSG+bt)zjsFk(2&)HrJU{<-OEPUdhw3f?k>N1n^=*QP*JEam zi74cfn&6RZ-*zg zUiAO>2sQ$NZ~f4qjz2!CN*Ak4!^fFINjwMhnGm=C*OSHgl2+?GPvZ08mEG6rT%LwJ VCO1}$!q=dYPO53CK2x>`_&*e6%-H|{ literal 0 HcmV?d00001 diff --git a/ql/docs/learn-ql/dfg.dot b/ql/docs/learn-ql/dfg.dot new file mode 100644 index 00000000000..7a59581117e --- /dev/null +++ b/ql/docs/learn-ql/dfg.dot @@ -0,0 +1,10 @@ +digraph dfg { + rankdir=LR; + + "x" [shape=diamond]; + "return x" [label=x>]; + + "0" -> "x"; + "p.f" -> "x"; + "x" -> "return x"; +} diff --git a/ql/docs/learn-ql/dfg.png b/ql/docs/learn-ql/dfg.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c585c5e6c120672c38ac66f85d780da068e43d GIT binary patch literal 10774 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 literal 0 HcmV?d00001 diff --git a/ql/docs/learn-ql/introduce-libraries.rst b/ql/docs/learn-ql/introduce-libraries.rst new file mode 100644 index 00000000000..fa24eb72916 --- /dev/null +++ b/ql/docs/learn-ql/introduce-libraries.rst @@ -0,0 +1,617 @@ +Introducing the CodeQL libraries for Go +======================================= + +Overview +-------- + +CodeQL ships with an extensive library for analyzing Go code. The classes in this library present +the data from a CodeQL database in an object-oriented form and provide abstractions and predicates +to help you with common analysis tasks. + +The library is implemented as a set of QL modules, that is, files with the extension ``.qll``. The +module ``go.qll`` imports most other standard library modules, so you can include the complete +library by beginning your query with: + +.. code-block:: ql + + import go + +Broadly speaking, the CodeQL library for Go provides two views of a Go code base: at the `syntactic +level`, source code is represented as an `abstract syntax tree +`__ (AST), while at the `data-flow level` it is +represented as a `data-flow graph `__ (DFG). In +between, there is also an intermediate representation of the program as a control-flow graph (CFG), +though this representation is rarely useful on its own and mostly used to construct the higher-level +DFG representation. + +The AST representation captures the syntactic structure of the program. You can use it to reason +about syntactic properties such as the nesting of statements within each other, but also about the +types of expressions and which variable a name refers to. + +The DFG, on the other hand, provides an approximation of how data flows through variables and +operations at runtime. It is used, for example, by the security queries to model the way +user-controlled input can propagate through the program. Additionally, the DFG contains information +about which function may be invoked by a given call (taking virtual dispatch through interfaces into +account), as well as control-flow information about the order in which different operations may be +executed at runtime. + +The rest of this tutorial briefly summarizes the most important classes and predicates provided by +this library, including references to the `detailed API documentation +`__ where applicable. We start by giving an overview of the AST +representation, followed by an explanation of names and entities, which are used to represent +name-binding information, and of types and type information. Then we move on to control flow and the +data-flow graph, and finally the call graph and a few advanced topics. + +Abstract syntax +--------------- + +The AST presents the program as a hierarchical structure of nodes, each of which corresponds to a +syntactic element of the program source text. For example, there is an AST node for each expression +and each statement in the program. These AST nodes are arranged into a parent-child relationship +reflecting the nesting of syntactic elements and the order in which inner elements appear in +enclosing ones. + +For example, this is the AST for the expression ``(x + y) * z``: + +|ast| + +It is composed of six AST nodes, representing ``x``, ``y``, ``x + y``, ``(x + y)``, ``z`` and the +entire expression ``(x + y) * z``, respectively. The AST nodes representing ``x`` and ``y`` are +children of the AST node representing ``x + y``, ``x`` being the zeroth child and ``y`` being the +first child, reflecting their order in the program text. Similarly, ``x + y`` is the only child of +``(x + y)``, which is the zeroth child of ``(x + y) * z``, whose first child is ``z``. + +All AST nodes belong to class `AstNode +`__, which defines generic +tree traversal predicates: + +- ``getChild(i)``: returns the ``i``\ th child of this AST node. +- ``getAChild()``: returns any child of this AST node. +- ``getParent()``: returns the parent node of this AST node, if any. + +These predicates should only be used to perform generic AST traversal. To access children of +specific AST node types, the specialized predicates introduced below should be used instead. In +particular, queries should not rely on the numeric indices of child nodes relative to their parent +nodes: these are considered an implementation detail that may change between versions of the +library. + +The predicate ``toString()`` in class ``AstNode`` nodes gives a short description of the AST node, +usually just indicating what kind of node it is. The ``toString()`` predicate does `not` provide +access to the source text corresponding to an AST node. The source text is not stored in the +dataset, and hence is not directly accessible to CodeQL queries. + +The predicate ``getLocation()`` in class ``AstNode`` returns a `Location +`__ entity +describing the source location of the program element represented by the AST node. You can use its +member predicates ``getFile()``, ``getStartLine()``, ``getStartColumn``, ``getEndLine()``, and +``getEndColumn()`` to obtain information about its file, start line and column, and end line and +column. + +The most important subclasses of `AstNode +`__ are `Stmt +`__ and `Expr +`__, which represent +statements and expressions, respectively. This section briefly discusses some of their more +important subclasses and predicates. For a full reference of all the subclasses of `Stmt +`__ and `Expr +`__ and their API, see +`Stmt.qll `__ and `Expr.qll +`__. + +Statements +~~~~~~~~~~ + +- ``ExprStmt``: an expression statement; use ``getExpr()`` to access the expression itself +- ``Assignment``: an assignment statement; use ``getLhs(i)`` to access the ``i``\ th left-hand side + and ``getRhs(i)`` to access the ``i``\ th right-hand side; if there is only a single left-hand side + you can use ``getLhs()`` instead, and similar for the right-hand side + + - ``SimpleAssignStmt``: an assignment statement that does not involve a compound operator + + - ``AssignStmt``: a plain assignment statement of the form ``lhs = rhs`` + - ``DefineStmt``: a short-hand variable declaration of the form ``lhs := rhs`` + + - ``CompoundAssignStmt``: an assignment statement with a compound operator, such as ``lhs += rhs`` + +- ``IncStmt``, ``DecStmt``: an increment statement or a decrement statement, respectively; use + ``getExpr()`` to access the expression being incremented or decremented +- ``BlockStmt``: a block of statements between curly braces; use ``getStmt(i)`` to access the + ``i``\ th statement in a block +- ``IfStmt``: an ``if`` statement; use ``getInit()``, ``getCond()``, ``getThen()``, and + ``getElse()`` to access the (optional) init statement, the condition being checked, the "then" + branch to evaluate if the condition is true, and the (optional) "else" branch to evaluate + otherwise, respectively +- ``LoopStmt``: a loop; use ``getBody()`` to access its body + + - ``ForStmt``: a ``for`` statement; use ``getInit()``, ``getCond()``, and ``getPost()`` to access + the init statement, loop condition and post statement, respectively, all of which are optional + + - ``RangeStmt``: a ``range`` statement; use ``getDomain()`` to access the iteration domain, and + ``getKey()`` and ``getValue()`` to access the expressions to which successive keys and values + are assigned, if any + +- ``GoStmt``: a ``go`` statement; use ``getCall()`` to access the call expression that is evaluated + in the new goroutine +- ``DeferStmt``: a ``defer`` statement; use ``getCall()`` to access the call expression being + deferred +- ``SendStmt``: a send statement; use ``getChannel()`` and ``getValue()`` to access the channel and + the value being sent over the channel, respectively +- ``ReturnStmt``: a ``return`` statement; use ``getExpr(i)`` to access the ``i``\ th returned + expression; if there is only a single returned expression you can use ``getExpr()`` instead +- ``BranchStmt``: a statement that interrupts structured control flow; use ``getLabel()`` to get the + optional target label + + - ``BreakStmt``: a ``break`` statement + - ``ContinueStmt``: a ``continue`` statement + - ``FallthroughStmt``: a ``fallthrough`` statement at the end of a switch case + - ``GotoStmt``: a ``goto`` statement + +- ``DeclStmt``: a declaration statement, use ``getDecl()`` to access the declaration in this + statement; note that one rarely needs to deal with declaration statements directly, since + reasoning about the entities they declare is usually easier +- ``SwitchStmt``: a ``switch`` statement; use ``getInit()`` to access the (optional) init statement, + and ``getCase(i)`` to access the ``i``\ th ``case`` or ``default`` clause + + - ``ExprSwitchStmt``: a ``switch`` statement examining the value of an expression + - ``TypeSwitchStmt``: a ``switch`` statement examining the type of an expression + +- ``CaseClause``: a ``case`` or ``default`` clause in a ``switch`` statement; use ``getExpr(i)`` to + access the ``i``\ th expression, and ``getStmt(i)`` to access the ``i``\ th statement in the body + of this clause +- ``SelectStmt``: a ``select`` statement; use ``getCommClause(i)`` to access the ``i``\ th ``case`` + or ``default`` clause +- ``CommClause``: a ``case`` or ``default`` clause in a ``select`` statement; use ``getComm()`` to + access the send/receive statement of this clause (not defined for ``default`` clauses), and + ``getStmt(i)`` to access the ``i``\ th statement in the body of this clause +- ``RecvStmt``: a receive statement in a ``case`` clause of a ``select`` statement; use + ``getLhs(i)`` to access the ``i``\ th left-hand side of this statement, and ``getExpr()`` to + access the underlying receive expression + +Expressions +~~~~~~~~~~~ + +Class ``Expression`` has a predicate ``isConst()`` that holds if the expression is a compile-time +constant. For such constant expressions, ``getNumericValue()`` and ``getStringValue()`` can be used +to determine their numeric value and string value, respectively. Note that these predicates are not +defined for expressions whose value cannot be determined at compile time. Also note that the result +type of ``getNumericValue()`` is the QL type ``float``. If an expression has a numeric value that +cannot be represented as a QL ``float``, this predicate is also not defined. In such cases, you can +use ``getExactValue()`` to obtain a string representation of the value of the constant. + +- ``Ident``: an identifier; use ``getName()`` to access its name +- ``SelectorExpr``: a selector of the form ``base.sel``; use ``getBase()`` to access the part before + the dot, and ``getSelector()`` for the identifier after the dot +- ``BasicLit``: a literal of a basic type; subclasses ``IntLit``, ``FloatLit``, ``ImagLit``, + ``RuneLit``, and ``StringLit`` represent various specific kinds of literals +- ``FuncLit``: a function literal; use ``getBody()`` to access the body of the function +- ``CompositeLit``: a composite literal; use ``getKey(i)`` and ``getValue(i)`` to access the + ``i``\ th key and the ``i``\ th value, respectively +- ``ParenExpr``: a parenthesized expression; use ``getExpr()`` to access the expression between the + parentheses +- ``IndexExpr``: an index expression ``base[idx]``; use ``getBase()`` and ``getIndex()`` to access + ``base`` and ``idx``, respectively +- ``SliceExpr``: a slice expression ``base[lo:hi:max]``; use ``getBase()``, ``getLow()``, + ``getHigh()``, and ``getMax()`` to access ``base``, ``lo``, ``hi``, and ``max``, respectively; + note that ``lo``, ``hi``, and ``max`` can be omitted, in which case the corresponding predicates are not defined +- ``ConversionExpr``: a conversion expression ``T(e)``; use ``getTypeExpr()`` and ``getOperand()`` + to access ``T`` and ``e``, respectively +- ``TypeAssertExpr``: a type assertion ``e.(T)``; use ``getExpr()`` and ``getTypeExpr()`` to access + ``e`` and ``T``, respectively +- ``CallExpr``: a call expression ``callee(arg0, ..., argn)``; use ``getCalleeExpr()`` to access + ``callee``, and ``getArg(i)`` to access the ``i``\ th argument +- ``StarExpr``: a star expression, which may be either a pointer-type expression or a + pointer-dereference expression, depending on context; use ``getBase()`` to access the operand of + the star +- ``TypeExpr``: an expression that denotes a type +- ``OperatorExpr``: an expression with a unary or binary operator; use ``getOperator()`` to access + the operator + + - ``UnaryExpr``: an expression with a unary operator; use ``getAnOperand()`` to access the operand + of the operator + - ``BinaryExpr``: an expression with a binary operator; use ``getLeftOperand()`` and + ``getRightOperand()`` to access the left and the right operand, respectively + + - ``ComparisonExpr``: a binary expression that performs a comparison, including both equality + tests and relational comparisons + + - ``EqualityTestExpr``: an equality test, that is, either ``==`` or ``!=``; the predicate + ``getPolarity()`` has result ``true`` for the former and ``false`` for the latter + - ``RelationalComparisonExpr``: a relational comparison; use ``getLesserOperand()`` and + ``getGreaterOperand()`` to access the lesser and greater operand of the comparison, + respectively; ``isStrict()`` holds if this is a strict comparison using ``<`` or ``>``, + as opposed to ``<=`` or ``>=`` + +Names +~~~~~ + +While ``Ident`` and ``SelectorExpr`` are very useful classes, they are often too general: ``Ident`` +covers all identifiers in a program, including both identifiers appearing in a declaration as well +as references, and does not distinguish between names referring to packages, types, variables, +constants, functions or statement labels. Similarly, a ``SelectorExpr`` might refer to a package, a +type, a function, or a method. + +Class ``Name`` and its subclasses provide a more fine-grained mapping of this space, organized along +the two axes of structure and namespace. In terms of structure, a name can be a ``SimpleName``, +meaning that it is a simple identifier (and hence an ``Ident``), or it can be a ``QualifiedName``, +meaning that it is a qualified identifier (and hence a ``SelectorExpr``). In terms of namespacing, a +``Name`` can be a ``PackageName``, ``TypeName``, ``ValueName``, or ``LabelName``. A ``ValueName``, +in turn, can be either a ``ConstantName``, a ``VariableName``, or a ``FunctionName``, depending on +what sort of entity the name refers to. + +A related abstraction is provided by class ``ReferenceExpr``: a reference expression is an +expression that refers to a variable, a constant, a function, a field, or an element of an array or +a slice. Use predicates ``isLvalue()`` and ``isRvalue()`` to determine whether a reference +expression appears in a syntactic context where it is assigned to or read from, respectively. + +Finally, ``ValueExpr`` generalizes ``ReferenceExpr`` to include all other kinds of expressions that +can be evaluated to a value (as opposed to expressions that refer to a package, a type or a +statement label). + +Functions +~~~~~~~~~ + +At the syntactic level, functions appear in two forms: in function declarations (represented by +class ``FuncDecl``) and as function literals (represented by class ``FuncLit``). Since it is often +convenient to reason about functions of either kind, these two classes share a common superclass +``FuncDef``, which defines a few useful member predicates: + + - ``getBody()`` provides access to the function body + - ``getName()`` gets the function name; it is undefined for function literals, which do not have a + name + - ``getParameter(i)`` gets the ``i``\ th parameter of the function + - ``getResultVar(i)`` gets the ``i``\ th result variable of the function; if there is only + one result, ``getResultVar()`` can be used to access it + - ``getACall()`` gets a data-flow node (see below) representing a call to this function + +Entities and name binding +------------------------- + +Not all elements of a code base can be represented as AST nodes. For example, functions defined in +the standard library or in a dependency do not have a source-level definition within the source code +of the program itself, and built-in functions like ``len`` do not have a definition at all. Hence +functions cannot simplify be identified with their definition, and similarly for variables, types, +and so on. + +To smooth over this difference and provide a unified view of functions no matter where they are +defined, the Go library introduces the concept of an `entity`. An entity is a named program element, +that is, a package, a type, a constant, a variable, a field, a function, or a label. All entities +belong to class ``Entity``, which defines a few useful predicates: + + - ``getName()`` gets the name of the entity + - ``hasQualifiedName(pkg, n)`` holds if this entity is declared it package ``pkg`` and has name + ``n``; this predicate is only defined for types, functions, and package-level variables and + constants (but not for methods or local variables) + - ``getDeclaration()`` connects an entity to its declaring identifier, if any + - ``getAReference()`` gets a ``Name`` that refers to this entity + +Conversely, class ``Name`` defines a predicate ``getTarget()`` that gets the entity to which the +name refers. + +Class ``Entity`` has several subclasses representing specific kinds of entities: ``PackageEntity`` +for packages; ``TypeEntity`` for types; ``ValueEntity`` for constants (``Constant``), variables +(``Variable``), and functions (``Function``); and ``Label`` for statement labels. + +Class ``Variable``, in turn, has a few subclasses representing specific kinds of variables: a +``LocalVariable`` is a variable declared in a local scope, that is, not at package level; +``ReceiverVariable``, ``Parameter`` and ``ResultVariable`` describe receivers, parameters and +results, respectively, and define a predicate ``getFunction()`` to access the corresponding +function. Finally, class ``Field`` represents struct fields, and provides a member predicate +``hasQualifiedName(pkg, tp, f)`` that holds if this field has name ``f`` and belongs to type ``tp`` +in package ``pkg``. (Note that due to embedding the same field can belong to multiple types.) + +Class ``Function`` has a subclass ``Method`` representing methods (including both interface methods +and methods defined on a named type). Similar to ``Field``, ``Method`` provides a member predicate +``hasQualifiedName(pkg, tp, m)`` that holds if this method has name ``m`` and belongs to type ``t`` +in package ``pkg``. Predicate ``implements(m2)`` holds if this method implements method ``m2``, that +is, it has the same name and signature as ``m2`` and it belongs to a type that implements the +interface to which ``m2`` belongs. For any function, ``getACall()`` provides access to call sites +that may call this function, possibly through virtual dispatch. + +Finally, module ``Builtin`` provides a convenient way of looking up the entities corresponding to +built-in functions and types. For example, ``Builtin::len()`` is the entity representing the +built-in function ``len``, ``Builtin::bool()`` is the ``bool`` type, and ``Builtin::null()`` is the +value ``nil``. + +Type information +---------------- + +Types are represented by class ``Type`` and its subclasses, such as ``BoolType`` for the built-in +type ``bool``; ``NumericType`` for the various numeric types including ``IntType``, ``Uint8Type``, +``Float64Type`` and others; ``StringType`` for the type ``string``; ``NamedType``, ``ArrayType``, +``SliceType``, ``StructType``, ``InterfaceType``, ``PointerType``, ``MapType``, ``ChanType`` for +named types, arrays, slices, structs, interfaces, pointers, maps, and channels, respectively. +Finally, ``SignatureType`` represents function types. + +Note that the type ``BoolType`` is distinct from the entity ``Builtin::bool()``: the latter views +``bool`` as a declared entity, the former as a type. You can, however, map from types to their +corresponding entity (if any) using the predicate ``getEntity()``. + +Class ``Expr`` and class ``Entity`` both define a predicate ``getType()`` to determine the type of +an expression or entity. If the type of an expression or entity cannot be determined (for example +because some dependency could not be found during extraction), it will be associated with an invalid +type of class ``InvalidType``. + +Control flow +------------ + +Most CodeQL query writers will rarely use the control-flow representation of a program directly, but +it is nevertheless useful to understand how it works. + +Unlike the abstract syntax tree, which views the program as a hierarchy of AST nodes, the +control-flow graph views it as a collection of `control-flow nodes`, each representing a single +operation performed at runtime. These nodes are connected to each other by (directed) edges +representing the order in which operations are performed. + +For example, consider the following code snippet: + +.. code-block:: go + + x := 0 + if p != nil { + x = p.f + } + return x + +In the AST, this is represented as an ``IfStmt`` and a ``ReturnStmt``, with the former having an +``NeqExpr`` and a ``BlockStmt`` as its children, and so on. This provides a very detailed picture of +the syntactic structure of the code, but it does not immediately help us reasoning about the order +in which the various operations such as the comparison and the assignment are performed. + +In the CFG, there are nodes corresponding to ``x := 0``, ``p != nil``, ``x = p.f``, and ``return +x``, as well as a few others. The edges between these nodes model the possible execution orders of +these statements and expressions, and look as follows (simplified somewhat for presentational +purposes): + +|cfg| + +For example, the edge from ``p != nil`` to ``x = p.f`` models the case where the comparison +evaluates to ``true`` and the "then" branch is evaluated, while the edge from ``p != nil`` to +``return x`` models the case where the comparison evaluates to ``false`` and the "then" branch is +skipped. + +Note, in particular, that a CFG node can have multiple outgoing edges (like from ``x == nil``) as +well as multiple incoming edges (like into ``return x``) to represent control-flow branching at +runtime. + +Also note that only AST nodes that perform some kind of operation on values have a corresponding CFG +node. This includes expressions (such as the comparison ``p != nil``), assignment statements (such +as ``x = p.f``) and return statements (such as ``return x``), but not statements that serve a purely +syntactic purpose (such as block statements) and statements whose semantics is already reflected by +the CFG edges (such as ``if`` statements). + +It is important to point out that the control-flow graph provided by the CodeQL libraries for Go +only models `local` control flow, that is, flow within a single function. Flow from function calls +to the function they invoke, for example, is not represented by control-flow edges. + +In CodeQL, control-flow nodes are represented by class ``ControlFlow::Node``, and the edges between +nodes are captured by the member predicates ``getASuccessor()`` and ``getAPredecessor()`` of +``ControlFlow::Node``. In addition to control-flow nodes representing runtime operations, each +function also has a synthetic entry node and an exit node, representing the start and end of an +execution of the function, respectively. These exist to ensure that the control-flow graph +corresponding to a function has a unique entry node and a unique exit node, which is required for +many standard control-flow analysis algorithms. + +Data flow +--------- + +At the data-flow level, the program is thought of as a collection of `data-flow nodes`. These nodes +are connected to each other by (directed) edges representing the way data flows through the program +at runtime. + +For example, there are data-flow nodes corresponding to expressions and other data-flow nodes +corresponding to variables (`SSA variables +`__, to be precise). Here is the +data-flow graph corresponding to the code snippet shown above, ignoring SSA conversion for +simplicity: + +|dfg| + +Note that unlike in the control-flow graph, the assignments ``x := 0`` and ``x = p.f`` are not +represented as nodes. Instead, they are expressed as edges between the node representing the +right-hand side of the assignment and the node representing the variable on the left-hand side. For +any subsequent uses of that variable, there is a data-flow edge from the variable to that use, so by +following the edges in the data-flow graph we can trace the flow of values through variables at +runtime. + +It is important to point out that the data-flow graph provided by the CodeQL libraries for Go only +models `local` flow, that is, flow within a single function. Flow from arguments in a function call +to the corresponding function parameters, for example, is not represented by data-flow edges. + +In CodeQL, data-flow nodes are represented by class ``DataFlow::Node``, and the edges between nodes +are captured by the predicate ``DataFlow::localFlowStep``. The predicate ``DataFlow::localFlow`` +generalizes this from a single flow step to zero or more flow steps. + +Most expressions have a corresponding data-flow node (exceptions include type expressions, statement +labels and other expressions that do not have a value). To map from the AST node of an expression to +the corresponding DFG node, use ``DataFlow::exprNode``. Note that the AST node and the DFG node are +different entities and cannot be used interchangeably. + +There is also a predicate ``asExpr()`` on ``DataFlow::Node`` that allows you to recover the +expression underlying a DFG node. However, this predicate should be used with caution, since many +data-flow nodes do not correspond to an expression, and so this predicate will not be defined for +them. + +Similar to ``Expr``, ``DataFlow::Node`` has a member predicate ``getType()`` to determine the type +of a node, as well as predicates ``getNumericValue()``, ``getStringValue()``, and +``getExactValue()`` to retrieve the value of a node if it is constant. + +Important subclasses of ``DataFlow::Node`` include: + + - ``DataFlow::CallNode``: a function call or method call; use ``getArgument(i)`` and + ``getResult(i)`` to obtain the data-flow nodes corresponding to the ``i``\ th argument and the + ``i``\ th result of this call, respectively; if there is only a single result, ``getResult()`` + will return it + - ``DataFlow::ParameterNode``: a parameter of a function; use ``asParameter()`` to access the + corresponding AST node + - ``DataFlow::BinaryOperationNode``: an operation involving a binary operator; each ``BinaryExpr`` + has a corresponding ``BinaryOperationNode``, but there are also binary operations that are not + explicit at the AST level, such as those arising from compound assignments and increment/ + decrement statements; at the AST level, ``x + 1``, ``x += 1`` and ``x++`` are represented by + different kinds of AST nodes, while at the DFG level they are all modelled as a binary + operation node with operands ``x`` and ``1`` + - ``DataFlow::UnaryOperationNode``: analogous, but for unary operators + - ``DataFlow::PointerDereferenceNode``: a pointer dereference, either explicit in an expression of + the form ``*p``, or implicit in a field or method reference through a pointer + - ``DataFlow::AddressOperationNode``: analogous, but for taking the address of an entity + - ``DataFlow::RelationalComparisonNode``, ``DataFlow::EqualityTestNode``: data-flow nodes + corresponding to ``RelationalComparisonExpr`` and ``EqualityTestExpr`` AST nodes + +Finally, classes ``Read`` and ``Write`` represent, respectively, a read or a write of a variable, a +field, or an element of an array, a slice or a map. Use their member predicates ``readsVariable``, +``writesVariable``, ``readsField``, ``writesField``, ``readsElement`` and ``writesElement`` to +determine what the read/write refers to. + +Call graph +---------- + +The call graph connects function (and method) calls to the functions they invoke. Call graph +information is made available by two member predicates on ``DataFlow::CallNode``: ``getTarget()`` +returns the declared target of a call, while ``getACallee()`` returns all possible actual functions +a call may invoke at runtime. + +These two predicates differ in how they handle calls to interface methods: while ``getTarget()`` +will return the interface method itself, ``getACallee()`` will return all concrete methods that +implement the interface method. + +Global data flow and taint tracking +----------------------------------- + +The predicates ``DataFlow::localFlowStep`` and ``DataFlow::localFlow`` are useful for reasoning +about the flow of values in a single function. However, more advanced use cases, particularly in +security analysis, will invariably require reasoning about global data flow, including flow into, +out of, and across function calls, and through fields. + +In CodeQL, such reasoning is expressed in terms of `data-flow configurations`. A data-flow +configuration has three ingredients: sources, sinks, and barriers (also called sanitizers), all of +which are sets of data-flow nodes. Given these three sets, CodeQL provides a general mechanism for +finding paths from a source to a sink, possibly going into and out of functions and fields, but +never flowing through a barrier. + +To define a data-flow configuration, you can define a subclass of ``DataFlow::Configuration``, +overriding the member predicates ``isSource``, ``isSink``, and ``isBarrier`` to define the sets of +sources, sinks and barriers. + +Going beyond pure data flow, many security analysis need to perform more general `taint tracking`, +which also considers flow through value-transforming operations such as string operations. To track +taint, you can define a subclass of ``TaintTracking::Configuration``, which works similar to +data-flow configurations. + +A detailed exposition of global data flow and taint tracking is out of scope for this brief +introduction. See `Introduction to data flow analysis with CodeQL +`__ for a general overview of data flow +and taint tracking. + +Advanced libraries +------------------ + +Finally, we briefly describe a few concepts and libraries that are useful for advanced query +writers. + +Basic blocks and dominance +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Many important control-flow analyses organize control-flow nodes into `basic blocks +`__, which are maximal straight-line sequences of +control-flow nodes without any branching. In the CodeQL libraries, basic blocks are represented by +class ``BasicBlock``. Each control-flow node belongs to a basic block. You can use the predicate +``getBasicBlock()`` in class ``ControlFlow::Node`` and the predicate ``getNode(i)`` in +``BasicBlock`` to move from one to the other. + +Dominance is a standard concept in control-flow analysis: a basic block ``dom`` is said to +`dominate` a basic block ``bb`` if any path through the control-flow graph from the entry node to +the first node of ``bb`` must pass through ``dom``. In other words, whenever program execution +reaches the beginning of ``bb``, it must have come through ``dom``. Each basic block is moreover +considered to dominate itself. + +Dually, a basic block ``postdom`` is said to `post-dominate` a basic block ``bb`` if any path +through the control-flow graph from the last node of ``bb`` to the exit node must pass through +``postdom``. In other words, after program execution leaves ``bb``, it must eventually reach +``postdom``. + +These two concepts are captured by two member predicates ``dominates`` an ``postDominates`` of class +``BasicBlock``. + +Condition guard nodes +~~~~~~~~~~~~~~~~~~~~~ + +A condition guard node is a synthetic control-flow node that records the fact that at some point in +the control-flow graph the truth value of a condition is known. For example, consider again the code snippet we saw above: + +.. code-block:: go + + x := 0 + if p != nil { + x = p.f + } + return x + +At the beginning of the "then" branch ``p`` is known not be ``nil``. This knowledge is encoded in +the control-flow graph by a condition guard node preceding the assignment to ``x``, recording the +fact that ``p != nil`` is ``true`` at this point: + +|cfg2| + +A typical use of this information would be in an analyis that looks for ``nil`` dereferences: such +an analysis would be able to conclude that the field read ``p.f`` is safe because it is immediately +preceded by a condition guard node guaranteeing that ``p`` is not ``nil``. + +In CodeQL, condition guard nodes are represented by class ``ControlFlow::ConditionGuardNode`` which +offers a variety of member predicates to reason about which conditions a guard node guarantees. + +Static single-assignment form +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`Static single-assignment form `__ (SSA +form for short) is a program representation in which the original program variables are mapped onto +more fine-grained `SSA variables`. Each SSA variable has exactly one definition, so program +variables with multiple assignments correspond to multiple SSA variables. + +Most of the time query authors do not have to deal with SSA form directly. The data-flow graph uses +it under the hood, and so most of the benefits derived from SSA can be gained by simply using the +data-flow graph. + +For example, the data-flow graph for our running example actually looks more like this: + +|ssa| + +Note that the program variable ``x`` has been mapped onto three distinct SSA variables ``x1``, +``x2`` and ``x3``. In this case there is not much benefit to such a representation, but in general +SSA form has well-known advantages for data-flow analysis for which we refer to the literature. + +If you do need to work with raw SSA variables, they are represented by the class ``SsaVariable``. +Class ``SsaDefinition`` represents definitions of SSA variables, which have a one-to-one +correspondence with ``SsaVariable``\ s. Member predicates ``getDefinition()`` and ``getVariable()`` +exist to map from one to the other. You can use member predicate ``getAUse()`` of ``SsaVariable`` to +look for uses of an SSA variable. To access the program variable underlying an SSA variable, use +member predicate ``getSourceVariable()``. + +Global value numbering +~~~~~~~~~~~~~~~~~~~~~~ + +`Global value numbering `__ is a technique for +determining when two computations in a program are guaranteed to yield the same result. This is done +by associating with each data-flow node an abstract representation of its value (conventionally +called a `value number`, even though in practice it is not usually a number) such that identical +computations are represented by identical value numbers. + +Since this is an undecidable problem, global value numbering is `conservative` in the sense that if +two data-flow nodes have the same value number they are guaranteed to have the same value at +runtime, but not conversely. (That is, there may be data-flow nodes that do, in fact, always +evaluate to the same value, but their value numbers are different.) + +In the CodeQL libraries for Go, you can use the ``globalValueNumber(nd)`` predicate to compute the +global value number for a data-flow node ``nd``. Value numbers are represented as an opaque QL type +``GVN`` that provides very little information. Usually, all you need to do with global value numbers +is to compare them to each other to determine whether two data-flow nodes have the same value. + +What next? +---------- + +- Find out more about QL in the `QL language handbook `__ and `QL language specification `__. +- Learn more about the query console in `Using the query console `__. + +.. |ast| image:: ast.png +.. |cfg| image:: cfg.png +.. |dfg| image:: dfg.png +.. |cfg2| image:: cfg2.png +.. |ssa| image:: ssa.png diff --git a/ql/docs/learn-ql/ssa.dot b/ql/docs/learn-ql/ssa.dot new file mode 100644 index 00000000000..f33579ad51d --- /dev/null +++ b/ql/docs/learn-ql/ssa.dot @@ -0,0 +1,14 @@ +digraph ssa { + rankdir=LR; + + "x1" [shape=diamond,label=1>]; + "x2" [shape=diamond,label=2>]; + "x3" [shape=diamond,label=3>]; + "return x" [label=x>]; + + "0" -> "x1"; + "p.f" -> "x2"; + "x1" -> "x3"; + "x2" -> "x3"; + "x3" -> "return x"; +} diff --git a/ql/docs/learn-ql/ssa.png b/ql/docs/learn-ql/ssa.png new file mode 100644 index 0000000000000000000000000000000000000000..a29bbe4633b87960ef94bb42a2510df70ff3c099 GIT binary patch literal 16781 zcmcJ%2RPUL|3CUkyJ!fBP{;}i$*v@__ueV8cbU-=3Rxv1$=(sN8}`Z`sR-GGP!u_j z_xJqH`2GL?>s;qL*LB?Yb>Bjt&-?v;Jzvk~W4#2bD$7#rq1!_uktpOYORJMeTL$s@ z-CaBIUzRmbWBhN&6$M#o(kAiGi^{YJ66qL8PWpnTd)(Yt58X(u{&NfSEqt>x0e2e4 z_mEi!MW=uBe?k_%H>D~uO4R<6#i#3^Lc7%q6lZM!C1j9lDAnq8_cZngZl6z9Ukc<>;tzZtE++5>6HzTL#9 zsXS&3r>gnLtJ4q8xF5k6WP%Gz_APKcQ}loNl9`H{IBa9 z{QQrfJqw)a%S$RLq2+&;-B{nz({sP5=*-chN574XkXc$2~z4H-& z!q{amqj{hSa-vw~F4F-F5QhNnKst^Q@G&+a{_T8g}XH>!)XCO4-@*SX*1G>gxxs zuX|HbQ5`#b_VD3T#?lrRY`jKg_sYsd3mt|S@j)x;EnF8&zth0LKCef(;#_HHp6F%=%$6OYEJWHvU@?wMC-I}xg`CGky|G0GP zmSowDxgfJ@f3wN(~v?{rU3kD8++pOuYG*NY2xCr4@@p7K_*vf>P^y+U^W-@kvFhKAYx$>i01Tzx-7 zbl4))u3zUUvgr$X6dY_d)tREHuKx0oBbUo~%MrS>_D2`p#p(D=NgKb1d<|u-i$a*r zp@@`|^YT>Qzkjc3VltH7H$U_?!Pd^Mv8CnFhYue#Bg0WZcKW@G&qZAPzkK;}nS-j+ zGQlTxk>N+g$LA6X)&3MLk_jq!gT#UY{#=$KIxQ_N*09T$j~!@lPrS%^^5jfPsN4LY z#2#{TR{WrOeMm}N+|d(k*RZj&p3b4}HhT@iAYo&7;ve0*bFU8;@7}he5DUTg{rTqkX4N~gb@R#4m<;QOj~+Dp`)kh8$?5&t(uC7w`|*4C z@4xTwkDj^yZE5Ym!&;(8in>nvUAVhrcr^5!%(ZJL`Z{p&j7wkiTb-Po7M7MSDk_q* zDaWOMG^DE?8e(Esjyvz^=^1-u@!S;ldGr|@nvkO+cRZHH&BmId`1ts~iE1YW>z8_MI7cEk{Sw=d*$QUv(pr3768a~5e&Hl9c zAigkI>6Mh8zAGamL-*~i%DNk6q<5o>e0BqZS1l}FqN&h|II~)`Jr52F+LN1fn!H;4 zuciz3>CdI5eCr-AxABh478Vw((^+}1@E|Z99?l3`M_>dHcUZmuT+RC0k`s0?IW3>x zjIL5|zPaq|U?sipzcuz7a|7FDWo2i-mOq`*C9f`Y3cgX{TzYh-H>dhbsf(GpdD0KX z)&jgLw{Zn6i_9axv^4fykM?HPog%Z)!?`PrQ2*Ccpa8kZzCn#%d{Jb;t*^?(S8-G@8itcj~ zJ7{1ahS))(qA@eVxDkoq!|m>y8^0UBel_}P7Sr0%5r*m4-82onwsSClGdN>^9l;WCt}YhRa)&Ha2RiH2 zo1t4Q_#j*O!1IUnI4LPf-bHfiv%}jI`>$mgMXi<|1*1O8Y*c%&SYZG{m4APfQ_<7^ z)%`j}+`7-*HQYeNlP5H#<>g()cAvXDEi@R;-HP-4H7kevp*niBrTFMoS{W_M!skb~ zoNf7K+m{NL!yLBj5W8~C+~+q=-`;Iee8#^W zfJ+vQrzgCxr-vFnGD|z>L)*E{_3lx8wfeA$_ig&K_NL$7-R>`OVkx^hpZmo2$B!Sv zUcb1tvvqH$C_KG_uHRqb@mgJ_6b+l?{zr4^$Jg@ReghUiL`6kABTnOK?k1I%l}Y|C z`es@~PfdM^?Dn^3EJ|*J_oRju-uCwPKKU_Nnbn&Rj{(>i!5$GG&#*Gx^AJdlIy7F` z=}xNRGbuFFmn9{_(>+;-S7twHrueQm#{lJh`^Af6wdOnbGuDi^#&!T#t*)+`VjmIRf6v~%Jx@;Y z@KE5P1U!6r5vYao&>@pgMa|^Z*K^ZE2mLi#Ff!G=qIUrIkVq)rS|9#rkFtbAOI;>H znpCRaM4mrJN@#mfTr7l9a)6%xVR$&D?NAkiv9a;OuU|5ro}z3j&mUpWFiA>EmiYWF zmKTT@_n@3;OLzb@CG&{(HeP9@e7>q06}p9_@RV1}(3<3jHuvJ36QB}nO?LbI7^ZC3FY%tm8}owP0co^n;_G9rr>m|`nW~bI z`*Z9HCnu--Tv6XEt1dPmd^90FyS}I+{#HqJVq4~Z{7}Yj)|!@^v$QIy`wLjtg~psw zQWAaV?p-DWx1$FrVNxWytUyO^`?i4 z;&sfLwuqhkB7@+g{C$&X330^$-9A|~S+T3VN`QCUxWE59mr_(*oFa)sLLz>KLt0wUx|>5EgMpfgiet>( zvh8_FmCs+UC*6)(yw0^j)Le7Be$RcD6%rEaPQ17?C?G&pPYmcQ_AhY!CA7>+a^5>jwy9rFpoU zwD$LJ7y3Zt4O@S+Xg2GLt5-3ozD-R9y3O=vtZUx9c5Tdjvq$rd!%!WT>a@$aVs27; zq$rnOH;qAr_u!WSPu^^3l&wEZVi8$XQrQ2Tg!`^8}D@oMV`SX4!Q~TS^e_7$h zk;9e02U#!!QbOJd#%pq=0M7FB@x8$NbY*CyY4&P6IyxrJ1pl7>)b(JMc zH6ek?ZEhfn1ipAg>ACo`moHy-S3Q4b7A=&ssL@K{?c>w<>C>~!tgIgD%Pbpz=ijm( z*mWKI)lhc0W@V<&swUuIa!Sf2%E0eYtKuM$c=X4@E=wDgxhA6OIT_1uZHV5#e?KfV zbpO=k(!hE`7ZZ5}7 z6A=|fz2z9DG`>N_z@P*=ZLRo`Pm%udI~LD>A6n1-TivRWrd&J!b~EJWpoeVHMCF-B zhP*@%0HX=PmdHqnzMIdEPu|)I{z1J4QxcdiTVF&y2N#g69MIK8Q-hZajUcGr! z4~ocV`p(ayQWDMU!9E5lL&KwZoqa||M&yj*v}iR1$IQ;j(OTW7e~S6T?X5fcZ2Mo; z?@8gaQ*d)T0|cN3b{rE!_oe*i{&&@)`+m<4>4@hg-eC@{znhW4xxBIhqHStn(My-v zc%tgn=ypF9$+c}5Edrnd55Q+LS)yg4&pI$-5c=QUx&K3T_1zg^x)W?{JC?>Z_aF3h6_=;^fAFWaNy?gt2V43>OnxcY$$!$Y-#%uFuBGS}UGc_y;T z%KMyMT$}(0zJLGzqNGH(<5O`Yt^&w7J3HId+Wp#9!URjR@Q9*J~ajom9=iH!MMEtd=+d0*m4!{smECP zbyXFkO<(RMRn-Fk0f9UQ#V<_W-ja7nOHJK@lD&vk0kye{N{fz-HD6sA#;x7P1_0cO z9Q=``$oteBm}Yh4;VDxan}^@Nnc5Ck90465(0*^WUiB@DymTlSal%eymLKEZgZ6|y ze;$I7exCQ~#bXCvfSJB}{rWCOuC1-Dsg>34u*=K+t?%BE{Qdn&jM{?&LP9$h7Ums1 zJW5~Y{QT*xsjbZ=(?s#6qCy-`i9>V^5)jD`vx`t^W@jH6S9%g-18Ao^xlR8{#Nqbd zo}LbfA#$>^4{mL4+@y~C)k|JfR3zv&t=ZYzYyUbTBjzM8ZwN@8Gz|?6)uBU4#W&jG z#blv!B&VgN{kp@1#YsbN`1$iEGZ-$xWg$dpI6A%>=##X0iKo}GFkDT2=qIBQ#Q|&_ z22s}+Xi}ZIM&-haje=T`Y;p|Vgbd#LYgbTIbb^F#(189x{8_)sTLeJb#C5ERx@gY! zcQVRB6wv09j7%q{Wn+E)gW1_xs-6u{VJpzXLc7mGO>J!xtfQNr|GsCkH(uq}FL68$ zfdObUZo^M&3j(|~nQ`OSHCS69L9+qON%=GpQBDw8TCEr5oijGXQCPhL#T%xKIHR!#w- z220L2USWfnX06;Lt^y`V+yfdvHA4S{>1bx3iTIU+k1qTmZ0EM14TAX`)UKDqiNCO zSfIW&H8gw^{dn@Eh{&@tw;35wWGWh()a6l>YIsr-3(@Eh&n!#_$4-wYb3U3*RB_M&TiSp9;G2q0|=$48Dz+) zCx8TqWh6n$O2z8tvQ+*AMWBx5tymk61tH=|VTfp(=mL9)bXIh0`1sL&#m1kBM?e&- zSmrvV{@U0VPrY6!yP>gBO-()ZG$!dwQ1l3_61w=$<>ln|_I4o`nvtfclZD=E&iG&^ zU3G9!8M^hC2TeR9v+?P?dm!V#4>@|T{mCgPG7R3>Qyn?dsAsk@&c(~i7AP$RnvUI+ z+%cnWq6Grh{n}EcHg)eQF;OK*N@8N=I=3{t>H5f-Ko#(zzrGnAz;WWleeAi0nwooP zllrw!DV0taQ$nUTh2ID5Sw)gV^&U%5?Zx=@Ab*X znK};-4=%+_W58ME1W6@`X@c$xrX!2)*tcN2##EG)oiEi)l$3&-*m)$%qQ28RR9rag zFsS**NkUwF63+|L)zV|2ehIH%swhV)%TSQwGe5#9`Z6;!uVV^yzi}`jI}h&D7MHg` z8QHZc)X>!Q^7o)uC}5BrD`m%>?Ry1BJguNtU^|56<(=BSjSLD}GN$BntTV(!i@0;X z&;R_MR{^?Jin)E1o?and)Qwp|L1CcOB`rqXIW0XsfSH-OVQ44;wYG~SA|etd&72q+ z8ELU$hCa(m5;U(PkMgbyJt`uF#;;>ouT$F~$iox-=hs|wY^3j#lb20yt)0O2 z$lJX=j{%xi>Giu4I~=!0ycmWgnu2R=%(YB8sAb!C?u-Zt*|##)_26Ti$Wpfp*hk~g zkjd%KMLhPVszydia&mH1w6y8bYS#Al%9t`#2M=Bt8yjo$*^p)OktVzCS6En>j*c1m zI>e>KQiLI_RU~B_vSh_1!iG?v#7SG=G#}^UooA8m5k#y)f z$yr&SJ3W*#r`+j*-$fzF@#wxfpZ~lGrC3o}Y1Nad6&W3!9@+IkJtGn@^)ghrLQHK8 zR~FP6;5bnx`sFv~%)Ki3zo0+91n!b7suO?=($d=6I5_xxAES7KlYHyqWQSgf7 zQX79eTU)AfF)J&pu=B@W;DaV!`B7*nyN!)a!K+s<0s;b_RK!~-sHmiE*}CJgDhF$z z^oJ_pv(-$#>la`_V7y(Sz=7(3Hq1Dtsb3KDw#Z1d6a+M<{!P8OD}vLQ#`gT*+_ z_MiSfF|n0|$?v&5xdo-t-``J=DZbOEZ({)fZ4#4`?n2n=?(0i>`I3x)KAKz*@(6wo zDQPF}b9wgDA^es5(4N32^n9*SV1E*tpZD6>Qy?%|P+CXmeBP_W4|GeNPmq(7mxQE; z$;-<-t}d9>)YcxClw<@Yne0s2>+S9RZDwXK!1eOn=ieE9XguT$qEu>XYOe|ktew43 z`>V6B+o*aPr7m6+`BYz$xbOFe`+GZ56b{>dD%fssZ*SeUn3D=3)$?3KX^ z4=7(nFXgGaoZr}g{qX3Bz~h*hAdK0T=Mv>2ryTSfFKdB@T>$+=Q8>*FoI$r|K6PsU zrAwDed^aV*&einv0%3&E($PtAPj+!f{F~wg2hLY0>2FzT}djy9gIXT%B8bUy5XnoX49l|)u&@)V7%gUs}|W@yR-Qz+?oZ(cVG0@Eoj z`#?3#yWF7;7^A7HyV{w@bo$CRh;}xbb~6Caj~_hP*>_qP*DM3cE$M{96Y&{NTW9L( z!V~CE-FYT&h17!77*cqmh5>8{`U%bn@K}6Uo6V~mEoL_f!j{zi-LVtkLf>a+6|owi zr!D)>trMEPE5>*oqXlf&!tI%Z-rpdF6Ji3{d2kz;TT%~cc$n$w=?AKO%GEzxhseH3 z*BrOl*F?a*TJ=1Cn*~DWjE;^zY%e6>`_Fs&Yx$c_0U$GZW#!cEdubk5R!X4vcfhJ5 zKo>f2dRbYFcAl}4fJMs-Trnu>(~&et= zym!+eX;Tf{Ps_DJW$<^!FSxW)U^v_Ssy2QZ0L{{%Vh@rCQQc(Kxa5yv$Pod5HpS@n z{)^e8*P?r;J1EA%#|Yz$5++6$)aPhKE;chojx!YsKlBDRrWQ>|$o5t5>f| zZ`ra1_(9saG!FfI7YUT)^0iNZYr9BMPo8l75cBx?UEpQ9uLX zyVgWiR5&v|y(dumj#ifT@I->I{jvzuqg~|WHGmSPSFYS~s9M{xxpZzb>8I`g?ujMI zhJx4#wC9;siTAa&+oz_ctgYrd{xV&&us|~4B^$#V&IE;Puk-USU;rhB=7&5r z(|_jgNx(*k$w>pEMxzt9_s<5o=r40SNdjluj_qXKtg5blXLik2GkP5r`LAjgcv(lpz85MO2mK+PDH4?}1m|)e#EhyD@SAih zJ9wQR<)I6ru>x^9{{i$>864tiOEyItBJ?DEkr( z7V?Ak^y%j2W@?2DKypra;2HHgsQ|2Wh^uV;Y(AyJljISGdkBMcV>eJJcWKJlE-ETY zQ(ynjmsqY}WME^W5Ls9BW@+bCxfljYw8)SO*>b66N4nY#G#+YVfW8>rJ zS693uucA_qM&byvz-?G^p!w-3oi*+@OA)7$ZA1hmPSQu8v))EmUdzDXAsFaB@C%J5 zr!zh53Ep==mFGMzt$ohMa5~1!JW|@G2TNJ~9LvPV_`6wICkf1=7$caGpT=51bdf+t z2~VK4nbNj{d+xU*CX}Cl8jwp>OY1)H7y!f-kdSDxo4N7=&W|f^5xvuh3^T=0*5ewGB@2j>jEoF)wOg6i zs#_CP1MtX(VPf7(OPkOLHPF*DYkMvc5E%F#!notYw+o0?n8C}=ytP;9#%LWyK<$;I zlHRn0zzqCF+PZaXuDMf4+XM?YH#xvqH2<|dU@Z%1+2=MR*}It09tqhRBkq;Y-(RVH zM|D=t-mXIv@4%3~j%<)1#AZ7FtGnE0`@^=8U3je=h3JzyXja4L&#_Rl?1rl1k#`ex z&S6{C-I*DN=(CkR^2F)uCLybdrg2($_Ti-kluM39=0B^sKX-wQ4A z+_`gHoSatb^q6`?J0d~8FiE+@8-vHKM%WH?bm0#l?uAhp-X$Jmi|s(5P*4)&e?Gd! zX-}cE5lR{1U*IOrOr%WfDIzLGRIe-Xv`qgdJ5&B1NZOfI1h40-yASZLwjgsQEh}3+I9Mg};Iiga zz;8r&kcKjZugOg6F0#>y0o@{27Eyqd@#ilo2^ALG;SGlZzzKjk-thbAXj1Xe3Gf@JbAzRmHkf`G~65fvg>{&ubq&s&@oI%`Obxx1=B|;-m80m@X zS5<8nI9XRyR~HVS3mZc%W&5`?YS6B0@g-euZEv$86neg{BGe*HHMPYL=5U?WI~H&K zY-E?uX^D9J`239y=eI1EE6Ml%&@naG+e`6GX>I639hg*&rgghPOBfW{2e9?&)s zfq8`|+W|BiyK$rvu`NAaT~#TmJMuq~U*ocHf&>vOf6hw_a@~as7r>#d8Xg~aUHf@0 zh4F0;bWb9w_qeoF1cG{(j)_lCrf**4@XxVkL7zXawa=0;Y%U)0k!cn)M(0ROOzegX zPS_0qBi8GjAJE0xOPod_@OSua**XaXF)FH_<%X~t4fXgC6vNl41+>6sZTbY6nG62)KXb(3JM{B0$L*@($_|NeiD zREFBu3b{_If}MI!nL~F~QCql$v}{{NaYiEoBSd(V=zQ=Yw)sJ+m%^%pb0vpM%}p;% zPP$^NoRSdraix;5XrYa2*XTC@L~=D~jfyfb`O?<=Y}aqq z8|drHg8{HXCMDGVGkup4ro0H%maw?-m0?&m85I@l`Ooq)SI5^UFAum)+AnwrU}$t|zDySv-r(OWe| za$dcD{W6KrvWS3`nz#4*$;~4lo12qB`Bf2IK;a)C5s_dYXq=HTF`2plvOO3aV6=*e ziA4klD`i#ia^V?c8Hnlh<4dV6%{2jZdwh?A*frA9_nJOqmnI=N;Vd~?^nWV#CTh7I zjg5hrr76kD*VoexsnLe7Lj@otDdsT2vhNU!o)DhmlP6CKT_%+Gsq>#wM*!@>ekQ_j z@%giS96}Ue2;uDEE(_gew1HrKGiTFN)6>&mASI=WwL`o>Z}FP0fkCW41-%TiQ7^$A zcz1*<&AY!YC}@DDL^MU@D73F}e4HDsj0Ie|-kB`N8YN#ElGO1$&L=xWPJ)8&za?A8 z?5bu528vV7y0&BL|A&hWa&mKPW}oc2XRWK)MNLD~2@P`!<{Uc`sGWU%>?EQFal`8y z8&k;0;SxFI<>V4!)I|9n&&|k4%+BWi1Fzo-glieja>ScAXWf2$(aTR(hDm}+Wd%aL zj119PE4k-EXL6jiU$(;81c@;+TvmP-!>1u64 zDL|tE03BtOm66$D(Gq zLz2MU+X8#(9>5T+Ga#8ekZP?5hURMy->5)pn^y4p0l=5A@bFGHp(pmQz|$*MdJPCi zeF18a3xljV;{T?A+x@RC_gl2a+$YEjlR3jSK;}%a;m|LolFV zHePUYS~O>{#3%<*q>lYYI*(8N9>f-`XZg=Zvb+TLps=iDqZ>ja;$6Fcu zg7;FG9Dr*}m`bitWMmTh^!s}G$x-`0!EbVN_n}|W3OgPnGCE=h`uJdIAl38EYrgWq ze*)>UIdsayNKF6VGAX27^D~5FjY@a`JM0Q#46FbC&O3pg|CcL*oj~#f8D)SRN~BSd zoM^PW4h5&&GQryTjXeX_Jzp|z{%zJ$CKn2oV>hsn0fw4`Gd{wKDW8< z5*x$O!1t)`x_3=%bo6Bs%pQg54aS84m=_V1m6ao9)>!pVpFel~S(y=OMkNv<3A)#& zhSXj*sVOOHm}0`G6cf3y1FzcIDG><@28LF*qyA+vM{&ffEf38Pv zyJbH54ORqB8_2gN&2Ju}rrwSX4B8`kV>93&3qimUVQ~y^{`hep*k(1vLSeit=-euV zj{~%{yU@)aF-p)OR*5!yz1InIuLIhn?LgsfA_s$@AS}1U!nnh{hVP)?VyE+gFJNnr zpdCKQ$>D(v8P%(-ff;)Y{0yZ~;yktoqBAn;xw-*ueB?>$DmQA0gAZu%JNF&^_U+-j zi%^74kRlTjHv2cwtl3CJ`XnU$pi+WlJb<*Y&88Z~iO+QQFi62`K_%z}EXcuQRS}dE zFxi~cw#^*;e-S0Nv;KLsnlH}Xv&IX-f&&QZ9_?PI{`cukN+u>uur_4v?Rhbt{2_=ZLABtr$rC9BSwKs>g8@OrS^;7}k_=_dX;Y&* zJ%5HEY(hptz$5J!9|c|0eo4LXyx}28q1J8PFQAf_xJ>NBK?>pK_HQ2X7cb^?BRBzV zm?CUd1Zp}brS zhi4vApVT(RAsyl_Ag*M0Yy3d!k@Q@$r^4&EJ=wddmaqO_?a{xP%0Y4yNRPqyWE%s} zKybQ7{6^5ztXNeJ@2NgW6`4NaG5;+yoYmn5&9!!$AEE#E+EVpv9q%yqHEN1j{iQ|m??NQAw7fBLqu8bb}8X@eg5Rhj+-}c5*-U?3IYQI z<-d*vn9=SaJ)d@`S3W&d>LNR5Mu+_IyY6l(Lbfsg%>)qwcNHz_#wFXx_|LFJoMMQI z>^2GMZ+w|J;9+aa4WLklUUuy#i2Hc5Fp^AQ`pXT z)oQ=twGlzw+Nwt&;7Ik?qesEtZPhDAIG8x-5m&UyjmyNpkS%E?JOznBAGCnkFQtdj zp;dxIloS6k+xeKD>^A}K4}sd`84hoC`5?3Qc8DtZ*2GI9gHmxh1dvJp|nNijg zwbwQS2O7xE<1rh`9%p{3mL$`Ga*rz3!RaE)42PjAoFZ$pD!r_AvjR240#9zbJ#i~K zM|w5`qPH@FRdQ0Gpm3P{q5O@uo*mNseaz5Y2@dqrQzmtUU+P8`Wz~Odcyr_J=1$~H z;n!c9GZ;gp%&^K^Z>l*E{O6VX;+1<39#rE{4*->I5>D`S^W=Aghas|h8~Fmg&OBn_`pCB6uu8Eg|@x;_2$qp@&tFl z@R9$?=@fGKQgR!{(-smmZNv-*N6aygu0VQmpNPM?Fdpl`EFf?QvZnUK&}KgJr2;yM zo-d|fN}Q0osw2#wtgI}YT^d7w!Cu@|>@f6kN}Vm2aI=8{h?8HE8_OErFzM(vJ&rM> ztBgdbNZv*e3tD2rfa_fxTiqJiHs=md+W~E>0;exl(YAVyD4L7AFOUGgE+W0h06Bu-GrGb5l~mZrB>9NYiXJfC@&hyO%g1ReKTD%gJ48Y6 zwzsPiM$IaQQV+GfIl8xEf+Pbr2y!UbU&r$@K+c0KGNy=ewhrD=jY5Uu zay!azIv`Ln0@dOY`1XwJ5&sTurDuODOy84rc61OyzqSI{7oV5V0iWan@gtM@zd8EEK zAYkE>Wx{cB@uPr#V&dZBB_YX9AQTwITR<}^a2Ce>@7xiXYhaJItka8IBt00@L^f#V9a~> z?hOhIR5K`tqR)adM?!D3@Y~L6K1BgRyPCb?hC`+1_4`^9&M^@gXRrZkuc~4iBAEik z@F4QN(D{lQkF=bsuCLz-9S7a88lnS*iHQmFZW-B?2qF`ef#bz@al8;A(f-sOI6o+A zoLWBkKcpJ}3BCLO7HfPDa3Q6{v?w_Zrv45YbwsX$k$5!&xk9)`>(@=PB4{r=kU$@v zpWhEE9fxFBJ`-P;Hx{WDsX-!!+!A|sKe*8aV8e%@20%;2>7 z7x|FdB~GH_j2n@@QWL{oL7YSi%oye?G$<-O+Y7u;tG|9_APy1X)PkvlLtfn3y21to zB=`_hNKQ>1fht{FaIN_Tf@H|p5=DUrPmEVsQzaoyC^g%*A=V3@04j)s-$x}psfa*0 zI5z1=Jj)UM>Hsd{_X6PLdLl+UWXXFFO>jb#M0j(PljngAajO8?=W!?z8l5Aa&-d~1 zmpHNsDp2CN!UfhsoZEqgeFe(N!tyfw5_Yut?v-EB7Ql=BugtbqAt%-U`EwF>rLgPd z0m8|HE*svXV*zTY?oj_X8K;$y_hdn5huL%y2hLFogrD>G_dL$@(!f+q&&ndw{D^HK zUukM<`v^k!`_4{EoSSiUb-nlcwE&p8ZpJ$u#cE|KA{+oxy@P_T#*G!fY(Q(Ic=Q_W zH#0li49z__otv9P{3e2dr8nEJ(z@X^Vs_Ux+SFFl|LHdrkZK$m?qDF84FoK0G8yVU XEc)A0n~dMDK$5$pES)Q5dgp%wOHoO; literal 0 HcmV?d00001 From f60b5daf9487cce6319808166b2220fe30354610 Mon Sep 17 00:00:00 2001 From: Max Schaefer <54907921+max-schaefer@users.noreply.github.com> Date: Mon, 17 Feb 2020 08:48:16 +0000 Subject: [PATCH 4/7] Apply suggestions from code review Co-Authored-By: Shati Patel <42641846+shati-patel@users.noreply.github.com> Co-Authored-By: Sauyon Lee --- ql/docs/learn-ql/introduce-libraries.rst | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ql/docs/learn-ql/introduce-libraries.rst b/ql/docs/learn-ql/introduce-libraries.rst index fa24eb72916..9b1b16d4568 100644 --- a/ql/docs/learn-ql/introduce-libraries.rst +++ b/ql/docs/learn-ql/introduce-libraries.rst @@ -124,7 +124,7 @@ Statements - ``LoopStmt``: a loop; use ``getBody()`` to access its body - ``ForStmt``: a ``for`` statement; use ``getInit()``, ``getCond()``, and ``getPost()`` to access - the init statement, loop condition and post statement, respectively, all of which are optional + the init statement, loop condition, and post statement, respectively, all of which are optional - ``RangeStmt``: a ``range`` statement; use ``getDomain()`` to access the iteration domain, and ``getKey()`` and ``getValue()`` to access the expressions to which successive keys and values @@ -227,7 +227,7 @@ Names While ``Ident`` and ``SelectorExpr`` are very useful classes, they are often too general: ``Ident`` covers all identifiers in a program, including both identifiers appearing in a declaration as well as references, and does not distinguish between names referring to packages, types, variables, -constants, functions or statement labels. Similarly, a ``SelectorExpr`` might refer to a package, a +constants, functions, or statement labels. Similarly, a ``SelectorExpr`` might refer to a package, a type, a function, or a method. Class ``Name`` and its subclasses provide a more fine-grained mapping of this space, organized along @@ -244,7 +244,7 @@ a slice. Use predicates ``isLvalue()`` and ``isRvalue()`` to determine whether a expression appears in a syntactic context where it is assigned to or read from, respectively. Finally, ``ValueExpr`` generalizes ``ReferenceExpr`` to include all other kinds of expressions that -can be evaluated to a value (as opposed to expressions that refer to a package, a type or a +can be evaluated to a value (as opposed to expressions that refer to a package, a type, or a statement label). Functions @@ -278,7 +278,7 @@ that is, a package, a type, a constant, a variable, a field, a function, or a la belong to class ``Entity``, which defines a few useful predicates: - ``getName()`` gets the name of the entity - - ``hasQualifiedName(pkg, n)`` holds if this entity is declared it package ``pkg`` and has name + - ``hasQualifiedName(pkg, n)`` holds if this entity is declared in package ``pkg`` and has name ``n``; this predicate is only defined for types, functions, and package-level variables and constants (but not for methods or local variables) - ``getDeclaration()`` connects an entity to its declaring identifier, if any @@ -301,7 +301,7 @@ in package ``pkg``. (Note that due to embedding the same field can belong to mul Class ``Function`` has a subclass ``Method`` representing methods (including both interface methods and methods defined on a named type). Similar to ``Field``, ``Method`` provides a member predicate -``hasQualifiedName(pkg, tp, m)`` that holds if this method has name ``m`` and belongs to type ``t`` +``hasQualifiedName(pkg, tp, m)`` that holds if this method has name ``m`` and belongs to type ``tp`` in package ``pkg``. Predicate ``implements(m2)`` holds if this method implements method ``m2``, that is, it has the same name and signature as ``m2`` and it belongs to a type that implements the interface to which ``m2`` belongs. For any function, ``getACall()`` provides access to call sites @@ -309,7 +309,7 @@ that may call this function, possibly through virtual dispatch. Finally, module ``Builtin`` provides a convenient way of looking up the entities corresponding to built-in functions and types. For example, ``Builtin::len()`` is the entity representing the -built-in function ``len``, ``Builtin::bool()`` is the ``bool`` type, and ``Builtin::null()`` is the +built-in function ``len``, ``Builtin::bool()`` is the ``bool`` type, and ``Builtin::nil()`` is the value ``nil``. Type information @@ -354,7 +354,7 @@ For example, consider the following code snippet: In the AST, this is represented as an ``IfStmt`` and a ``ReturnStmt``, with the former having an ``NeqExpr`` and a ``BlockStmt`` as its children, and so on. This provides a very detailed picture of -the syntactic structure of the code, but it does not immediately help us reasoning about the order +the syntactic structure of the code, but it does not immediately help us reason about the order in which the various operations such as the comparison and the assignment are performed. In the CFG, there are nodes corresponding to ``x := 0``, ``p != nil``, ``x = p.f``, and ``return @@ -369,7 +369,7 @@ evaluates to ``true`` and the "then" branch is evaluated, while the edge from `` ``return x`` models the case where the comparison evaluates to ``false`` and the "then" branch is skipped. -Note, in particular, that a CFG node can have multiple outgoing edges (like from ``x == nil``) as +Note, in particular, that a CFG node can have multiple outgoing edges (like from ``p != nil``) as well as multiple incoming edges (like into ``return x``) to represent control-flow branching at runtime. @@ -422,7 +422,7 @@ are captured by the predicate ``DataFlow::localFlowStep``. The predicate ``DataF generalizes this from a single flow step to zero or more flow steps. Most expressions have a corresponding data-flow node (exceptions include type expressions, statement -labels and other expressions that do not have a value). To map from the AST node of an expression to +labels, and other expressions that do not have a value). To map from the AST node of an expression to the corresponding DFG node, use ``DataFlow::exprNode``. Note that the AST node and the DFG node are different entities and cannot be used interchangeably. @@ -446,8 +446,8 @@ Important subclasses of ``DataFlow::Node`` include: - ``DataFlow::BinaryOperationNode``: an operation involving a binary operator; each ``BinaryExpr`` has a corresponding ``BinaryOperationNode``, but there are also binary operations that are not explicit at the AST level, such as those arising from compound assignments and increment/ - decrement statements; at the AST level, ``x + 1``, ``x += 1`` and ``x++`` are represented by - different kinds of AST nodes, while at the DFG level they are all modelled as a binary + decrement statements; at the AST level, ``x + 1``, ``x += 1``, and ``x++`` are represented by + different kinds of AST nodes, while at the DFG level they are all modeled as a binary operation node with operands ``x`` and ``1`` - ``DataFlow::UnaryOperationNode``: analogous, but for unary operators - ``DataFlow::PointerDereferenceNode``: a pointer dereference, either explicit in an expression of @@ -458,7 +458,7 @@ Important subclasses of ``DataFlow::Node`` include: Finally, classes ``Read`` and ``Write`` represent, respectively, a read or a write of a variable, a field, or an element of an array, a slice or a map. Use their member predicates ``readsVariable``, -``writesVariable``, ``readsField``, ``writesField``, ``readsElement`` and ``writesElement`` to +``writesVariable``, ``readsField``, ``writesField``, ``readsElement``, and ``writesElement`` to determine what the read/write refers to. Call graph @@ -489,9 +489,9 @@ never flowing through a barrier. To define a data-flow configuration, you can define a subclass of ``DataFlow::Configuration``, overriding the member predicates ``isSource``, ``isSink``, and ``isBarrier`` to define the sets of -sources, sinks and barriers. +sources, sinks, and barriers. -Going beyond pure data flow, many security analysis need to perform more general `taint tracking`, +Going beyond pure data flow, many security analyses need to perform more general `taint tracking`, which also considers flow through value-transforming operations such as string operations. To track taint, you can define a subclass of ``TaintTracking::Configuration``, which works similar to data-flow configurations. @@ -528,7 +528,7 @@ through the control-flow graph from the last node of ``bb`` to the exit node mus ``postdom``. In other words, after program execution leaves ``bb``, it must eventually reach ``postdom``. -These two concepts are captured by two member predicates ``dominates`` an ``postDominates`` of class +These two concepts are captured by two member predicates ``dominates`` and ``postDominates`` of class ``BasicBlock``. Condition guard nodes @@ -575,7 +575,7 @@ For example, the data-flow graph for our running example actually looks more lik |ssa| Note that the program variable ``x`` has been mapped onto three distinct SSA variables ``x1``, -``x2`` and ``x3``. In this case there is not much benefit to such a representation, but in general +``x2``, and ``x3``. In this case there is not much benefit to such a representation, but in general SSA form has well-known advantages for data-flow analysis for which we refer to the literature. If you do need to work with raw SSA variables, they are represented by the class ``SsaVariable``. From ec9ba8aa7ff3462de1752473545de49fedae9d99 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Mon, 17 Feb 2020 09:13:49 +0000 Subject: [PATCH 5/7] Address review comments. --- ql/docs/learn-ql/ast.dot | 13 ++++--- ql/docs/learn-ql/ast.png | Bin 11863 -> 46453 bytes ql/docs/learn-ql/cfg.dot | 1 + ql/docs/learn-ql/cfg.png | Bin 14157 -> 45148 bytes ql/docs/learn-ql/cfg2.dot | 1 + ql/docs/learn-ql/cfg2.png | Bin 19764 -> 65430 bytes ql/docs/learn-ql/dfg.dot | 1 + ql/docs/learn-ql/dfg.png | Bin 10774 -> 34931 bytes ql/docs/learn-ql/introduce-libraries.rst | 36 ++++++++++-------- ql/docs/learn-ql/ssa.dot | 1 + ql/docs/learn-ql/ssa.png | Bin 16781 -> 68479 bytes .../ConstantLengthComparison.ql | 2 +- .../InconsistentLoopOrientation.ql | 2 +- ql/src/semmle/go/Expr.qll | 4 +- ql/src/semmle/go/Stmt.qll | 4 +- .../go/controlflow/ControlFlowGraphImpl.qll | 6 +-- ql/src/semmle/go/controlflow/IR.qll | 4 +- .../go/dataflow/internal/DataFlowUtil.qll | 2 +- 18 files changed, 44 insertions(+), 33 deletions(-) diff --git a/ql/docs/learn-ql/ast.dot b/ql/docs/learn-ql/ast.dot index eca1e0c4e7b..fbf32b744ed 100644 --- a/ql/docs/learn-ql/ast.dot +++ b/ql/docs/learn-ql/ast.dot @@ -1,19 +1,20 @@ digraph ast { + graph [dpi=300]; "x" [shape=rect]; "y" [shape=rect]; - "z" [shape=rect]; "x + y" [shape=rect]; "(x + y)" [shape=rect]; + "z" [shape=rect]; "(x + y) * z" [shape=rect]; invis1 [style=invis]; invis2 [style=invis]; invis3 [style=invis]; - "(x + y) * z" -> "(x + y)" [label=0]; - "(x + y) * z" -> "z" [label=1]; - "(x + y)" -> "x + y" [label=0]; - "x + y" -> "x" [label=0]; - "x + y" -> "y" [label=1]; + "(x + y) * z" -> "(x + y)" [label=" 0"]; + "(x + y) * z" -> "z" [label=" 1"]; + "(x + y)" -> "x + y" [label=" 0"]; + "x + y" -> "x" [label=" 0"]; + "x + y" -> "y" [label=" 1"]; "z" -> invis1 [style=invis]; invis1 -> invis2 [style=invis]; diff --git a/ql/docs/learn-ql/ast.png b/ql/docs/learn-ql/ast.png index 46098b6f0d51a99f7d5828b1d06c2dbc8a301a41..61a9f29b80afb4b58546da8bfecd05c30618acb1 100644 GIT binary patch literal 46453 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 YmVF=oWZ&SHa;q_;CYVKiG5g#91ArCH3jhEB literal 11863 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 KbiTatgZ~3et%#KX diff --git a/ql/docs/learn-ql/cfg.dot b/ql/docs/learn-ql/cfg.dot index 1d4114467f0..47db3df4c57 100644 --- a/ql/docs/learn-ql/cfg.dot +++ b/ql/docs/learn-ql/cfg.dot @@ -1,4 +1,5 @@ digraph cfg { + graph [dpi=300]; rankdir=LR; "x := 0" -> "p != nil"; "p != nil" -> "x = p.f"; diff --git a/ql/docs/learn-ql/cfg.png b/ql/docs/learn-ql/cfg.png index 87c5187344fe580587a2173e06bbf31e13a242a2..1290dadb870ce59bc45f045da78a8efb4e515ee8 100644 GIT binary patch literal 45148 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%0DlcdV3EZG^n<)ob-{r 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 diff --git a/ql/docs/learn-ql/cfg2.dot b/ql/docs/learn-ql/cfg2.dot index 525eddb774e..b8dcd71ee25 100644 --- a/ql/docs/learn-ql/cfg2.dot +++ b/ql/docs/learn-ql/cfg2.dot @@ -1,4 +1,5 @@ digraph cfg2 { + graph [dpi=300]; rankdir=LR; "p != nil is true" [shape=box]; diff --git a/ql/docs/learn-ql/cfg2.png b/ql/docs/learn-ql/cfg2.png index adff43adf978b12f7dcc1d4653a5292a2b916496..617fe4fe4dc32fa26d5c3cb0423228070621c128 100644 GIT binary patch literal 65430 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Ν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 W_WqEgx=Z*BvkXl2&rO>j_&)$=qd1WO literal 19764 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�iU21>Ywo zl#GnnCnqNf=Quc+3LKy4(15Z;M84HFu=!gC5|E_ZII}2eXu5!O6c7ZkR1}0y{m-UH zb)%V6|HrJw$Sj+3JZq->STbbX#`plPxeXe-U-&_q}cd)etZo8cGP2jYzuUo7#v23%#dKA zy^`QCK@ry=7ZMX|^PV+Y=i7I89qsh!*|RBj-3KKk>|8#JXV<|2wtbcejtgtV@LQ@R z?i;{)z_cYLG;d06zwn0~{8h3{>f5((h%YqmT8m>u;(B6gN|F)xlajLa^pDWIyl?x> z2w@cetH+CQb&t3#WmSk@=-R8Tp8E(;6Dc%XtqUNBqk>2#Mm#O(UiXdxV#%PiWTod7 z6x?1hLll8(wtVq5Xewd|xhbRIWoeHe*WVvERWJL_mhkU7_RMh~p?dp^vYI|VYu6JV zOG`)`#Y~DjkGd!Fub};fu%Is5+Z%d55Ss1k#rsPi>~tSYhww0P1UrE*W9XHY)ja!6 z3jSXh0{RDE-X9BLJwR23ZveQ-oe*5Rl7@ENE_OfI$2|Ur`~s*ZrKyd`%uijqN73S zK=ujcQ2vZZcSj;41x74I-iqffWQ1#FbtY_0XYMD9w9rX!4CvY|%6RwILyxBUKVsEu zcC8wce`H5*tZi6~P9K>%Gu7`gGHRRm`n@xh#ZRxjdb9faA<^w67!5PCKU!|M1EXVW z%!y~lRjkaN0bTFkTP;S)AUgN{@B`@eFngnL{)q3;*bzyERXv7FZfAdaOWuc1a{-T*AKLx=o4!$c`F5tT|T?p{$hy<5g>uakyx5L`}5!19HM>@8p`$vcQ z5zps*?b`8^CmYSJ$6WOkGgbmN$ul#Hp2*9~LlRvH(m6ym;aIG7#M+sM_NW8ce zfx)bk+fB?BG+^A}cE*)(K>DQC#`k>~g6M7dC(+rFYi0yv;oY^XcG64e`Qf9u++nDW zcrqA`VF?!x4?7}m)&2cvNKAwT6c-mq1iW9Am(!BIKx$(93)g`8ROV^9_O>=Qk_b15 zUs+#jZf-7#x7Z|ad2uFrH-fjMTJYq|t4PPQld>X3gTy^&u4P&E=9voP0?MQLzCL5H z9m_%RT!T?5aa}if2aqLyVq>Uqrq!tUU>s8Sx7YJkGW?5O;#LP@d;zxa4qapX} znEGv4&(uoAUdY1C+!_N2%_k>kl0@YS2{2oKFA@GHT&Nqb&%a}VvP|l8fc^%%nZ=X|JWWzb4mY7=$ z8`TQHQRANBMgxhY;JfZ9VVJJdx6q{SpdmJx()8g2E11VduS?cmP%K=pBcvn{!?ZVV zcyN_WX36cxCs~MRJ26i>>`OSfx#ML%KX;#=oV3ScC9VqZmXo`lRdz~h{NMY@R(<_= z{;B7Cu5H@{ePnh-63^<gsu*KKsqH(Ko{jA2(4nNHRC?Hn z$ccNM^)^&?`pj*)}j%XSg>G7#4x%p5jG< z(m~O3{NMHJZ(Lq}v9JQpgs?^p_=RX4!i3dBLp+g@ktAD1YHkw3O6xCrkj@~Xhf|TF0cEU z?>zVI>({i>QZ~X{^uu4qRl`$ibNcu)A>Z1?-@h%Lotf~k2q;t|YLb5Xi8I{0yRrzl zFx!`y?AQm1zoevu+L)?U1z5Dm4zPUML=4o2g z4ZJZqIW7~@G9^kOH1x!=|5i8N*G@4k)Haalw4I#WIXH+>oRpkQM#6mqf33%E&W5VH zuEiU*VX|~al)rePl-sSG+bt)zjsFk(2&)HrJU{<-OEPUdhw3f?k>N1n^=*QP*JEam zi74cfn&6RZ-*zg zUiAO>2sQ$NZ~f4qjz2!CN*Ak4!^fFINjwMhnGm=C*OSHgl2+?GPvZ08mEG6rT%LwJ VCO1}$!q=dYPO53CK2x>`_&*e6%-H|{ diff --git a/ql/docs/learn-ql/dfg.dot b/ql/docs/learn-ql/dfg.dot index 7a59581117e..82253c9b133 100644 --- a/ql/docs/learn-ql/dfg.dot +++ b/ql/docs/learn-ql/dfg.dot @@ -1,4 +1,5 @@ digraph dfg { + graph [dpi=300]; rankdir=LR; "x" [shape=diamond]; diff --git a/ql/docs/learn-ql/dfg.png b/ql/docs/learn-ql/dfg.png index d6c585c5e6c120672c38ac66f85d780da068e43d..6727af7b4ac3bbd021e58b3153e4bfc7da6c434e 100644 GIT binary patch literal 34931 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 diff --git a/ql/docs/learn-ql/introduce-libraries.rst b/ql/docs/learn-ql/introduce-libraries.rst index 9b1b16d4568..c92f6f66c2f 100644 --- a/ql/docs/learn-ql/introduce-libraries.rst +++ b/ql/docs/learn-ql/introduce-libraries.rst @@ -35,6 +35,9 @@ about which function may be invoked by a given call (taking virtual dispatch thr account), as well as control-flow information about the order in which different operations may be executed at runtime. +As a rule of thumb, you normally want to use the AST only for superficial syntactic queries. Any +analysis involving deeper semantic properties of the program should be done on the DFG. + The rest of this tutorial briefly summarizes the most important classes and predicates provided by this library, including references to the `detailed API documentation `__ where applicable. We start by giving an overview of the AST @@ -114,7 +117,7 @@ Statements - ``CompoundAssignStmt``: an assignment statement with a compound operator, such as ``lhs += rhs`` - ``IncStmt``, ``DecStmt``: an increment statement or a decrement statement, respectively; use - ``getExpr()`` to access the expression being incremented or decremented + ``getOperand()`` to access the expression being incremented or decremented - ``BlockStmt``: a block of statements between curly braces; use ``getStmt(i)`` to access the ``i``\ th statement in a block - ``IfStmt``: an ``if`` statement; use ``getInit()``, ``getCond()``, ``getThen()``, and @@ -136,6 +139,8 @@ Statements deferred - ``SendStmt``: a send statement; use ``getChannel()`` and ``getValue()`` to access the channel and the value being sent over the channel, respectively +- ``RecvStmt``: a receive statement in a ``select`` statement; use ``getExpr()`` to access the + receiver expression, and ``getLhs(i)`` to access the ``i``\ th left-hand side - ``ReturnStmt``: a ``return`` statement; use ``getExpr(i)`` to access the ``i``\ th returned expression; if there is only a single returned expression you can use ``getExpr()`` instead - ``BranchStmt``: a statement that interrupts structured control flow; use ``getLabel()`` to get the @@ -152,7 +157,7 @@ Statements - ``SwitchStmt``: a ``switch`` statement; use ``getInit()`` to access the (optional) init statement, and ``getCase(i)`` to access the ``i``\ th ``case`` or ``default`` clause - - ``ExprSwitchStmt``: a ``switch`` statement examining the value of an expression + - ``ExpressionSwitchStmt``: a ``switch`` statement examining the value of an expression - ``TypeSwitchStmt``: a ``switch`` statement examining the type of an expression - ``CaseClause``: a ``case`` or ``default`` clause in a ``switch`` statement; use ``getExpr(i)`` to @@ -421,10 +426,10 @@ In CodeQL, data-flow nodes are represented by class ``DataFlow::Node``, and the are captured by the predicate ``DataFlow::localFlowStep``. The predicate ``DataFlow::localFlow`` generalizes this from a single flow step to zero or more flow steps. -Most expressions have a corresponding data-flow node (exceptions include type expressions, statement -labels, and other expressions that do not have a value). To map from the AST node of an expression to -the corresponding DFG node, use ``DataFlow::exprNode``. Note that the AST node and the DFG node are -different entities and cannot be used interchangeably. +Most expressions have a corresponding data-flow node; exceptions include type expressions, statement +labels and other expressions that do not have a value, as well as short-circuiting operators. To map +from the AST node of an expression to the corresponding DFG node, use ``DataFlow::exprNode``. Note +that the AST node and the DFG node are different entities and cannot be used interchangeably. There is also a predicate ``asExpr()`` on ``DataFlow::Node`` that allows you to recover the expression underlying a DFG node. However, this predicate should be used with caution, since many @@ -445,16 +450,17 @@ Important subclasses of ``DataFlow::Node`` include: corresponding AST node - ``DataFlow::BinaryOperationNode``: an operation involving a binary operator; each ``BinaryExpr`` has a corresponding ``BinaryOperationNode``, but there are also binary operations that are not - explicit at the AST level, such as those arising from compound assignments and increment/ - decrement statements; at the AST level, ``x + 1``, ``x += 1``, and ``x++`` are represented by - different kinds of AST nodes, while at the DFG level they are all modeled as a binary - operation node with operands ``x`` and ``1`` + explicit at the AST level, such as those arising from compound assignments and + increment/decrement statements; at the AST level, ``x + 1``, ``x += 1``, and ``x++`` are + represented by different kinds of AST nodes, while at the DFG level they are all modeled as a + binary operation node with operands ``x`` and ``1`` - ``DataFlow::UnaryOperationNode``: analogous, but for unary operators - - ``DataFlow::PointerDereferenceNode``: a pointer dereference, either explicit in an expression of - the form ``*p``, or implicit in a field or method reference through a pointer - - ``DataFlow::AddressOperationNode``: analogous, but for taking the address of an entity - - ``DataFlow::RelationalComparisonNode``, ``DataFlow::EqualityTestNode``: data-flow nodes - corresponding to ``RelationalComparisonExpr`` and ``EqualityTestExpr`` AST nodes + + - ``DataFlow::PointerDereferenceNode``: a pointer dereference, either explicit in an expression + of the form ``*p``, or implicit in a field or method reference through a pointer + - ``DataFlow::AddressOperationNode``: analogous, but for taking the address of an entity + - ``DataFlow::RelationalComparisonNode``, ``DataFlow::EqualityTestNode``: data-flow nodes + corresponding to ``RelationalComparisonExpr`` and ``EqualityTestExpr`` AST nodes Finally, classes ``Read`` and ``Write`` represent, respectively, a read or a write of a variable, a field, or an element of an array, a slice or a map. Use their member predicates ``readsVariable``, diff --git a/ql/docs/learn-ql/ssa.dot b/ql/docs/learn-ql/ssa.dot index f33579ad51d..c8bfb8c62a0 100644 --- a/ql/docs/learn-ql/ssa.dot +++ b/ql/docs/learn-ql/ssa.dot @@ -1,4 +1,5 @@ digraph ssa { + graph [dpi=300]; rankdir=LR; "x1" [shape=diamond,label=1>]; diff --git a/ql/docs/learn-ql/ssa.png b/ql/docs/learn-ql/ssa.png index a29bbe4633b87960ef94bb42a2510df70ff3c099..cd5ba3f29de0c7a94c500544a285d5cd873400ce 100644 GIT binary patch literal 68479 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 literal 16781 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 XEc)A0n~dMDK$5$pES)Q5dgp%wOHoO; diff --git a/ql/src/InconsistentCode/ConstantLengthComparison.ql b/ql/src/InconsistentCode/ConstantLengthComparison.ql index bc4c9b0aa00..6058e287dec 100644 --- a/ql/src/InconsistentCode/ConstantLengthComparison.ql +++ b/ql/src/InconsistentCode/ConstantLengthComparison.ql @@ -16,7 +16,7 @@ from ControlFlow::ConditionGuardNode cond, DataFlow::CallNode lenA where // `i` is incremented in `fs` - fs.getPost().(IncStmt).getExpr() = i.getAReference() and + fs.getPost().(IncStmt).getOperand() = i.getAReference() and // `idx` reads `a[i]` idx.reads(a.getANode(), i.getARead()) and // `lenA` is `len(a)` diff --git a/ql/src/InconsistentCode/InconsistentLoopOrientation.ql b/ql/src/InconsistentCode/InconsistentLoopOrientation.ql index 7eea9dbbeab..fa5051ed5c7 100644 --- a/ql/src/InconsistentCode/InconsistentLoopOrientation.ql +++ b/ql/src/InconsistentCode/InconsistentLoopOrientation.ql @@ -36,7 +36,7 @@ predicate bounds(RelationalComparisonExpr test, Variable v, string direction) { * downward. */ predicate updates(IncDecStmt upd, Variable v, string direction) { - upd.getExpr() = v.getAReference() and + upd.getOperand() = v.getAReference() and ( upd instanceof IncStmt and direction = "upward" or diff --git a/ql/src/semmle/go/Expr.qll b/ql/src/semmle/go/Expr.qll index 2ccd8f8f565..fa8de1369d3 100644 --- a/ql/src/semmle/go/Expr.qll +++ b/ql/src/semmle/go/Expr.qll @@ -1253,7 +1253,7 @@ class ReferenceExpr extends Expr { predicate isLvalue() { this = any(Assignment assgn).getLhs(_) or - this = any(IncDecStmt ids).getExpr() + this = any(IncDecStmt ids).getOperand() or exists(RangeStmt rs | this = rs.getKey() or @@ -1271,7 +1271,7 @@ class ReferenceExpr extends Expr { or this = any(CompoundAssignStmt cmp).getLhs(_) or - this = any(IncDecStmt ids).getExpr() + this = any(IncDecStmt ids).getOperand() } } diff --git a/ql/src/semmle/go/Stmt.qll b/ql/src/semmle/go/Stmt.qll index a0d84869556..7a1a951c974 100644 --- a/ql/src/semmle/go/Stmt.qll +++ b/ql/src/semmle/go/Stmt.qll @@ -103,8 +103,8 @@ class SendStmt extends @sendstmt, Stmt { * An increment or decrement statement. */ class IncDecStmt extends @incdecstmt, Stmt { - /** Gets the expression. */ - Expr getExpr() { result = getChildExpr(0) } + /** Gets the expression being incremented or decremented. */ + Expr getOperand() { result = getChildExpr(0) } /** Gets the increment or decrement operator. */ string getOperator() { none() } diff --git a/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll b/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll index f02df29cc8a..d86f717dbc9 100644 --- a/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/ql/src/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -309,7 +309,7 @@ newtype TWriteTarget = ) ) or - exists(IncDecStmt ids | write = MkIncDecNode(ids) | lhs = ids.getExpr().stripParens()) + exists(IncDecStmt ids | write = MkIncDecNode(ids) | lhs = ids.getOperand().stripParens()) or exists(ParameterOrReceiver parm | write = MkParameterInit(parm) | lhs = parm.getDeclaration()) or @@ -1385,7 +1385,7 @@ module CFG { } private class IncDecTree extends ControlFlowTree, IncDecStmt { - override predicate firstNode(ControlFlow::Node first) { firstNode(getExpr(), first) } + override predicate firstNode(ControlFlow::Node first) { firstNode(getOperand(), first) } override predicate lastNode(ControlFlow::Node last, Completion cmpl) { ControlFlowTree.super.lastNode(last, cmpl) @@ -1395,7 +1395,7 @@ module CFG { } override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { - lastNode(getExpr(), pred, normalCompletion()) and + lastNode(getOperand(), pred, normalCompletion()) and succ = MkImplicitOne(this) or pred = MkImplicitOne(this) and diff --git a/ql/src/semmle/go/controlflow/IR.qll b/ql/src/semmle/go/controlflow/IR.qll index bca948f9f7d..b3c655b12b7 100644 --- a/ql/src/semmle/go/controlflow/IR.qll +++ b/ql/src/semmle/go/controlflow/IR.qll @@ -843,7 +843,7 @@ module IR { /** Gets the corresponding increment or decrement statement. */ IncDecStmt getStmt() { result = ids } - override Type getResultType() { result = ids.getExpr().getType() } + override Type getResultType() { result = ids.getOperand().getType() } override ControlFlow::Root getRoot() { result.isRootOf(ids) } @@ -867,7 +867,7 @@ module IR { /** Gets the corresponding increment or decrement statement. */ IncDecStmt getStmt() { result = ids } - override Type getResultType() { result = ids.getExpr().getType() } + override Type getResultType() { result = ids.getOperand().getType() } override ControlFlow::Root getRoot() { result.isRootOf(ids) } diff --git a/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll b/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll index 466a18d8b04..4bdf572789f 100644 --- a/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll +++ b/ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -536,7 +536,7 @@ class BinaryOperationNode extends Node { exists(IR::EvalIncDecRhsInstruction rhs, IncDecStmt ids | rhs = asInstruction() and ids = rhs.getStmt() | - left = exprNode(ids.getExpr()) and + left = exprNode(ids.getOperand()) and right = instructionNode(any(IR::EvalImplicitOneInstruction one | one.getStmt() = ids)) and op = ids.getOperator().charAt(0) ) From 31557e8c193b4bdaca438bff541b1b50e8b8519e Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Tue, 18 Feb 2020 08:20:53 +0000 Subject: [PATCH 6/7] Rename `ArrowExpr` to `RecvExpr` and address further review comments. --- ql/docs/learn-ql/introduce-libraries.rst | 4 +--- ql/src/semmle/go/Expr.qll | 4 ++-- ql/src/semmle/go/Stmt.qll | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ql/docs/learn-ql/introduce-libraries.rst b/ql/docs/learn-ql/introduce-libraries.rst index c92f6f66c2f..fb714fe0fe5 100644 --- a/ql/docs/learn-ql/introduce-libraries.rst +++ b/ql/docs/learn-ql/introduce-libraries.rst @@ -139,8 +139,6 @@ Statements deferred - ``SendStmt``: a send statement; use ``getChannel()`` and ``getValue()`` to access the channel and the value being sent over the channel, respectively -- ``RecvStmt``: a receive statement in a ``select`` statement; use ``getExpr()`` to access the - receiver expression, and ``getLhs(i)`` to access the ``i``\ th left-hand side - ``ReturnStmt``: a ``return`` statement; use ``getExpr(i)`` to access the ``i``\ th returned expression; if there is only a single returned expression you can use ``getExpr()`` instead - ``BranchStmt``: a statement that interrupts structured control flow; use ``getLabel()`` to get the @@ -170,7 +168,7 @@ Statements ``getStmt(i)`` to access the ``i``\ th statement in the body of this clause - ``RecvStmt``: a receive statement in a ``case`` clause of a ``select`` statement; use ``getLhs(i)`` to access the ``i``\ th left-hand side of this statement, and ``getExpr()`` to - access the underlying receive expression + access the underlying receive expression. Expressions ~~~~~~~~~~~ diff --git a/ql/src/semmle/go/Expr.qll b/ql/src/semmle/go/Expr.qll index fa8de1369d3..02ec6d9b8c4 100644 --- a/ql/src/semmle/go/Expr.qll +++ b/ql/src/semmle/go/Expr.qll @@ -742,9 +742,9 @@ class AddressExpr extends @addressexpr, UnaryExpr { } /** - * A unary arrow expression using `<-`. + * A unary receive expression using `<-`. */ -class ArrowExpr extends @arrowexpr, UnaryExpr { +class RecvExpr extends @arrowexpr, UnaryExpr { override predicate mayHaveOwnSideEffects() { any() } override string getOperator() { result = "<-" } diff --git a/ql/src/semmle/go/Stmt.qll b/ql/src/semmle/go/Stmt.qll index 7a1a951c974..a57373229c9 100644 --- a/ql/src/semmle/go/Stmt.qll +++ b/ql/src/semmle/go/Stmt.qll @@ -530,7 +530,7 @@ class RecvStmt extends Stmt { int getNumLhs() { result = count(getLhs(_)) } /** Gets the receive expression of this receive statement. */ - ArrowExpr getExpr() { + RecvExpr getExpr() { result = this.(ExprStmt).getExpr() or result = this.(Assignment).getRhs() } From 4b371ac85abb8a259de3fe23b0d280d71c71cbc1 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Wed, 19 Feb 2020 08:14:15 +0000 Subject: [PATCH 7/7] Remove rogue full stop. --- ql/docs/learn-ql/introduce-libraries.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/docs/learn-ql/introduce-libraries.rst b/ql/docs/learn-ql/introduce-libraries.rst index fb714fe0fe5..f13903b875b 100644 --- a/ql/docs/learn-ql/introduce-libraries.rst +++ b/ql/docs/learn-ql/introduce-libraries.rst @@ -168,7 +168,7 @@ Statements ``getStmt(i)`` to access the ``i``\ th statement in the body of this clause - ``RecvStmt``: a receive statement in a ``case`` clause of a ``select`` statement; use ``getLhs(i)`` to access the ``i``\ th left-hand side of this statement, and ``getExpr()`` to - access the underlying receive expression. + access the underlying receive expression Expressions ~~~~~~~~~~~