В обоих случаях мы в регистр sp запишем одно и тоже значение?
Дополнительный вопрос: в этот момент значение регистра cs чему будет равно?
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
Но в любом случае - это не "линия" связи. ... Тем более не выделенная