SORU
16 NİSAN 2014, ÇARŞAMBA


Teknik olarak, nasıl variadic fonksiyonlar çalışıyor mu? Ne kadar basit bir beşgen kullanmaktır çalışır?

va_arg kendi variadic fonksiyonlar yazmak benim için kullanabilirim biliyorum ama nasıl variadic fonksiyonlar başlık altında iş yapmak, yani Meclis öğretim düzeyinde?

E. g., nasıl printf bağımsız değişken bir dizi alır.


İstisnasız hiçbir kural*. Dil/C diye bir şey yok , ancak, bu soru her ikisi için de cevaplanabilir

* Not: Cevap aslında How can printf function can take variable parameters in number while output them? ama bu soru için geçerli değil gibi görünüyor verildi

CEVAP
16 NİSAN 2014, ÇARŞAMBA


C ve C standart işe yaramalı konusunda herhangi bir gereksinimi yoktur. Uygun bir derleyici de zincirleme listeleri, std::stack<boost::any> hatta büyülü Midilli toz (başına Xeo gibi) yaymak için kaputun altında karar verebilir.

Ancak, genellikle CPU kayıtlarında bağımsız satır içi uygulaması geçirilmesi gibi dönüşümler ele kodun hiç bir şey olmasa bile aşağıdaki gibi uygulanır.

Ayrıca bu cevap özellikle bir aşağı aşağıda görseller yığın büyüyen açıklar; ayrıca, bu cevap sadece düzeni (https://en.wikipedia.org/wiki/Stack_frame bakınız) göstermek için bir sadeleştirilmesi olduğunu unutmayın lütfen.

Nasıl bir işlev bağımsız değişken sabit olmayan bir sayı ile çağrılabilir

Bu temel makine mimarisi sözde "" her iş parçacığı için. bir yığın olduğundan mümkün Yığın, işlev için bağımsız değişken geçirmek için kullanılır. Varsa, örneğin,:

foobar("%d%d%d", 3,2,1);

O zaman bu böyle bir çevirici kodu derler (örnek ve şematik olarak, gerçek kodu farklı olabilir); argümanlar soldan sağa geçirilen not:

push 1
push 2
push 3
push "%d%d%d"
call foobar

Bu push-up işlemleri yığın doldurun:

              []   // empty stack
-------------------------------
push 1:       [1]  
-------------------------------
push 2:       [1]
              [2]
-------------------------------
push 3:       [1]
              [2]
              [3]  // there is now 1, 2, 3 in the stack
-------------------------------
push "%d%d%d":[1]
              [2]
              [3]
              ["%d%d%d"]
-------------------------------
call foobar   ...  // foobar uses the same stack!

Element denir "Top", genellikle kısaltılmış"". TOS Yığını altında yığını

foobar işlevi şimdi, TOS başlayarak yığın hatırlayacağınız gibi son itilmiş olan, yani biçim dizesi, erişim. stack hayal işaretçiyi TOS değeri , stack[1] TOS yukarıdaki ve benzeri yığını

format_string <- stack[0]

... ve sonra ayrıştırır format-string. Ayrıştırılırken, recognozies %d-belirteçleri, ve her biri için, bir daha değer yığın: loads

format_string <- stack[0]
offset <- 1
while (parsing):
    token = tokenize_one_more(format_string)
    if (needs_integer (token)):
        value <- stack[offset]
        offset = offset   1
    ...

Bu tabii ki işlev bağımsız geçti güvenmek ne kadar yığından yükü kaldırmak için bunu bulmak için nasıl gösteren bir çok eksik pseudo-kod.

Güvenlik

Kullanıcı tarafından sağlanan bağımsız değişkenler bu güven aynı zamanda en büyük güvenlik sorunları mevcut (https://cwe.mitre.org/top25/ bkz. Kullanıcıların kolayca belgeleri okumak onlar için variadic bir işlevi yanlış da kullanabilir, ya da format string veya değişken listesi ayarlamak için unuttum, ya da düpedüz kötü oldukları için, ya da her neyse. Ayrıca Format String Attack bkz.

C Uygulanması

C ve C , variadic fonksiyonlar bir arada va_list arabirim ile kullanılır. Süre iterek üzerine yığın iç için bu dil (in K R C you could even forward-declare a function without stating its arguments ama hala arayacak herhangi bir sayı ve tür bağımsız değişkenleri), okuma gibi bir bilinmeyen değişken listesi arabirim üzerinden va_...-makrolar va_listtipi, hangi temelde özetleri düşük seviye yığın çerçevesini erişim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • RawBrahs

    RawBrahs

    28 Aralık 2010
  • sinumatic

    sinumatic

    19 Aralık 2006