more fixes for overflow checking
This commit is contained in:
parent
c2754e0fff
commit
c57e0ba135
@ -73,24 +73,26 @@ B ud_c1(B t, B x) {
|
|||||||
usz sh[xia]; // stack allocation of rank items
|
usz sh[xia]; // stack allocation of rank items
|
||||||
i32 pos[xia];
|
i32 pos[xia];
|
||||||
usz ria = 1;
|
usz ria = 1;
|
||||||
|
bool bad=false, good=false;
|
||||||
for (usz i = xia; i--; ) {
|
for (usz i = xia; i--; ) {
|
||||||
usz c = o2s(GetU(x, i));
|
usz c = o2s(GetU(x, i));
|
||||||
if (c > I32_MAX) thrM("↕: Result too large");
|
good = c==0;
|
||||||
|
bad|= c > I32_MAX;
|
||||||
sh[i] = c;
|
sh[i] = c;
|
||||||
if (mulOn(ria, c)) thrM("↕: Result too large");
|
bad|= mulOn(ria, c);
|
||||||
}
|
}
|
||||||
|
if (bad && !good) thrM("↕: Result too large");
|
||||||
decG(x);
|
decG(x);
|
||||||
|
|
||||||
Arr* r = m_fillarr0p(ria);
|
Arr* r = m_fillarr0p(ria);
|
||||||
|
|
||||||
B* rp = fillarr_ptr(r);
|
|
||||||
ud_rec(rp, 0, xia, pos, sh);
|
|
||||||
|
|
||||||
usz* rsh = arr_shAlloc(r, xia);
|
usz* rsh = arr_shAlloc(r, xia);
|
||||||
if (rsh) shcpy(rsh, sh, xia);
|
if (rsh) shcpy(rsh, sh, xia);
|
||||||
|
|
||||||
if (ria) fillarr_setFill(r, inc(rp[0]));
|
if (ria) {
|
||||||
else {
|
B* rp = fillarr_ptr(r);
|
||||||
|
ud_rec(rp, 0, xia, pos, sh);
|
||||||
|
fillarr_setFill(r, incG(rp[0]));
|
||||||
|
} else {
|
||||||
i32* fp;
|
i32* fp;
|
||||||
fillarr_setFill(r, m_i32arrv(&fp, xia));
|
fillarr_setFill(r, m_i32arrv(&fp, xia));
|
||||||
for (usz i = 0; i < xia; i++) fp[i] = 0;
|
for (usz i = 0; i < xia; i++) fp[i] = 0;
|
||||||
|
|||||||
@ -495,8 +495,7 @@ NOINLINE B takedrop_highrank(bool take, B w, B x) {
|
|||||||
usz ria = 1;
|
usz ria = 1;
|
||||||
bool anyFill = false;
|
bool anyFill = false;
|
||||||
i64 cellStart = -1; // axis from which whole cells can be copied
|
i64 cellStart = -1; // axis from which whole cells can be copied
|
||||||
bool overflow = false;
|
bool bad=false, good=false;
|
||||||
bool anyZero = false;
|
|
||||||
for (usz i = 0; i < rr; i++) {
|
for (usz i = 0; i < rr; i++) {
|
||||||
i64 cw = i<wia? o2i64(GetU(w, i)) : take? xsh[i] : 0;
|
i64 cw = i<wia? o2i64(GetU(w, i)) : take? xsh[i] : 0;
|
||||||
u64 cwa = cw<0? -cw : cw;
|
u64 cwa = cw<0? -cw : cw;
|
||||||
@ -507,13 +506,11 @@ NOINLINE B takedrop_highrank(bool take, B w, B x) {
|
|||||||
if (c!=xshc) cellStart = i;
|
if (c!=xshc) cellStart = i;
|
||||||
anyFill|= c>xshc;
|
anyFill|= c>xshc;
|
||||||
rsh->a[i] = c;
|
rsh->a[i] = c;
|
||||||
if (c==0) anyZero = true;
|
good|= c==0;
|
||||||
if (mulOn(ria, c)) overflow = true;
|
bad|= mulOn(ria, c);
|
||||||
}
|
|
||||||
if (overflow) {
|
|
||||||
if (!anyZero) thrOOM();
|
|
||||||
ria = 0;
|
|
||||||
}
|
}
|
||||||
|
if (bad && !good) thrOOM();
|
||||||
|
|
||||||
CHECK_IA(ria, 8);
|
CHECK_IA(ria, 8);
|
||||||
|
|
||||||
if (cellStart<=0) {
|
if (cellStart<=0) {
|
||||||
|
|||||||
@ -353,7 +353,13 @@ B rand_range_c2(B t, B w, B x) {
|
|||||||
if (RNK(w) > 1) thrM("(rand).Range: 𝕨 must be a valid shape");
|
if (RNK(w) > 1) thrM("(rand).Range: 𝕨 must be a valid shape");
|
||||||
SGetU(w);
|
SGetU(w);
|
||||||
usz wia = IA(w);
|
usz wia = IA(w);
|
||||||
for (u64 i = 0; i < wia; i++) mulOn(am, o2s(GetU(w, i)));
|
bool bad=false, good=false;
|
||||||
|
for (u64 i = 0; i < wia; i++) {
|
||||||
|
usz c = o2s(GetU(w, i));
|
||||||
|
bad|= mulOn(am, c);
|
||||||
|
good|= c==0;
|
||||||
|
}
|
||||||
|
if (bad && !good) thrOOM();
|
||||||
} else {
|
} else {
|
||||||
am = o2s(w);
|
am = o2s(w);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user