From 8e09ef397aa9adbf0ce6963373dc0474a1dc7d4c Mon Sep 17 00:00:00 2001 From: Ricardo Costa Date: Thu, 13 Nov 2025 15:59:31 +0000 Subject: [PATCH 1/2] Prevent Index-Out-Of-Bounds in Function Call --- .../visitors/CreateASTVisitor.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java b/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java index 102c9e58..42626cb0 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java +++ b/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java @@ -14,6 +14,7 @@ import liquidjava.rj_language.ast.LiteralString; import liquidjava.rj_language.ast.UnaryExpression; import liquidjava.rj_language.ast.Var; +import liquidjava.rj_language.parsing.ParsingException; import liquidjava.utils.Utils; import org.antlr.v4.runtime.tree.ParseTree; @@ -63,7 +64,7 @@ public CreateASTVisitor(String prefix) { this.prefix = prefix; } - public Expression create(ParseTree rc) { + public Expression create(ParseTree rc) throws ParsingException { if (rc instanceof ProgContext) return progCreate((ProgContext) rc); else if (rc instanceof StartContext) @@ -84,20 +85,20 @@ else if (rc instanceof LiteralContext) return null; } - private Expression progCreate(ProgContext rc) { + private Expression progCreate(ProgContext rc) throws ParsingException { if (rc.start() != null) return create(rc.start()); return null; } - private Expression startCreate(ParseTree rc) { + private Expression startCreate(ParseTree rc) throws ParsingException { if (rc instanceof StartPredContext) return create(((StartPredContext) rc).pred()); // alias and ghost do not have evaluation return null; } - private Expression predCreate(ParseTree rc) { + private Expression predCreate(ParseTree rc) throws ParsingException { if (rc instanceof PredGroupContext) return new GroupExpression(create(((PredGroupContext) rc).pred())); else if (rc instanceof PredNegateContext) @@ -112,7 +113,7 @@ else if (rc instanceof IteContext) return create(((PredExpContext) rc).exp()); } - private Expression expCreate(ParseTree rc) { + private Expression expCreate(ParseTree rc) throws ParsingException { if (rc instanceof ExpGroupContext) return new GroupExpression(create(((ExpGroupContext) rc).exp())); else if (rc instanceof ExpBoolContext) { @@ -124,7 +125,7 @@ else if (rc instanceof ExpBoolContext) { } } - private Expression operandCreate(ParseTree rc) { + private Expression operandCreate(ParseTree rc) throws ParsingException { if (rc instanceof OpLiteralContext) return create(((OpLiteralContext) rc).literalExpression()); else if (rc instanceof OpArithContext) @@ -143,7 +144,7 @@ else if (rc instanceof OpGroupContext) return null; } - private Expression literalExpressionCreate(ParseTree rc) { + private Expression literalExpressionCreate(ParseTree rc) throws ParsingException { if (rc instanceof LitGroupContext) return new GroupExpression(create(((LitGroupContext) rc).literalExpression())); else if (rc instanceof LitContext) @@ -158,20 +159,22 @@ else if (rc instanceof VarContext) { } } - private Expression functionCallCreate(FunctionCallContext rc) { + private Expression functionCallCreate(FunctionCallContext rc) throws ParsingException { if (rc.ghostCall() != null) { GhostCallContext gc = rc.ghostCall(); - List le = getArgs(gc.args()); String name = Utils.qualifyName(prefix, gc.ID().getText()); - return new FunctionInvocation(name, le); + List args = getArgs(gc.args()); + if (args.isEmpty()) + throw new ParsingException("Function call cannot have empty arguments"); + return new FunctionInvocation(name, args); } else { AliasCallContext gc = rc.aliasCall(); - List le = getArgs(gc.args()); - return new AliasInvocation(gc.ID_UPPER().getText(), le); + List args = getArgs(gc.args()); + return new AliasInvocation(gc.ID_UPPER().getText(), args); } } - private List getArgs(ArgsContext args) { + private List getArgs(ArgsContext args) throws ParsingException { List le = new ArrayList<>(); if (args != null) for (PredContext oc : args.pred()) { @@ -180,7 +183,7 @@ private List getArgs(ArgsContext args) { return le; } - private Expression literalCreate(LiteralContext literalContext) { + private Expression literalCreate(LiteralContext literalContext) throws ParsingException { if (literalContext.BOOL() != null) return new LiteralBoolean(literalContext.BOOL().getText()); else if (literalContext.STRING() != null) From 52647bc1c709de99d09a12d68953283c7cf5473b Mon Sep 17 00:00:00 2001 From: Ricardo Costa Date: Thu, 13 Nov 2025 20:44:59 +0000 Subject: [PATCH 2/2] Add Empty Argument Check For Alias Calls --- .../liquidjava/rj_language/visitors/CreateASTVisitor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java b/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java index 42626cb0..bef9525d 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java +++ b/liquidjava-verifier/src/main/java/liquidjava/rj_language/visitors/CreateASTVisitor.java @@ -165,11 +165,13 @@ private Expression functionCallCreate(FunctionCallContext rc) throws ParsingExce String name = Utils.qualifyName(prefix, gc.ID().getText()); List args = getArgs(gc.args()); if (args.isEmpty()) - throw new ParsingException("Function call cannot have empty arguments"); + throw new ParsingException("Ghost call cannot have empty arguments"); return new FunctionInvocation(name, args); } else { AliasCallContext gc = rc.aliasCall(); List args = getArgs(gc.args()); + if (args.isEmpty()) + throw new ParsingException("Alias call cannot have empty arguments"); return new AliasInvocation(gc.ID_UPPER().getText(), args); } }