aboutsummaryrefslogtreecommitdiff
path: root/gcc/wide-int.h
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-10-12 16:07:25 +0200
committerJakub Jelinek <jakub@redhat.com>2023-10-12 16:07:25 +0200
commitfb590e4eeb1aa897209b853430dc4854ece97802 (patch)
treedfed0714e41cd12bdf545d85d1cef598be58d5c5 /gcc/wide-int.h
parent0d00385eaf72ccacff17935b0d214a26773e095f (diff)
downloadgcc-fb590e4eeb1aa897209b853430dc4854ece97802.zip
gcc-fb590e4eeb1aa897209b853430dc4854ece97802.tar.gz
gcc-fb590e4eeb1aa897209b853430dc4854ece97802.tar.bz2
wide-int: Add simple CHECKING_P stack-protector canary like checking
This patch adds hopefully not so expensive --enable-checking=yes verification that the widest_int upper length bound estimates are really upper bounds and nothing attempts to write more elements. It is done only if the estimated upper length bound is smaller than WIDE_INT_MAX_INL_ELTS, but that should be the most common case unless large _BitInt is involved. 2023-10-12 Jakub Jelinek <jakub@redhat.com> * wide-int.h (widest_int_storage <N>::write_val): If l is small and there is space in u.val array, store a canary value at the end when checking. (widest_int_storage <N>::set_len): Check the canary hasn't been overwritten.
Diffstat (limited to 'gcc/wide-int.h')
-rw-r--r--gcc/wide-int.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/wide-int.h b/gcc/wide-int.h
index 1b12472..07bacc9 100644
--- a/gcc/wide-int.h
+++ b/gcc/wide-int.h
@@ -1635,6 +1635,8 @@ widest_int_storage <N>::write_val (unsigned int l)
u.valp = XNEWVEC (HOST_WIDE_INT, l);
return u.valp;
}
+ else if (CHECKING_P && l < WIDE_INT_MAX_INL_ELTS)
+ u.val[l] = HOST_WIDE_INT_UC (0xbaaaaaaddeadbeef);
return u.val;
}
@@ -1650,6 +1652,9 @@ widest_int_storage <N>::set_len (unsigned int l, bool)
memcpy (u.val, valp, l * sizeof (u.val[0]));
XDELETEVEC (valp);
}
+ else if (len && len < WIDE_INT_MAX_INL_ELTS)
+ gcc_checking_assert ((unsigned HOST_WIDE_INT) u.val[len]
+ == HOST_WIDE_INT_UC (0xbaaaaaaddeadbeef));
len = l;
/* There are no excess bits in val[len - 1]. */
STATIC_ASSERT (N % HOST_BITS_PER_WIDE_INT == 0);