SORU
21 Ocak 2015, ÇARŞAMBA


Taşma argc?

ÇOK merak ediyorum ve this question gördüm. Eğer taşma argc miyim diye merak etmeye başladım.

Standart argv[argc] boş gösterici olmalı, ancak argc taşma eğer yanlış olacağını söylüyor.

(24 ** küçük bir C programı ve bunu test etmek için bir python betiği ama*.* 3) var

Teşekkürler!


Rationale for International Standard — Programming Languages — C §5.1.2.2.1Program başlangıç

main bağımsız argc argv şartname geniş ön uygulama tanır. argv[argc] de yaygın bir uygulama temelinde listenin sonuna gereksiz bir kontrol sağlamak için bir boş gösterici olması gereklidir.

CEVAP
21 Ocak 2015, ÇARŞAMBA


Standardına göre

Yani, alıntı:

argv[argc] boş gösterici olması gereklidir

Bu nedenle, argc taşma olamaz, çünkü o zaman yukarıdaki ifade doğru olmaz.

Uygulamada

Uygulamada, bağımsız bir programa geçirilen toplam boyutu sınırlıdır.

Benim Linux/x 64 sistem:

$ getconf ARG_MAX
2097152

Bu nedenle, toplam değişken boyutu yaklaşık 2 MB ve argc taşma olamaz. Bu sınır argv ve bu ortamda toplam verilerin bir arada tedbirleri inanıyorum. Eğer bir komut çalıştırmayı denediğinizde bu sınırı aşarsanız, exec() E2BIG ile başarısız olur. man 2 execve:

E2BIG  The total number of bytes in the environment (envp) and argument
       list (argv) is too large.

Benim sistem ~2 megabayt sınırı diğer sistemlere göre nispeten cömert olduğuna inanıyorum. OS X sistemimi ~260KB sınırı raporları.

Ama eğer ARG_MAX çok büyük olsa ne olur?

Tamam, hadi eski/garip bir sistem üzerinde olduğunuzu düşünün, int 16 bit ve ARG_MAX iyi 2 bitti15aksi takdirde oldukça makul. Şimdi, 2'den daha fazla execve() çağırmak varsayalım15argümanlar. Uygulama iki seçenek vardır.

  1. Taşma argc... temelde, veri atmadan, mi işliyor beklenmeyen ve muhtemelen hatalı bir şekilde yürütür sağlama ve C standardı ihlal izin verebilirsiniz. En kötüsü de, hata asla biliyor olabilir çok sessiz.

  2. Ya da, sadece execve(), EOVERFLOW sadece bu çok parametre ile bir görüntü koşamaz bildiren dönebilirsiniz. Şimdi, POSIX / SUS standartları bu hata sonucu hakkında hiçbir şey söyleme... ama bu standart yazarların asla ARG_MAX INT_MAX daha büyük olması bekleniyor, çünkü sadece şüpheleniyorum.

#2 seçenektirsadecemakul seçenek. Eğer sistem bir şekilde seçenek #1, sonra seçersekırıkve bir hata raporu dosya gerekir.

Alternatif olarak, eski bir program 16 bitlik bir sistem için derlenmiş çalıştırmak için çalışıyor olabilir, ama emülatör veya uyumluluk katmanı bir tür üzerinden çalışıyor. Emülatör veya uyumluluk katmanı Eğer 2'den fazla geçirmek için çalıştığında bir hata mesajı verecek beklerdim15bir program için parametreleri.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007
  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • thenewboston

    thenewboston

    4 ŞUBAT 2008