Skip to content

Commit 0d502b4

Browse files
committed
bitset.c: Add more error code paths
To avoid maybe uninitialized compilation warnings
1 parent 3ed1b9f commit 0d502b4

File tree

1 file changed

+87
-46
lines changed

1 file changed

+87
-46
lines changed

src/sets/bitset.c

+87-46
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ static NyImmBitSetObject *mutbitset_as_noncomplemented_immbitset_subtype(
375375
NyMutBitSetObject *v, PyTypeObject *type);
376376
static NyBitField *mutbitset_findpos_ins(NyMutBitSetObject *v, NyBit pos);
377377
static NyBitField *mutbitset_findpos(NyMutBitSetObject *v, NyBit pos);
378-
static NySetField *mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **shi);
378+
static int mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **slo, NySetField **shi);
379379
static int mutbitset_iop_iterable(NyMutBitSetObject *ms, int op, PyObject *v);
380380
static NyMutBitSetObject *mutbitset_new_from_arg(PyObject *arg);
381381
static int mutbitset_reset(NyMutBitSetObject *v, NyImmBitSetObject *set);
@@ -972,24 +972,25 @@ sf_getrange(NySetField *v, NyBitField **shi)
972972
}
973973

974974

975-
static NyBitField *
976-
sf_getrange_mut(NySetField *sf, NyBitField **shi)
975+
static int
976+
sf_getrange_mut(NySetField *sf, NyBitField **slo, NyBitField **shi)
977977
{
978978
if (Py_REFCNT(sf->set) > 1) {
979979
NyImmBitSetObject *oset = sf->set;
980980
NyBit lo = sf->lo - oset->ob_field;
981981
NyBit hi = sf->hi - oset->ob_field;
982982
NyImmBitSetObject *set = NyImmBitSet_New(Py_SIZE(oset)?Py_SIZE(oset):8);
983983
if (!set)
984-
return 0;
984+
return -1;
985985
fp_move(set->ob_field, oset->ob_field, Py_SIZE(oset));
986986
sf->lo = set->ob_field + lo;
987987
sf->hi = set->ob_field + hi;
988988
sf->set = set;
989989
Py_DECREF(oset);
990990
}
991+
*slo = sf->lo;
991992
*shi = sf->hi;
992-
return sf->lo;
993+
return 0;
993994
}
994995

995996
static int
@@ -1179,17 +1180,17 @@ mutbitset_findpos_ins(NyMutBitSetObject *v, NyBit pos)
11791180
return f;
11801181
{
11811182
NySetField *lo, *hi;
1182-
hi = 0; /* Avoid warning */
1183-
lo = mutbitset_getrange_mut(v, &hi);
1183+
if (mutbitset_getrange_mut(v, &lo, &hi) < 0)
1184+
return NULL;
11841185
sf = setfield_binsearch(lo, hi, pos);
11851186
assert(lo <= sf && sf < hi);
11861187
assert(lo->pos <= pos);
11871188
assert(sf >= lo);
11881189
}
11891190
{
11901191
NyBitField *lo, *hi;
1191-
lo = sf_getrange_mut(sf, &hi);
1192-
(void)lo;
1192+
if (sf_getrange_mut(sf, &lo, &hi) < 0)
1193+
return NULL;
11931194
f = bitfield_binsearch(sf->lo, sf->hi, pos);
11941195
if (ins) {
11951196
if (!(f < sf->hi && f->pos == pos))
@@ -1217,15 +1218,15 @@ mutbitset_getrange(NyMutBitSetObject *v, NySetField **shi)
12171218
return union_getrange(v->root, shi);
12181219
}
12191220

1220-
static NySetField *
1221-
mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **shi)
1221+
static int
1222+
mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **slo, NySetField **shi)
12221223
{
12231224
NyUnionObject *root = v->root;
12241225
if (Py_REFCNT(root) > 1) {
12251226
NyUnionObject *nroot = PyObject_NewVar(NyUnionObject, &NyUnion_Type, Py_SIZE(root));
12261227
NyBit i;
12271228
if (!nroot)
1228-
return 0;
1229+
return -1;
12291230
nroot->cur_size = root->cur_size;
12301231
sfp_move(nroot->ob_field, root->ob_field, root->cur_size);
12311232
for (i = 0; i < nroot->cur_size; i++) {
@@ -1240,7 +1241,8 @@ mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **shi)
12401241
Py_DECREF(root);
12411242
root = nroot;
12421243
}
1243-
return union_getrange(root, shi);
1244+
*slo = union_getrange(root, shi);
1245+
return 0;
12441246
}
12451247

12461248
static NyImmBitSetObject *
@@ -1529,8 +1531,12 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
15291531
break;
15301532
case NyBits_AND:
15311533
end_w = w + n;
1532-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1533-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1534+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1535+
return -1;
1536+
for (; s < end_s; s++) {
1537+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1538+
return -1;
1539+
for (; f < end_f; f++) {
15341540
while (w < end_w && f->pos > w->pos)
15351541
w++;
15361542
if (w < end_w && w->pos == f->pos) {
@@ -1540,6 +1546,7 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
15401546
f->bits = 0;
15411547
}
15421548
}
1549+
}
15431550
break;
15441551
case NyBits_SUBR: {
15451552
NyBit i;
@@ -1550,8 +1557,12 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
15501557
}
15511558
}
15521559
end_w = w + n;
1553-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1554-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1560+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1561+
return -1;
1562+
for (; s < end_s; s++) {
1563+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1564+
return -1;
1565+
for (; f < end_f; f++) {
15551566
while (w < end_w && f->pos > w->pos)
15561567
w++;
15571568
if (w < end_w && w->pos == f->pos) {
@@ -1561,6 +1572,7 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
15611572
f->bits = 0;
15621573
}
15631574
}
1575+
}
15641576
}
15651577
break;
15661578
default:
@@ -1600,9 +1612,13 @@ mutbitset_iop_bits(NyMutBitSetObject *v, int op, NyBit pos, NyBits *bits, NyBit
16001612
pos++;
16011613
}
16021614
break;
1603-
case NyBits_AND: {
1604-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1605-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1615+
case NyBits_AND:
1616+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1617+
return -1;
1618+
for (; s < end_s; s++) {
1619+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1620+
return -1;
1621+
for (; f < end_f; f++) {
16061622
while (n > 0 && f->pos > pos) {
16071623
n--;
16081624
pos++;
@@ -1626,19 +1642,24 @@ mutbitset_iop_bits(NyMutBitSetObject *v, int op, NyBit pos, NyBits *bits, NyBit
16261642
return -1;
16271643
}
16281644
}
1629-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1630-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1631-
while (n > 0 && f->pos > pos) {
1632-
n--;
1633-
pos++;
1634-
bits++;
1635-
}
1636-
if (n > 0 && f->pos == pos) {
1637-
f->bits = ~f->bits & *bits++;
1638-
n--;
1639-
pos++;
1640-
} else {
1641-
f->bits = 0;
1645+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1646+
return -1;
1647+
for (; s < end_s; s++) {
1648+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1649+
return -1;
1650+
for (; f < end_f; f++) {
1651+
while (n > 0 && f->pos > pos) {
1652+
n--;
1653+
pos++;
1654+
bits++;
1655+
}
1656+
if (n > 0 && f->pos == pos) {
1657+
f->bits = ~f->bits & *bits++;
1658+
n--;
1659+
pos++;
1660+
} else {
1661+
f->bits = 0;
1662+
}
16421663
}
16431664
}
16441665
}
@@ -1725,35 +1746,45 @@ mutbitset_iop_mutset(NyMutBitSetObject *v, int op, NyMutBitSetObject *w)
17251746
case NyBits_OR:
17261747
case NyBits_XOR:
17271748
case NyBits_SUB:
1728-
for (s = mutbitset_getrange(w, &end_s); s < end_s; s++)
1749+
for (s = mutbitset_getrange(w, &end_s); s < end_s; s++)
17291750
for (f = sf_getrange(s, &end_f); f < end_f; f++)
17301751
if (mutbitset_iop_field(v, op, f) == -1)
17311752
return -1;
1732-
break;
1753+
break;
17331754
case NyBits_AND:
1734-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1735-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1755+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1756+
return -1;
1757+
for (; s < end_s; s++) {
1758+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1759+
return -1;
1760+
for (; f < end_f; f++) {
17361761
wf = mutbitset_findpos(w, f->pos);
17371762
if (wf)
17381763
f->bits &= wf->bits;
17391764
else
17401765
f->bits = 0;
17411766
}
1742-
break;
1767+
}
1768+
break;
17431769
case NyBits_SUBR:
1744-
for (s = mutbitset_getrange(w, &end_s); s < end_s; s++)
1770+
for (s = mutbitset_getrange(w, &end_s); s < end_s; s++)
17451771
for (f = sf_getrange(s, &end_f); f < end_f; f++)
17461772
if (!mutbitset_findpos_ins(v, f->pos))
17471773
return -1;
1748-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
1749-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
1774+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
1775+
return -1;
1776+
for (; s < end_s; s++) {
1777+
if (sf_getrange_mut(s, &f, &end_f) < 0)
1778+
return -1;
1779+
for (; f < end_f; f++) {
17501780
wf = mutbitset_findpos(w, f->pos);
17511781
if (wf)
17521782
f->bits = ~f->bits & wf->bits;
17531783
else
17541784
f->bits = 0;
17551785
}
1756-
break;
1786+
}
1787+
break;
17571788
default:
17581789
PyErr_SetString(PyExc_ValueError,
17591790
"Invalid mutbitset_iop_fields() operation");
@@ -2442,8 +2473,12 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
24422473
return -1;
24432474
}
24442475
if (i == - 1) {
2445-
for (end_s = mutbitset_getrange_mut(v, &s); --s >= end_s;)
2446-
for (end_f = sf_getrange_mut(s, &f); --f >= end_f;) {
2476+
if (mutbitset_getrange_mut(v, &end_s, &s) < 0)
2477+
return -1;
2478+
for (; --s >= end_s;) {
2479+
if (sf_getrange_mut(s, &end_f, &f) < 0)
2480+
return -1;
2481+
for (; --f >= end_f;) {
24472482
if (f->bits) {
24482483
j = bits_last(f->bits);
24492484
ret = f->pos * NyBits_N + j;
@@ -2455,9 +2490,14 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
24552490
return ret;
24562491
}
24572492
}
2493+
}
24582494
} else if (i == 0) {
2459-
for (s = mutbitset_getrange_mut(v, &end_s); s < end_s; s++)
2460-
for (f = sf_getrange_mut(s, &end_f); f < end_f; f++) {
2495+
if (mutbitset_getrange_mut(v, &s, &end_s) < 0)
2496+
return -1;
2497+
for (; s < end_s; s++) {
2498+
if (sf_getrange_mut(s, &f, &end_f) < 0)
2499+
return -1;
2500+
for (; f < end_f; f++) {
24612501
if (f->bits) {
24622502
j = bits_first(f->bits);
24632503
ret = f->pos * NyBits_N + j;
@@ -2469,6 +2509,7 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
24692509
return ret;
24702510
}
24712511
}
2512+
}
24722513
} else {
24732514
PyErr_SetString(PyExc_IndexError, "pop(): index must be 0 or -1");
24742515
return -1;

0 commit comments

Comments
 (0)