Как так
return 0;
. В этом месте тебя ожидает сюрприз, потому что достаточно длинная строка перепишет адрес возврата и ты вернёшься неизвестно куда, где, скорее всего, получишь сегфолт и программа завершится.scanf("%1023[^\n]", name);
-fsanitize=address
она сломается в месте вызова scanf если ты дашь ей больше 1023 символов на вход. write всегда пишет столько, сколько указано, или блокирует поток
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(12345),
.sin_addr = inet_addr("127.0.0.1"),
};
ssize_t wr;
static char buf[100000000];
connect(s, (struct sockaddr *)&addr, sizeof(addr));
wr = send(s, buf, sizeof(buf), 0);
printf("%ld\n", wr);
}
nc -l -p 12345 | head -c 1 > /dev/null
$ gcc write-long.c -o write-long
$ ./write-long
2619280
Но в любом случае - это не "линия" связи. ... Тем более не выделенная
$ 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
он покажет тебе конкретно исходник и номер строки.
...и listen. И bind.