memanggil alloca() dari parameter pemanggilan fungsi lain?

Mengapa memanggil alloc( ) sebagai parameter ke pemanggilan fungsi lain seperti ini func(x, alloca(size), z); dianggap salah Menurut buku berjudul the linux programming interface

Hal ini karena ruang tumpukan yang dialokasikan oleh alloca() akan muncul di tengah ruang untuk argumen fungsi (yang ditempatkan di lokasi tetap dalam bingkai tumpukan). Sebagai gantinya, kita harus menggunakan kode seperti ini:

  void *y; 
  y = alloca(size); 
  func(x, y, z); 

padahal ini salah

func(x, alloca(size), z);  /* WRONG! */

bukankah 2 bagian itu seharusnya setara. Yang pertama alloca dipanggil terlebih dahulu kemudian func dipanggil dengan nilai kembaliannya, jadi jika seseorang dapat menjelaskan bagaimana alloca mengalokasikan memori pada tumpukan yang membuat kedua pendekatan berbeda.


person Khaled    schedule 16.09.2020    source sumber
comment
Apakah ada alasan mengapa itu salah? Ketentuan benar/salah bersifat subyektif. Apakah salah hanya karena ada dua pemanggilan fungsi pada baris yang sama yang tidak mengikuti gaya kode tertentu?   -  person KamilCuk    schedule 16.09.2020
comment
@KamilCuk menurut buku berjudul the linux programming interface akan mengedit pertanyaan dengan kutipan dari buku tersebut   -  person Khaled    schedule 16.09.2020


Jawaban (1)


Halaman manual alloca menyebutkan ini di bagian BUGS:

Pada banyak sistem, alloca() tidak dapat digunakan di dalam daftar argumen pemanggilan fungsi, karena ruang tumpukan yang disediakan oleh alloca() akan muncul pada tumpukan di tengah ruang untuk argumen fungsi.

Misalnya. di func(x, alloca(1000), z); Anda mungkin mengakhiri dengan tata letak tumpukan seperti

 sp+100c:    x
 sp+1008:    .... space reserved by alloca
 sp+   8:
 sp+   4:    sp+8 (return value of alloca())
 sp+   0:    z

ABI umum mengharuskan parameter func(void *, void *, void *) berada di lokasi [sp + 0], [sp + 4], dan [sp + 8]. Diharapkan ada tata letak yang mirip dengan

 sp+100c:    .... end of space reserved by alloca
 sp+   c:    .... space reserved by alloca
 sp+   8:    x
 sp+   4:    sp+0x0c (return value of alloc())
 sp+   0:    z
person ensc    schedule 16.09.2020
comment
Jadi, apakah ini BUG yang akan diperbaiki dan tidak ada hubungannya dengan cara kerja alloc( )? - person Khaled; 16.09.2020
comment
alloca seharusnya bekerja dengan memperluas tumpukan; tidak ada spesifikasi pasti bagaimana hal ini akan terjadi. Sebagian besar/semua implementasi yang ada mengalami bug (desain) tertentu (misalnya masalah aktual atau perilaku jika terjadi kesalahan) dan saya tidak berharap bug ini diperbaiki. Anda harus berhati-hati saat alloca(). - person ensc; 16.09.2020
comment
Apakah Anda berasumsi tumpukan itu bertambah dari bawah? Bagaimana parameter dimasukkan ke dalam tumpukan (urutan yang dimasukkan ke dalam tumpukan)? Bisakah Anda menjelaskan 'mengapa' secara detail? - person jinbeom hong; 01.05.2021
comment
Dalam contoh yang diberikan, tumpukan bertambah dari atas ke bawah dan parameter diisi sesuai urutan tertentu (pertama x, lalu alloca(), lalu hasil alloca() dan terakhir z). - person ensc; 02.05.2021
comment
@ensc Tapi saya masih tidak mengerti mengapa tata letak tumpukan buruk ("because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments."). Kompiler tidak dapat menentukan lokasi parameter z karena alokasi memori tersebar dari sp+1008 ke sp+8? - person jinbeom hong; 05.05.2021