Но в любом случае - это не "линия" связи. ... Тем более не выделенная
$ xxd -r | sha1sum
0 c7 6f 17 f1 91 05 de 28 39 da b1 ea a2 a2 98 56
10 3d 67 df 21
8bb986c5259323914d0b68d0748430bf0cc31a63 -
Собственно в чем потенциально может быть проблема?
-g
компилятору и линковщику если линкуешь отдельным шагом) и дай санитайзеру самому сказать тебе, где проблема -- вместо /workspace/test+0x42590b
он покажет тебе конкретно исходник и номер строки. Читайте ей по 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
Александр Ананьев, а в книжку заглянуть?