leftibot 85b8e7c0c8
Fix #633: [Bug] Stack-overflow due to infinite recursion in user-defined operator (string interpolation) (#700)
* Fix #633: Bound ChaiScript call stack to prevent native stack overflow

Recursive user-defined operators (e.g. a `string::/=` whose body calls
itself through string interpolation) drove the AST evaluator into
unbounded native recursion and crashed the host process with SIGSEGV.
The dispatcher now refuses to enter a new function frame once
`Stack_Holder::call_depth` reaches `chaiscript::max_call_depth`
(default 256, overridable via the `CHAISCRIPT_MAX_CALL_DEPTH` macro)
and throws the new `chaiscript::exception::stack_overflow_error`
instead, letting both ChaiScript-level `try`/`catch` and C++ hosts
recover from runaway recursion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Address review: tighten max_call_depth on MSVC Debug

Windows MSVC Debug builds crashed unit.recursion_depth_protection.chai
with SEGFAULT before the depth check could fire. Windows defaults to a
1 MiB thread stack and Debug builds emit much larger per-frame native
stack usage (no inlining, /RTC, buffer security checks), so 256 nested
ChaiScript calls overflow the native stack long before the dispatcher
reaches max_call_depth. Linux/macOS and MSVC Release pass at 256.

Pick a tighter default (32) only for the MSVC + _DEBUG configuration
that needs it, leaving every other build at the original 256, and shrink
the count_down recursion in the regression test so the bounded path
stays well below every platform's default.

Requested by @lefticus in PR #700 review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Address review: use CHAISCRIPT_DEBUG instead of _DEBUG

Switch CHAISCRIPT_DEBUG from a true/false definition to 1/0 so it can
be used in preprocessor #if expressions, then reuse it for the MSVC
Debug guard around CHAISCRIPT_MAX_CALL_DEPTH instead of testing the
compiler-private _DEBUG macro directly. The C++ debug_build constant
keeps its bool value through implicit conversion.

Requested by @lefticus in PR #700 review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Address review: restore CHAISCRIPT_DEBUG to true/false for stronger typing

C++ preserves the true/false keywords in #if directives ([cpp.cond]),
so the MSVC Debug guard around CHAISCRIPT_MAX_CALL_DEPTH still works
without weakening the macro to integer 1/0.

Requested by @lefticus in PR #700 review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: leftibot <leftibot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:38:01 -06:00
..
dispatchkit Fix #633: [Bug] Stack-overflow due to infinite recursion in user-defined operator (string interpolation) (#700) 2026-05-02 11:38:01 -06:00
language 🎨 Committing clang-format changes 2026-04-29 02:22:59 +00:00
utility 🎨 Committing clang-format changes 2026-04-29 02:22:59 +00:00
chaiscript_basic.hpp change .clang-format and reformat code with clang-format 11 2021-05-24 10:44:15 +02:00
chaiscript_defines.hpp Fix #633: [Bug] Stack-overflow due to infinite recursion in user-defined operator (string interpolation) (#700) 2026-05-02 11:38:01 -06:00
chaiscript_stdlib.hpp Enable warnings as errors (#694) 2026-04-28 20:11:15 -06:00
chaiscript_threading.hpp change .clang-format and reformat code with clang-format 11 2021-05-24 10:44:15 +02:00
chaiscript.hpp Fix #571: How to redirect "cout" and "print" to a microsoft Windows 10 window? (#657) 2026-04-11 18:58:09 -06:00