reset затирает за собой абсолютно все изменения без возможности восстановления
Как так
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
Но в любом случае - это не "линия" связи. ... Тем более не выделенная
XCemaXX, одно и то же по смыслу (1536 байт от метки start), но разные по значению (адрес метки будет разным в этих вариантах).
я не берусь сказать со 100% уверенностью, рекомендация инициализировать сегменты относится и к сегменту кода. Можно поставить дальний переход на желаемый адрес первой инструкцией.