From 09bdeb7fd8a39c57cbf7fc1ce8a4621478a57e87 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 23 Aug 2024 03:59:51 +0300 Subject: [PATCH] more usz overflow checking --- src/core/arrFns.h | 2 +- src/core/numarr.h | 4 ++-- src/core/stuff.h | 6 +++--- src/core/tyarrTemplate.h | 4 ++-- src/utils/mut.c | 10 +++++----- src/utils/mut.h | 10 +++++----- test/cases/usz32.bqn | 3 +++ 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/core/arrFns.h b/src/core/arrFns.h index 4ca967cb..2f278781 100644 --- a/src/core/arrFns.h +++ b/src/core/arrFns.h @@ -73,7 +73,7 @@ extern u8 const arrTypeBitsLog[]; #define arrTypeBitsLog(X) arrTypeBitsLog[X] #define arrNewType(X) el2t(TIi(X,elType)) -SHOULD_INLINE void arr_check_size(u64 sz, u8 type, usz ia) { +SHOULD_INLINE void arr_check_size(u64 sz, u8 type, u64 ia) { #if DEBUG assert(IS_ANY_ARR(type) || type==t_harrPartial); if (!IS_SLICE(type)) { diff --git a/src/core/numarr.h b/src/core/numarr.h index e146115f..c05286d7 100644 --- a/src/core/numarr.h +++ b/src/core/numarr.h @@ -69,7 +69,7 @@ static inline u64 bit_find(u64* arr, u64 ia, bool v) { #endif #define BITARR_SZ(IA) fsizeof(BitArr, a, u64, BIT_N(IA)) -static B m_bitarrv(u64** p, usz ia) { +static B m_bitarrv(u64** p, u64 ia) { CHECK_BITARR_IA(ia); BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia); arr_shVec((Arr*)r); @@ -83,7 +83,7 @@ static B m_bitarrc(u64** p, B x) { assert(isArr(x)); arr_shCopy((Arr*)r, x); return taga(r); } -static Arr* m_bitarrp(u64** p, usz ia) { +static Arr* m_bitarrp(u64** p, u64 ia) { CHECK_BITARR_IA(ia); BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia); *p = (u64*)r->a; diff --git a/src/core/stuff.h b/src/core/stuff.h index 46707188..c44b6cc4 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -69,13 +69,13 @@ extern INIT_GLOBAL M_FillF fillFns[el_MAX]; static void tyarrv_freeP(Arr* x) { assert(PRNK(x)<=1 && IS_DIRECT_TYARR(PTY(x))); mm_free((Value*)x); } static void tyarrv_free(B x) { tyarrv_freeP(a(x)); } -static inline void* m_arrUnchecked(u64 sz, u8 type, usz ia) { +static inline void* m_arrUnchecked(u64 sz, u8 type, u64 ia) { Arr* r = mm_alloc(sz, type); r->ia = ia; return r; } -SHOULD_INLINE void arr_check_size(u64 sz, u8 type, usz ia); -SHOULD_INLINE void* m_arr(u64 sz, u8 type, usz ia) { +SHOULD_INLINE void arr_check_size(u64 sz, u8 type, u64 ia); +SHOULD_INLINE void* m_arr(u64 sz, u8 type, u64 ia) { arr_check_size(sz, type, ia); return m_arrUnchecked(sz, type, ia); } diff --git a/src/core/tyarrTemplate.h b/src/core/tyarrTemplate.h index c4a76ea6..3cb42f0f 100644 --- a/src/core/tyarrTemplate.h +++ b/src/core/tyarrTemplate.h @@ -4,7 +4,7 @@ typedef TyArr JOIN(TU,Arr); typedef TP(,) JOIN(TU,Atom); -SHOULD_INLINE B TP(m_,arrv) (TEl** p, usz ia) { +SHOULD_INLINE B TP(m_,arrv) (TEl** p, u64 ia) { CHECK_IA(ia, sizeof(TEl)); TyArr* r = m_arr(TYARR_SZ2(TU,ia), T_ARR, ia); arr_shVec((Arr*)r); @@ -19,7 +19,7 @@ SHOULD_INLINE B TP(m_,arrc) (TEl** p, B x) { assert(isArr(x)); arr_shCopy((Arr*)r, x); return taga(r); } -SHOULD_INLINE Arr* TP(m_,arrp) (TEl** p, usz ia) { +SHOULD_INLINE Arr* TP(m_,arrp) (TEl** p, u64 ia) { CHECK_IA(ia, sizeof(TEl)); TyArr* r = m_arr(TYARR_SZ2(TU,ia), T_ARR, ia); *p = (TEl*)r->a; diff --git a/src/utils/mut.c b/src/utils/mut.c index 6b2cd523..d7694cfb 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -2,10 +2,10 @@ #include "mut.h" typedef struct { Arr* arr; void* els; } MadeArr; -FORCE_INLINE MadeArr mut_make_arr(usz ia, u8 type, u8 el) { +FORCE_INLINE MadeArr mut_make_arr(u64 ia, u8 type, u8 el) { u64 sz; switch(el) { default: UD; - case el_bit: sz = BITARR_SZ( ia); break; + case el_bit: sz = BITARR_SZ( ia); CHECK_BITARR_IA(ia); break; case el_i8: case el_c8: sz = TYARR_SZ(I8, ia); break; case el_i16: case el_c16: sz = TYARR_SZ(I16,ia); break; case el_i32: case el_c32: sz = TYARR_SZ(I32,ia); break; @@ -26,13 +26,13 @@ FORCE_INLINE void mut_init(Mut* m, u8 el) { } #if __clang__ -NOINLINE void make_mut_init(Mut* rp, ux ia, u8 el) { +NOINLINE void make_mut_init(Mut* rp, u64 ia, u8 el) { MAKE_MUT(r, ia) mut_init(r, el); *rp = r_val; } #else -NOINLINE Mut make_mut_init(ux ia, u8 el) { +NOINLINE Mut make_mut_init(u64 ia, u8 el) { MAKE_MUT(r, ia) mut_init(r, el); return r_val; @@ -653,7 +653,7 @@ NOINLINE Arr* apd_fill_end(ApdMut* m, u32 ty) { return a(withFill(taga(m->obj), m->fill)); } -SHOULD_INLINE Arr* apd_setArr(ApdMut* m, usz ia, u8 xe) { +SHOULD_INLINE Arr* apd_setArr(ApdMut* m, u64 ia, u8 xe) { MadeArr a = mut_make_arr(ia, el2t(xe), xe); m->obj = a.arr; m->a = a.els; diff --git a/src/utils/mut.h b/src/utils/mut.h index 701f6dd1..b88869e8 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -29,17 +29,17 @@ extern INIT_GLOBAL MutFns mutFns[el_MAX+1]; struct Mut { MutFns* fns; - usz ia; + u64 ia; Arr* val; void* a; }; void mut_to(Mut* m, u8 n); #if __clang__ && __has_attribute(noescape) // workaround for clang not realizing that stack-returned structs aren't captured - void make_mut_init(__attribute__((noescape)) Mut* rp, ux ia, u8 el); + void make_mut_init(__attribute__((noescape)) Mut* rp, u64 ia, u8 el); #define MAKE_MUT_INIT(N, IA, EL) Mut N##_val; Mut* N = &N##_val; make_mut_init(N, IA, EL); #else - Mut make_mut_init(ux ia, u8 el); + Mut make_mut_init(u64 ia, u8 el); #define MAKE_MUT_INIT(N, IA, EL) Mut N##_val = make_mut_init(IA, EL); Mut* N = &N##_val; #endif #define MAKE_MUT(N, IA) Mut N##_val; N##_val.fns = &mutFns[el_MAX]; N##_val.ia = (IA); Mut* N = &N##_val; @@ -165,7 +165,7 @@ FORCE_INLINE B arr_join_inline(B w, B x, bool consume, bool* usedW) { assert(isArr(w) && isArr(x)); usz wia = IA(w); usz xia = IA(x); - u64 ria = wia+xia; + u64 ria = wia + (u64)xia; if (!reusable(w)) goto no; u64 wsz = mm_sizeUsable(v(w)); u8 wt = TY(w); @@ -259,7 +259,7 @@ struct ApdMut { }; union { - struct { ux ia0; }; // tot init + struct { u64 ia0; }; // tot init struct { usz* rsh0; ur rr0; }; // sh init struct { usz* csh; usz cia; ur cr; }; // sh2 & shE (& cia also for sh1) }; diff --git a/test/cases/usz32.bqn b/test/cases/usz32.bqn index 28ee9862..c7411d4f 100644 --- a/test/cases/usz32.bqn +++ b/test/cases/usz32.bqn @@ -1,3 +1,6 @@ !"Out of memory" % a←(2⋆20) β₯Š 1e9 β‹„ {π•Š: a}˘ a !"β₯Š: 𝕨 too large" % a←(2⋆20) β₯Š 1e9 β‹„ a˘ a !"Out of memory" % (2⋆25)/(2⋆10)β₯Š10 +!"Out of memory" % k←16384 β‹„ n←k÷˜2⋆32 β‹„ (nβ₯Šk) / nβ₯Š1 +!"Out of memory" % k←64 β‹„ n←k÷˜2⋆32 β‹„ (nβ₯Šk) / nβ₯Š1 # %SLOW +!"Out of memory" % ∾˜⍟31 ↕2 # %SLOW