diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 12734ac9..e0d2a2e7 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -342,6 +342,7 @@ B cell_c1(Md1D* d, B x) { B f = d->f; if (xr==0) return C1(shape, x); Arr* r = cpyWithShape(x); usz* xsh = PSH(r); + if (xr==UR_MAX) thrF("ā‰Ė˜: Result rank too large (%i≔=š•©)", xr); ShArr* rsh = m_shArr(xr+1); rsh->a[0] = xsh[0]; rsh->a[1] = 1; @@ -380,6 +381,7 @@ B cell_c1(Md1D* d, B x) { B f = d->f; B fv = inc(f); if (isAtm(fv)) return C2(shape, m_f64(cam), fv); usz vr = RNK(fv); + if (vr==UR_MAX) thrM("˘: Result rank too large"); f64* shp; B sh = m_f64arrv(&shp, vr+1); shp[0] = cam; usz* fsh = SH(fv); diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index b61d2d60..06112661 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -156,8 +156,8 @@ B shape_c2(B t, B w, B x) { } else { if (isAtm(w)) w = m_atomUnit(w); if (RNK(w)>1) thrM("ℊ: š•Ø must have rank at most 1"); - if (IA(w)>UR_MAX) thrM("ℊ: Result rank too large"); nr = IA(w); + if (nr>UR_MAX) thrM("ℊ: Result rank too large"); sh = nr<=1? NULL : m_shArr(nr); if (TI(w,elType)==el_i32) { i32* wi = i32any_ptr(w); @@ -978,11 +978,12 @@ B join_c2(B t, B w, B x) { B couple_c1(B t, B x) { if (isAtm(x)) return m_vec1(x); - usz rr = RNK(x); + ur xr = RNK(x); + if (xr==UR_MAX) thrF("ā‰: Result rank too large (%i≔=š•©)", xr); usz ia = IA(x); - Arr* r = TI(x,slice)(incG(x),0, ia); - usz* sh = arr_shAlloc(r, rr+1); - if (sh) { sh[0] = 1; shcpy(sh+1, SH(x), rr); } + Arr* r = TI(x,slice)(incG(x), 0, ia); + usz* sh = arr_shAlloc(r, xr+1); + if (sh) { sh[0] = 1; shcpy(sh+1, SH(x), xr); } decG(x); return taga(r); } @@ -993,6 +994,7 @@ B couple_c2(B t, B w, B x) { if (!eqShape(w, x)) thrF("ā‰: š•Ø and š•© must have equal shapes (%H ≔ ā‰¢š•Ø, %H ≔ ā‰¢š•©)", w, x); usz ia = IA(w); ur wr = RNK(w); + if (wr==UR_MAX) thrM("ā‰: Result rank too large"); MAKE_MUT_INIT(r, ia*2, el_or(TI(w,elType), TI(x,elType))); MUTG_INIT(r); mut_copyG(r, 0, w, 0, ia); mut_copyG(r, ia, x, 0, ia); diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index b6aa34fb..ab6e8038 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -408,6 +408,7 @@ B rand_range_c2(B t, B w, B x) { if (wia<2) { arr_rnk01(r, wia); } else { + if (wia>UR_MAX) thrF("(rand).Range: Result rank too large (%sā‰”ā‰¢š•Ø)", wia); usz* sh = arr_shAlloc(r, wia); SGetU(w); for (usz i = 0; i < wia; i++) sh[i] = o2sG(GetU(w, i)); diff --git a/src/utils/bits.c b/src/utils/bits.c index e76238fa..21732097 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -133,6 +133,7 @@ static NOINLINE B zeroPadToCellBits0(B x, usz lr, usz cam, usz pcsz, usz ncsz) { if (ncsz==32) return taga(cpyI32Arr(x)); } + if (lr==UR_MAX) thrM("Rank too large"); u64* rp; Arr* r = m_bitarrp(&rp, cam*ncsz); usz* rsh = arr_shAlloc(r, lr+1); @@ -200,6 +201,7 @@ NOINLINE B widenBitArr(B x, ur axis) { B narrowWidenedBitArr(B x, ur axis, ur cr, usz* csh) { // for now assumes the bits to be dropped are zero, origCellBits is a multiple of 8, and that there's at most 63 padding bits if (TI(x,elType)!=el_bit) return taga(cpyBitArr(x)); + if (axis+cr>UR_MAX) thrM("Rank too large"); usz xcsz = shProd(SH(x), axis, RNK(x)); usz ocsz = shProd(csh, 0, cr);