?

Log in

No account? Create an account

Программистское - Общество дровосеков Бердичева по изучению Мишны

Oct. 25th, 2014

01:07 pm - Программистское

Previous Entry Share Next Entry


Дано:

#include <stdio.h>
#include <stddef.h>

ptrdiff_t frame(char * prev) {
	char dummy;
	if (prev) {
		return prev - &dummy;
	}
	else return frame(&dummy);
}

void main() {
	printf("%ld\n", frame(0));
}

Что эта программа печатает, будучи скомпилирована с отключенной оптимизацией? Что - с включенной оптимизацией? Почему?

Comments:

(Deleted comment)
[User Picture]
From:spamsink
Date:October 25th, 2014 08:46 pm (UTC)
(Link)
Может ли в результате оптимизации быть напечатан 0 или значение другого знака, чем без оптимизации? Или не быть кратно гранулярности стека?
(Reply) (Parent) (Thread) (Expand)
(Deleted comment)
[User Picture]
From:avva
Date:October 25th, 2014 08:45 pm (UTC)
(Link)
Моя догадка: без оптимизации размер фрейма. С оптимизацией оба вызова frame() будут inlined, и программа напечатает плюс или минус 2 или 4 или 8 в зависимости от архитектуры и направления роста стека.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 25th, 2014 08:53 pm (UTC)
(Link)
Идея правильная, но реальные результаты, которые я наблюдал - другие. :)
(Reply) (Parent) (Thread)
[User Picture]
From:archaicos
Date:October 25th, 2014 08:52 pm (UTC)
(Link)
Что угодно, т.к. инстанции локальной переменной dummy не принадлежат одному массиву, а значит вычитание адресов инстанций друг из друга даёт undefined behavior.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 25th, 2014 09:01 pm (UTC)
(Link)
:) Как обманчивы бывают имена!
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:October 25th, 2014 09:02 pm (UTC)
(Link)
Как насчет нуля?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:fatoff
Date:October 25th, 2014 09:19 pm (UTC)
(Link)
Пиши применительно к какому компилятору для какой платформы с каким опциями компиляции. И вообще, что за отсталые интересы, в век, когда Функионал бороздит просторы Большого Театра?! :=]
(Reply) (Thread)
[User Picture]
From:archaicos
Date:October 25th, 2014 09:35 pm (UTC)
(Link)
Ну, хоть не фунгианал! :)
(Reply) (Parent) (Thread)
[User Picture]
From:fatoff
Date:October 25th, 2014 10:13 pm (UTC)
(Link)
Фунги кто? Грибы где?

Edited at 2014-10-25 10:14 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:ramlamyammambam
Date:October 25th, 2014 11:12 pm (UTC)
(Link)
-1 это круто.
Ох уж эти инлайновые функции.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 26th, 2014 07:42 am (UTC)
(Link)
-1 еще ничего, при инлайнинге переменные могут быть перемешаны. А вот 0 - это действительно круто. :)
(Reply) (Parent) (Thread)
[User Picture]
From:yuri_yurkevich
Date:October 28th, 2014 02:36 am (UTC)
(Link)
Вообще-то этот код отображает приём для организации stack underflow,
Такая хакерская штука, чтобы перехватить управление чьим-то компьютером.
Она как раз через стек, говорят, работает.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 28th, 2014 03:12 am (UTC)
(Link)
В принципе, этот код можно считать малой частью подобного приема, но его обычно на ассемблере пишут.
(Reply) (Parent) (Thread)
[User Picture]
From:yuri_yurkevich
Date:October 28th, 2014 05:48 am (UTC)
(Link)
Я уже привык, однако, к тому, что у меня пароли прямо из головы читают.

Мы в довольно замкнутом мире живём, так что приходится проверять даже то, о чём думает собственная голова.
(Reply) (Parent) (Thread)