From 8c079b91f4405ca7df36c624ad2925c07df9f306 Mon Sep 17 00:00:00 2001 From: Lexy Plt Date: Wed, 6 May 2026 18:16:53 +0200 Subject: [PATCH 1/2] fix(compiler): ensure there is a variable to mark as unreachable --- CHANGELOG.md | 4 ++++ CMakeLists.txt | 2 +- src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp | 3 ++- tests/unittests/resources/LangSuite/weird-tests.ark | 10 +++++++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dee6aaf0..6a9af3cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [4.5.2] - 2026-05-06 +### Changed +- fix compiler segfault when there is no variable to mark as unreachable + ## [4.5.1] - 2026-05-05 ### Added - special error message when trying to use a hidden symbol due to importing diff --git a/CMakeLists.txt b/CMakeLists.txt index 22f52ada..c88b365a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(ark CXX) # ArkScript version (have to manually update it) set(ARK_VERSION_MAJOR 4) set(ARK_VERSION_MINOR 5) -set(ARK_VERSION_PATCH 1) +set(ARK_VERSION_PATCH 2) set(ARK_VERSION_PRERELEASE 0) # determine whether this is a standalone project or included by other projects diff --git a/src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp b/src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp index e320fb42..177ae4a1 100644 --- a/src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp +++ b/src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp @@ -76,6 +76,7 @@ namespace Ark::internal void LocalsLocator::markLastLocalAsUnreachable() { - m_scopes.back().data.back().unreachable = true; + if (!m_scopes.back().data.empty()) + m_scopes.back().data.back().unreachable = true; } } diff --git a/tests/unittests/resources/LangSuite/weird-tests.ark b/tests/unittests/resources/LangSuite/weird-tests.ark index 7ade7061..cc1d9827 100644 --- a/tests/unittests/resources/LangSuite/weird-tests.ark +++ b/tests/unittests/resources/LangSuite/weird-tests.ark @@ -110,4 +110,12 @@ (test:eq res 5) })) (var_after_cond false) - (var_after_cond true) }) }) + (var_after_cond true) }) + + (test:case "no segfault when marking variables as unreachable in the compiler" { + (mut n 1) + (while (< n 10) { + (if (> n 1) + ((let F (fun (m) (if m m 1))) n)) + (set n (+ n 1)) }) + (test:eq n 10) }) }) From 9dac6627cfb1a935acf7e38b98ef3f48acbe6beb Mon Sep 17 00:00:00 2001 From: Lexy Plt Date: Wed, 6 May 2026 18:45:29 +0200 Subject: [PATCH 2/2] chore: disable force inlining in fuzzed builds --- include/Ark/Utils/Platform.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/Ark/Utils/Platform.hpp b/include/Ark/Utils/Platform.hpp index 1a2a9fa9..6760c8ef 100644 --- a/include/Ark/Utils/Platform.hpp +++ b/include/Ark/Utils/Platform.hpp @@ -17,10 +17,12 @@ # define ARK_OS_LINUX #endif -#if defined(__GNUC__) || defined(__clang__) -# define ARK_ALWAYS_INLINE __attribute__((always_inline)) -#elif defined(_MSC_VER) && !defined(__clang__) -# define ARK_ALWAYS_INLINE __forceinline +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +# if defined(__GNUC__) || defined(__clang__) +# define ARK_ALWAYS_INLINE __attribute__((always_inline)) +# elif defined(_MSC_VER) && !defined(__clang__) +# define ARK_ALWAYS_INLINE __forceinline +# endif #else # define ARK_ALWAYS_INLINE #endif