https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116637
Bug ID: 116637 Summary: malloc and calloc assertion fails when two consecutive sizes don't match Product: gcc Version: 13.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libgcc Assignee: unassigned at gcc dot gnu.org Reporter: pgmer6809 at yahoo dot com Target Milestone: --- I am running Mint 22 Wilma cinnamon.(derived from Debian 13 via Ubuntu 22.04) Believe this is a bug in the gnulibc.a library. Here it is: I have a function that calls calloc (or malloc) to allocate an area of 'N' integers. At the end of the function I free the alloc. The next time I call the function if the number of integers is different from N, I get the following assertion and then a core dump: malloc.c:2617: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Here is some sample output: Description: Tag 28 Name HCP_JGM Strain NoTrump Size 10M Seed 919 :Top=34.00 step=0.50 ../src/deal_bktfreq_subs.c:222 Show Freq2d Calling: calloc nelem=14 Alloc Size=56 ../src/deal_bktfreq_subs.c:226 Show Freq2d calloc Returns ptr=0x55b20d961300 nelem=14 Alloc Size=56 Low 1500 1600 1700 1800 1900 2000 2100 2200 Sum Low 2 0 0 0 0 0 0 0 0 0 0 1500 0 1 0 0 0 0 0 0 0 0 0 1600 0 0 0 0 0 0 0 0 0 0 0 ../src/deal_bktfreq_subs.c:260 Calling free(col_tot) calloc ptr=0x55b20d961300 Description: Tag 29 Name CCCC Strain NoTrump Size 10M Seed 919 :Top=37.00 step=0.50 ../src/deal_bktfreq_subs.c:222 Show Freq2d Calling: calloc nelem=13 Alloc Size=52 dealdbg: malloc.c:2617: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped) and here is the code that does the above: int *col_tot ; JGMDPRT(5,"Show Freq2d Calling: calloc nelem=%d Alloc Size=%ld \n", a_bkt->Num, sizeof(int)*a_bkt->Num ) ; //<====== Line 222 col_tot = (int *)calloc( (size_t)a_bkt->Num , sizeof(int) ) ; //calloc will set them to zero to start. if (NULL == col_tot ) { perror("show_freq2D cant allocate RAM for Column Totals"); return(-7) ; } JGMDPRT(5,"Show Freq2d calloc Returns ptr=%p nelem=%d Alloc Size=%ld \n",(void*)col_tot, a_bkt->Num, sizeof(int)*a_bkt->Num ) ; //<====== line 226 <SNIP> JGMDPRT(5,"Calling free(col_tot) calloc ptr=%p\n", (void *)col_tot ) ; free((void*)col_tot) ; /* free RAM per this local var*/ //<==== line 260 return(1) ;