LINUX.ORG.RU

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

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

Нет, не так.

  1. Регистр может быть и не первым а любым, главное чтобы он был одинаковым (а он тут обязательно будет одинаковым: одинаковый компилятор, тем более одинаковый тип возврата, и ещё тем более одна и та же функция).
  2. Перезаписывать его некому, потому что после вызова рекурсивной функции там ничего нет, остаться может только ассемблерный эпилог;
  • на современных компиляторах его тут скорее всего не будет;
  • эпилог (если он есть) обычно рассчитан на то, что он будет вызываться после подготовки return value, и соответственно он его портить не будет, а тем более в этой функции, у которой return value есть, эпилог будет именно с учётом его (если они вдруг разные для int и void функций, в чём я сомневаюсь);
  • эпилог на x86 (пусть это будет частный случай для наглядного примера, хотя я склонен считать это дефолтом) это что-то из POP reg (не EAX) / MOV ESP,EBP / ADD ESP,imm и опять же трогать другие регистры ему незачем; хотя я видел проги где какая-то валидация/обфускация стека включена и там эпилог сложнее, но EAX там тоже не трогался, по причине что return value где-то всё-таки есть и делать разные эпилоги для функций с ним и без него незачем.

Итого, вероятность того, что return value будет испорчено, около нуля, случайностью это никак не назвать. Можно лишь сказать что никто совершенно не гарантирует что всё будет хорошо, но обычно так (всё хорошо) и есть.

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

Нет, не так.

  1. регистр может быть и не первым а любым, главное чтобы он был одинаковым (а он тут обязательно будет одинаковым: одинаковый компилятор, тем более одинаковый тип возврата, и ещё тем более одна и та же функция)
  2. перезаписывать его некому, потому что после вызова рекурсивной функции там ничего нет, остаться может только ассемблерный эпилог
  • на современных компиляторах его тут скорее всего не будет
  • эпилог (если он есть) обычно рассчитан на то, что он будет вызываться после подготовки return value, и соответственно он его портить не будет
  • эпилог на x86 (пусть это будет частный случай для наглядного примера, хотя я склонен считать это дефолтом) это что-то из POP reg (не EAX) / MOV ESP,EBP / ADD ESP,imm и опять же трогать другие регистры ему незачем; хотя я видел проги где какая-то валидация/обфускация стека включена и там эпилог сложнее, но EAX там тоже не трогался, по причине что return value где-то всё-таки есть и делать разные эпилоги для функций с ним и без него незачем.

Итого, вероятность того, что return value будет испорчено, около нуля, случайностью это никак не назвать. Можно лишь сказать что никто совершенно не гарантирует что всё будет хорошо, но обычно так (всё хорошо) и есть.