From dd4f297c379c4fd54a8da2169b5faa45e9423102 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Fri, 26 Feb 2021 17:51:04 +0100 Subject: [PATCH 1/3] Remove duplicate clause --- ql/src/codeql_ruby/controlflow/internal/Completion.qll | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ql/src/codeql_ruby/controlflow/internal/Completion.qll b/ql/src/codeql_ruby/controlflow/internal/Completion.qll index 0c918a56dc9..c1148d430e3 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Completion.qll +++ b/ql/src/codeql_ruby/controlflow/internal/Completion.qll @@ -175,18 +175,13 @@ private predicate inBooleanContext(AstNode n) { or n = any(NotExpr parent | inBooleanContext(parent)).getOperand() or - n = any(ParenthesizedExpr parent | inBooleanContext(parent)).getLastExpr() + n = any(StmtSequence parent | inBooleanContext(parent)).getLastExpr() or exists(CaseExpr c, WhenExpr w | not exists(c.getValue()) and c.getAWhenBranch() = w and w.getPattern(_) = n ) - or - exists(StmtSequence parent | - inBooleanContext(parent) and - n = parent.getLastExpr() - ) } /** From 5f32b822e202e4115c3a661b3f4d8ae4911c2555 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Fri, 26 Feb 2021 19:03:55 +0100 Subject: [PATCH 2/3] Remove use of AstNodes --- ql/src/codeql_ruby/controlflow/internal/Splitting.qll | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ql/src/codeql_ruby/controlflow/internal/Splitting.qll b/ql/src/codeql_ruby/controlflow/internal/Splitting.qll index d56e1771af8..c54cbc27b65 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Splitting.qll +++ b/ql/src/codeql_ruby/controlflow/internal/Splitting.qll @@ -3,7 +3,6 @@ */ private import codeql_ruby.AST -private import AstNodes private import Completion private import ControlFlowGraphImpl private import SuccessorTypes @@ -218,19 +217,19 @@ private module ConditionalCompletionSplitting { succ(pred, succ, c) and last(succ, _, completion) and ( - last(succ.(LogicalNotAstNode).getOperand(), pred, c) and + last(succ.(NotExpr).getOperand(), pred, c) and completion.(BooleanCompletion).getDual() = c or - last(succ.(LogicalAndAstNode).getAnOperand(), pred, c) and + last(succ.(LogicalAndExpr).getAnOperand(), pred, c) and completion = c or - last(succ.(LogicalOrAstNode).getAnOperand(), pred, c) and + last(succ.(LogicalOrExpr).getAnOperand(), pred, c) and completion = c or - last(succ.(ParenthesizedStatement).getChild(), pred, c) and + last(succ.(ParenthesizedExpr).getLastExpr(), pred, c) and completion = c or - last(succ.(IfElsifAstNode).getBranch(_), pred, c) and + last(succ.(ConditionalExpr).getBranch(_), pred, c) and completion = c ) } From b2fbeee7946773d46405ae70bb02ffbf3a6485e1 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Fri, 26 Feb 2021 19:04:33 +0100 Subject: [PATCH 3/3] CFG: hide all non-AstNodes --- .../internal/ControlFlowGraphImpl.qll | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll index dd1d30430b2..931f7020666 100644 --- a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -206,24 +206,9 @@ private predicate succImpl(AstNode pred, AstNode succ, Completion c) { } private predicate isHidden(ControlFlowTree t) { + not t instanceof ASTInternal::AstNode::Range + or t.isHidden() - or - t = any(Method m).getName() - or - t = any(Class m).getName() - or - t = any(Module m).getName() - or - t = any(ScopeResolution m).getName() - or - t = any(SingletonMethod m).getName() - or - t = any(Call c).getMethod() and - not t instanceof ScopeResolution - or - t instanceof RestAssignment - or - t instanceof Superclass } private predicate succImplIfHidden(AstNode pred, AstNode succ) {