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ızargc
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
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.
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.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 aslaARG_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.
Hangi Taşma tarzı kullanmalıyım (kitle...
Nasıl iOS CSS taşma kaydırma çubuğunu ...
Nasıl olursa çarparak iki sayı Java ta...
Artırmak için nasıl yığın taşma hatası...
Nasıl ifade taşma önlemek için. * B - ...