< prev index next >

src/hotspot/share/utilities/bitMap.cpp

Print this page
rev 52445 : 8211926: Catastrophic size_t underflow in BitMap::*_large methods
Reviewed-by: kbarrett

*** 261,278 **** clear_range_within_word(beg, boundary); clear_range_within_word(boundary, end); } } void BitMap::set_large_range(idx_t beg, idx_t end) { verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! assert(end_full_word - beg_full_word >= 32, ! "the range must include at least 32 bytes"); // The range includes at least one full word. set_range_within_word(beg, bit_index(beg_full_word)); set_large_range_of_words(beg_full_word, end_full_word); set_range_within_word(bit_index(end_full_word), end); --- 261,288 ---- clear_range_within_word(beg, boundary); clear_range_within_word(boundary, end); } } + bool BitMap::is_small_range_of_words(idx_t beg_full_word, idx_t end_full_word) { + // There is little point to call large version on small ranges. + // Need to check carefully, keeping potential idx_t underflow in mind. + // The threshold should be at least one word. + STATIC_ASSERT(small_range_words >= 1); + return (beg_full_word + small_range_words >= end_full_word); + } + void BitMap::set_large_range(idx_t beg, idx_t end) { verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! if (is_small_range_of_words(beg_full_word, end_full_word)) { ! set_range(beg, end); ! return; ! } // The range includes at least one full word. set_range_within_word(beg, bit_index(beg_full_word)); set_large_range_of_words(beg_full_word, end_full_word); set_range_within_word(bit_index(end_full_word), end);
*** 282,292 **** verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! if (end_full_word - beg_full_word < 32) { clear_range(beg, end); return; } // The range includes at least one full word. --- 292,302 ---- verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! if (is_small_range_of_words(beg_full_word, end_full_word)) { clear_range(beg, end); return; } // The range includes at least one full word.
*** 366,377 **** verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! assert(end_full_word - beg_full_word >= 32, ! "the range must include at least 32 bytes"); // The range includes at least one full word. par_put_range_within_word(beg, bit_index(beg_full_word), value); if (value) { set_large_range_of_words(beg_full_word, end_full_word); --- 376,389 ---- verify_range(beg, end); idx_t beg_full_word = word_index_round_up(beg); idx_t end_full_word = word_index(end); ! if (is_small_range_of_words(beg_full_word, end_full_word)) { ! par_at_put_range(beg, end, value); ! return; ! } // The range includes at least one full word. par_put_range_within_word(beg, bit_index(beg_full_word), value); if (value) { set_large_range_of_words(beg_full_word, end_full_word);
< prev index next >