From ecfc09d053dc4bc9d413d94cd10b64aa05e4015b Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Wed, 8 Jul 2020 09:58:48 +0900 Subject: [PATCH] gc.c: Cast int literal "1" to bits_t ... because shifting by more than 31 bits has undefined behavior (depending upon platform). Coverity Scan found this issue. --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gc.c b/gc.c index d1af8ba577..1e3b6c279d 100644 --- a/gc.c +++ b/gc.c @@ -4199,7 +4199,7 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_ /* create guard : fill 1 out-of-range */ bits[BITMAP_INDEX(p)] |= BITMAP_BIT(p)-1; - bits[BITMAP_INDEX(p) + sweep_page->total_slots / BITS_BITLENGTH] |= ~((1 << ((NUM_IN_PAGE(p) + sweep_page->total_slots) % BITS_BITLENGTH)) - 1); + bits[BITMAP_INDEX(p) + sweep_page->total_slots / BITS_BITLENGTH] |= ~(((bits_t)1 << ((NUM_IN_PAGE(p) + sweep_page->total_slots) % BITS_BITLENGTH)) - 1); for (i=0; i < HEAP_PAGE_BITMAP_LIMIT; i++) { bitset = ~bits[i];