LINUX.ORG.RU

История изменений

Исправление kostyarin_, (текущая версия) :

Файлы
  • main.c
  • set.s
main.c

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

uint64_t read ();
void     set ();

int
main() {

	uint64_t val = 0;

	set ();
	val = read ();

	printf ("%ld was set\n", val);

	return EXIT_SUCCESS;
}


uint64_t
read () {
	uint64_t unin;
	return unin;
}

set.s

.type set, @function
.global set
set:
	movq $777, -16(%rsp)
	ret

Сборка и запуск
gcc  -Wall -Werror -Wno-uninitialized -O0 main.c set.s  && ./a.out
Выхлоп
777 was set
Объяснение

На тот момент когда вызвана функция set мы помещаем 777 на вершину стека + 1. Во время вызова read на вершину стека указывает неинициализированная переменная unin. Которая копируется через %rax в результат функции.

Исходная версия kostyarin_, :

Файлы
  • main.c
  • set.s
main.c

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

uint64_t read ();
void     set ();

int
main() {

	uint64_t val = 0;

	set ();
	val = read ();

	printf ("%ld was set\n", val);

	return EXIT_SUCCESS;
}


uint64_t
read () {
	uint64_t unin;
	return unin;
}

set.s

.type set, @function
.global set
set:
	movq $777, -16(%rsp)
	ret

Сборка и запуск
gcc  -Wall -Werror -Wno-uninitialized -O0 main.c set.s  && ./a.out
Выхлоп
777 was set
Объяснение

На тот момент когда вызвана функция set мы помещаем 777 на вершину стека. Во время вызова read на вершину стека указывает неинициализированная переменная unin. Которая копируется через %rax в результат функции.