Читайте ей по 4 байта 2 раза в char buf[4].
...
(int)buf[3] << 24 | (int)buf[2] << 16 поставит на место 2 старших байта
Тип 64-х битных чисел - long long. Вам в условии посоветовали им пользоваться.
Сложить 2 числа сами сможете?
Нужно вычислить полусумму этих чисел, округляя полученный результат вниз.
#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==ABORTING
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
==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/'
и подключить получившийся файл? Не хочу Си. Хочу низкоуровневое программирование.
сложновато звучит
fopen, fscanf