if (tree cst = num_bytes->maybe_get_constant ())
{
byte_size_t concrete_num_bytes = wi::to_offset (cst);
+ if (!wi::fits_uhwi_p (concrete_num_bytes))
+ return nullptr;
if (concrete_num_bytes == 1)
return ::make_unique <text_art::styled_string>
(fmt_styled_string (sm, concrete_single_byte_fmt,
else if (tree cst = m_num_bits.maybe_get_constant ())
{
bit_size_t concrete_num_bits = wi::to_offset (cst);
+ if (!wi::fits_uhwi_p (concrete_num_bits))
+ return nullptr;
if (concrete_num_bits == 1)
return ::make_unique <text_art::styled_string>
(fmt_styled_string (sm, concrete_single_bit_fmt,
bit_offset_t overlap_next
= MIN (get_next_bit_offset (),
other.get_next_bit_offset ());
- gcc_assert (overlap_next > overlap_start);
+ if (overlap_next <= overlap_start)
+ /* If this has happened, some kind of overflow has happened in
+ our arithmetic. For now, reject such cases. */
+ return false;
bit_range abs_overlap_bits (overlap_start, overlap_next - overlap_start);
*out_this = abs_overlap_bits - get_start_bit_offset ();
*out_other = abs_overlap_bits - other.get_start_bit_offset ();
other.get_start_bit_offset ());
bit_offset_t overlap_next = MIN (get_next_bit_offset (),
other.get_next_bit_offset ());
- gcc_assert (overlap_next > overlap_start);
+ if (overlap_next <= overlap_start)
+ /* If this has happened, some kind of overflow has happened in
+ our arithmetic. For now, reject such cases. */
+ return false;
*out_num_overlap_bits = overlap_next - overlap_start;
return true;
}
bit_offset_t start = MAX (get_start_bit_offset (),
other.get_next_bit_offset ());
bit_offset_t size = get_next_bit_offset () - start;
- gcc_assert (size > 0);
+ if (size <= 0)
+ /* If this has happened, some kind of overflow has happened in
+ our arithmetic. For now, reject such cases. */
+ return false;
out_overhanging_bit_range->m_start_bit_offset = start;
out_overhanging_bit_range->m_size_in_bits = size;
return true;
/* THIS falls short of OFFSET. */
bit_offset_t start = get_start_bit_offset ();
bit_offset_t size = MIN (offset, get_next_bit_offset ()) - start;
- gcc_assert (size > 0);
+ if (size <= 0)
+ /* If this has happened, some kind of overflow has happened in
+ our arithmetic. For now, reject such cases. */
+ return false;
out_fall_short_bits->m_start_bit_offset = start;
out_fall_short_bits->m_size_in_bits = size;
return true;
--- /dev/null
+/* Verify we don't ICE on cases involving very large values for size. */
+
+char s, d;
+
+void
+foo(void)
+{
+ __builtin_strncpy(&d, &s + 3, -1); /* { dg-warning "Wstringop-overflow" } */
+ __builtin_strncpy(&d + 3, &s, -1); /* { dg-warning "Wstringop-overflow" } */
+}
+
+void
+bar(void)
+{
+ __builtin_strncpy(&d, &s - 3, -1); /* { dg-warning "Wstringop-overflow" } */
+ __builtin_strncpy(&d - 3, &s, -1); /* { dg-warning "Wstringop-overflow" } */
+}