#include <string.h>
int i;
int j;
int main()
{
void *pi = &i;
char buf[8];
void *pj = &j;
memset(buf, 0, 16);
} Почему не работает, если в else дописать free(buf)?
parsed_string[(*size) - 1] = (char *)malloc(strlen(buf)); strcpy(parsed_string[(*size) - 1], buf);
-fsanitize=address и программа valgrind могут тебе без нашей помощи говорить, где ты вылез за границы буферов.$ gcc -fsanitize=address -g mem.c -o mem
$ ./mem mem.txt
=================================================================
==14939==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000074 at pc 0x7eff8b502550 bp 0x7ffc978328c0 sp 0x7ffc97832070
READ of size 5 at 0x602000000074 thread T0
#0 0x7eff8b50254f in __interceptor_strlen ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:301
#1 0x55cda292992b in parse_string /home/jcmvbkbc/tmp/toster/mem.c:84
#2 0x55cda2929492 in variable_processing /home/jcmvbkbc/tmp/toster/mem.c:55
#3 0x55cda2929377 in main /home/jcmvbkbc/tmp/toster/mem.c:31
#4 0x7eff8b2bd09a in __libc_start_main ../csu/libc-start.c:308
#5 0x55cda2929219 in _start (/home/jcmvbkbc/tmp/toster/mem+0x1219)
0x602000000074 is located 0 bytes to the right of 4-byte region [0x602000000070,0x602000000074)
allocated by thread T0 here:
#0 0x7eff8b543720 in __interceptor_realloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:105
#1 0x55cda29296de in parse_string /home/jcmvbkbc/tmp/toster/mem.c:79
#2 0x55cda2929492 in variable_processing /home/jcmvbkbc/tmp/toster/mem.c:55
#3 0x55cda2929377 in main /home/jcmvbkbc/tmp/toster/mem.c:31
#4 0x7eff8b2bd09a in __libc_start_main ../csu/libc-start.c:308
SUMMARY: AddressSanitizer: heap-buffer-overflow ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:301 in __interceptor_strlen
Shadow bytes around the buggy address:
0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa fd fa fa fa fd fa fa fa fd fa fa fa[04]fa
0x0c047fff8010: fa fa 00 fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==14939==ABORTINGREAD of size 5 at 0x602000000074 thread T0
#0 0x7eff8b50254f in __interceptor_strlen ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:301
#1 0x55cda292992b in parse_string /home/jcmvbkbc/tmp/toster/mem.c:84==11828== Invalid read of size 1
==11828== at 0x109153: main (in /home/jcmvbkbc/tmp/toster/a.out)
==11828== Address 0x4a4204a is 0 bytes after a block of size 10 alloc'd
==11828== at 0x483577F: malloc (vg_replace_malloc.c:299)
==11828== by 0x109146: main (in /home/jcmvbkbc/tmp/toster/a.out)==11846== Invalid read of size 1
==11846== at 0x109153: main (vg.c:6)
==11846== Address 0x4a4204a is 0 bytes after a block of size 10 alloc'd
==11846== at 0x483577F: malloc (vg_replace_malloc.c:299)
==11846== by 0x109146: main (vg.c:4)массив нужно передать, а в ассемблере их нет
Где можно найти размеры типов данных?
's/\([^@]*\)/#define \1 \1/' и подключить получившийся файл? Не хочу Си. Хочу низкоуровневое программирование.
сложновато звучит
Как мне узнать размер аргументов?
как их можно по-быстрому считать?
Не, не поставит. Вернее, не всегда. Примерно в половине случаев. А в другой половине случаев в верхних 8 битах окажутся единицы, а вся операция будет UB.
int64_t же. Но если собирать числа сдвигами, то правильное 64-битное значение со знаком указанным выше способом не получится.
А тут ещё в операции деления будет загвоздка. Потому что стандартный оператор деления округляет к 0 а не вниз.