Пример программы для получения ошибки консолидации malloc
Сначала я хочу проверить работоспособность mcheck на моем ПК, чтобы обнаружить ошибку консолидации malloc. Таким образом, я буду уверен, что это поможет выяснить аналогичную аварию на встраиваемой Linux-системе. К сожалению, авария занимает как минимум 3-4 дня. Таким образом, я ищу пример программы, которая будет генерировать сбой подобного типа, как показано ниже.
Program terminated with signal 6, Aborted.
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
15 static inline _syscall2(int, __syscall_kill, __kernel_pid_t, pid,
int, sig);
Current language: auto; currently c
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
__res = 716485696
__err = 16
#1 0x2c73eb5c in kill (pid=900, sig=6) at kill.c:19
No locals.
#2 0x2aafb2e0 in pthread_kill (thread=900, signo=6) at signals.c:73
handle = (pthread_handle) 0x2ab3f2e0
pid = 900
#3 0x2aafbbb8 in raise (sig=6) at signals.c:241
retcode = 6
#4 0x2c730a5c in abort () at abort.c:94
sigset = {__val = {32, 0 <repeats 31 times>}}
#5 0x2c738054 in __malloc_consolidate (av=0x2c798860) at free.c:227
fb = (mfastbinptr *) 0x2c798864
maxfb = (mfastbinptr *) 0x2c798880
p = (mchunkptr) 0x2c798894
nextp = (mchunkptr) 0x4a2b2948
unsorted_bin = (mchunkptr) 0x2c798894
first_unsorted = (mchunkptr) 0x4a22f7e0
nextchunk = (mchunkptr) 0x2c798894
size = 0
nextsize = 0
prevsize = 0
nextinuse = 1
bck = (mchunkptr) 0x4a2b2948
fwd = (mchunkptr) 0x4a2b2948
#6 0x2c735ff0 in __malloc_inner (bytes=300) at malloc.c:912
av = (mstate) 0x2c798860
nb = 304
idx = 32
bin = (mbinptr) 0x2ac0dab4
fb = (mfastbinptr *) 0x2ae11e50
victim = (mchunkptr) 0x2ac0d9a4
size = 719396432
victim_index = 718311332
remainder = (mchunkptr) 0x49759b58
remainder_size = 40000
block = 719396432
bit = 718500504
map = 719396432
fwd = (mchunkptr) 0x1
bck = (mchunkptr) 0x4a2164ac
sysmem = (void *) 0x4975c9ac
#7 0x2c736c18 in malloc (bytes=300) at malloc.c:1172
4 ответа
Это потому, что ваша программа уничтожила структуру данных управления памятью, используемую libc malloc / free. У malloc / free есть свои собственные резиденты данных в пространстве пользовательской программы, чтобы отслеживать список выделенного / освобожденного пространства с разным размером чанка. Каким-то образом, возможно, ваша программа имеет переполнение буфера или небезопасный произвольный доступ, который изменил данные или указатель управления памятью. И в тот момент, когда ваша программа вызывает malloc / free, она использует неправильный адрес и вызывает сбой или прерывание.
Запуск Вальгринда крайне медленный. Может быть, вы можете попробовать setenv MALLOC_CHECK_ 1 и запустить вашу программу, чтобы сначала увидеть любое диагностическое сообщение.
Это то, что вы просите?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int *num = malloc(sizeof(int));
int *num2 = num;
free(num);
free(num2);
printf("End\n");
return 0;
}
Пример, если вы создаете кучу с именем *txt размером 100 символов.
char *txt = malloc(100*sizeof(char));
Затем по ошибке переназначим меньшую переменную на этот указатель:
char a;
txt = a;
Затем попытаться назначить обычный текст в неисправную кучу;
strcpy ("text",txt);
Возможно, вам нужно отследить переменную (указатель) и проверить каждое переназначение.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int *num1 = malloc(sizeof(int));
int *num2 = malloc(sizeof(int));
int *num3 = malloc(sizeof(int));
int *num4 = malloc(sizeof(int));
int *num5 = malloc(sizeof(int));
free(num1);
free(num3);
free(num4);
free(num2);
free(num5);
printf("End\n");
return 0;
}