feat: implement simple infinite loop checker

This commit is contained in:
samsonium
2026-10-22 20:24:48 +03:00
parent 5dde75523d
commit a20743a835
3 changed files with 202 additions and 27 deletions
+5 -2
View File
@@ -14,7 +14,8 @@
#include <stdlib.h>
#include <string.h>
extern bool is_infinite_loop(fzl_walker_t *walker, size_t ls, size_t le);
extern bool is_infinite_loop(fzl_walker_t *walker, fzl_node_t *node, size_t ls,
size_t le);
char *null_name = "<null>";
char wlast_err[256];
@@ -221,6 +222,7 @@ fzl_walk_res_t walk(fzl_walker_t *walker, fzl_node_t *node)
push_op(walker, FZL_OPCODE_MK_ENVTABLE);
walker->syms[walker->sym_top++] = fzl_mksymt();
size_t loop_begin_ip = walker->op_count;
if (node->loop.init)
{
@@ -274,9 +276,10 @@ fzl_walk_res_t walk(fzl_walker_t *walker, fzl_node_t *node)
push_op(walker, FZL_OPCODE_RM_ENVTABLE);
bool is_infinite =
is_infinite_loop(walker, start_ip, walker->op_count - 2);
is_infinite_loop(walker, node, loop_begin_ip, walker->op_count - 2);
if (is_infinite)
{
free(newctx->breaks);
snprintf(wlast_err, sizeof(wlast_err),
"'%s': infinite loop detected at %ld:%ld",
node->token->filename, node->token->ln, node->token->cn);