EvalEx icon indicating copy to clipboard operation
EvalEx copied to clipboard

Infinite loop java.lang.StackOverflowError in `Expression.evaluateInfixOperator`

Open ash211 opened this issue 8 months ago • 1 comments

Version: com.ezylang:EvalEx:3.4.0

I have a product using this library and have seen the below StackOverflowError in logs. Unfortunately I don't have access to the expression that triggered this, only the stacktrace. The expression itself is generated by an LLM and is likely invalid in some way.

Do the maintainers of this library have any guesses about what kind of input would trigger this StackOverflowError?

java.lang.StackOverflowError:
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:234)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
	at com.ezylang.evalex.Expression.evaluateInfixOperator(Expression.java:239)
	at com.ezylang.evalex.Expression.evaluateSubtree(Expression.java:138)
        <snip>

I see you've had a release in the past couple days of 3.5.0 -- I've taken the upgrade and am shipping that bump.

ash211 avatar Apr 24 '25 22:04 ash211

This looks like a recursive loop not terminating. I have tried a few things but was not able to find an expression that could cause this. Maybe you can somehow extend your code to log the expression before starting the evaluation?

uklimaschewski avatar Apr 27 '25 08:04 uklimaschewski

Hello, I could reproduce the issue by generating a huge expression recursively, such as ((((((1 + (2 + (3 + (4 + ... (10000 + 0))))))))).

I created Pull Request #526 to try to solve the issue.

Considering the Expression.evaluateSubtree method, I implemented a depth limiter to prevent excessive recursion and thus avoid the StackOverflowError, replacing it with an EvaluationException that has a more "friendly" message.

The stack size of a JVM depends on the operating system and architecture, so the maximum recursion depth should be configurable.

oswaldobapvicjr avatar May 31 '25 19:05 oswaldobapvicjr

Fixed by #526

oswaldobapvicjr avatar Jun 09 '25 11:06 oswaldobapvicjr

Closing this, should be fixed by #526

uklimaschewski avatar Jul 20 '25 07:07 uklimaschewski