SORU
2 NİSAN 2010, Cuma


Kaçınılmalıdır / gereken standart kütüphaneden C işlevleri nelerdir?

Bazı C fonksiyonları olan stackoverflow üzerinde okudum 'eski' veya 'olması Kaçınılması'. Bana işlevleri bu tür sebebi bazı örnekler verebilir misiniz.

Ne alternatifler o işlevi var mı ?

Onları güvenli bir şekilde, herhangi bir iyi yöntemler kullanabilir miyiz ?

Daha sonra düzenlemek: Cevaplar:

  • alır: tampon taşmaları neden olabilir.
  • scanf: dizeleri için daha iyi olurdufgets(kullanarak ayrıştırma . kendini izledi ^strong>sscanfyastrchr).
  • sprintf(bunun yerine kullanınsnprintf)
  • strcat: kullanıcı giriş yerine kullanın . uğraşırken bunu önlemek ^strong>strncateğer strncat tuzaklar varsa bile.)
  • strcpy: kullanıcı giriş yerine kullanın . uğraşırken bunu önlemek ^strong>strncpyeğer strncopy tuzaklar varsa bile.)
  • strtok: iş parçacığı güvenli değil.

CEVAP
2 NİSAN 2010, Cuma


Kaldırılmış Fonksiyonları< / ^ br . . ben^>Güvensiz< / ^ br . Böyle bir işlev için mükemmel bir örnek hedef tampon nasıl anlatmanın yolu yok çünkü 0**. Sonuç olarak, giriş alır kullanarak okuyan herhangi bir program () buffer overflow vulnerability vardır. Benzer nedenlerle, bir strcat() strcpy() strncat() strncpy() kullanmak gerekir.

Henüz biraz daha fazla örnek tmpfile() mktemp() işlevi daha güvenli mkstemp() işlevi yerini potential security issues with overwriting temporary files ve nedeniyle vardır.

. ben^>Olmayan Desteklemeyeceğini< / ^ br . Diğer örnekler gethostbyaddr() gethostbyname() non-r (ve, bu nedenle, garantili iş parçacığı için güvenli) ve hep yerini desteklemeyeceğini getaddrinfo() freeaddrinfo().

Burada bir düzen olabilir... ya da güvenlik eksikliği (muhtemelen güvenli bir şekilde uygulanması için imza yeterince bilgi eklemek için başarısız olma) ya da non-reentrance admin ortak kaynaklarıdır.

. ben^>Eski, Olmayan Taşınabilir< / ^ br . Diğer bazı fonksiyonlar sadece işlevselliği çoğaltmak ve diğer türevleri gibi taşınabilir değildir, çünkü kaldırılmış olur. Örneğin, bzero() memset() lehine önerilmiyor.

İş parçacığı Güvenliği ve Reentrance< / ^ br . , İş güvenliği ve reentrance hakkında yazılan seni sordu. Küçük bir fark vardır. Bir işlevi, ortak değişken herhangi bir devlet kullanın olmasa da. Bu yüzden, örneğin, eğer tüm bilgileri ihtiyacı olduğunu kabul işlevi, ve herhangi bir tampon gerekli olduğunu da kabul işlevi yerine paylaşılan tüm aramalar için fonksiyonu), o zaman desteklemeyeceğini. Farklı konuları, bağımsız parametreleri kullanarak, yanlışlıkla devlet risk paylaşımı anlamına gelir. Yeniden kullanılabilirlik iş parçacığı güvenliği daha güçlü bir garantisidir. Bir işlevi ise, birden çok iş parçacığı tarafından aynı anda kullanılabilir iş parçacığı güvenli. Bir işlev, iş parçacığı güvenli

  • Evresel (yani görüşmeleri arasında herhangi bir durumu paylaşmak değil), ya da:
  • Olmayan desteklemeyeceğini, ancak senkronizasyon/shared devlet için gerektiğinde kilitleme kullanır.

Single UNIX Specification IEEE 1003.1 genel olarak, ("POSIX"), evresel garantisi olmayan herhangi bir işlevi iş parçacığı güvenli olmasını garanti edilmez. yani Yani, başka bir deyişle, desteklemeyeceğini garanti olan tek işlevleri portably çok iş parçacıklı uygulamalarda kullanılabilir harici kilitleme (olmadan). Bu standartlar edemiyor uygulamaları olmayan desteklemeyeceğini işlevi, bir iş parçacığı için güvenli yapmak için tercih, ancak anlamına gelmez. Örneğin, Linux sık garantisi (Tek UNIX Belirtimi ötesinde) threadsafety eklemek için olmayan evresel işlevler için senkronizasyon ekler.

Dizeleri (ve Bellek Arabellekleri, Genel olarak)< / ^ br . Ayrıca eğer dizeleri/diziler ile bazı temel kusuru olup olmadığını sordu. Bazıları bunun böyle olduğunu iddia edebilir, ama hayır, bu dilin temel kusur yoktur iddia ediyorum. C ve C, bir dizi uzunluğu/kapasite ayrı ayrı geçmesini gerektirir (bir değil ".uzunluğu" başka dillerde olduğu gibi özellik). Bu bir kusur, per-se değildir. Herhangi bir C ve C'nin doğru kod sadece gerekli bir parametre olarak uzunluğu geçerek yazabilirsiniz. Sorun bu bilgi gerekli birkaç API parametre olarak belirtmek için başarısız oldu. Ya MAX_BUFFER_SİZE sürekli bazı kullanılan olacağını düşünmüştüm. Bu API artık ve dizi/string boyutları belirlenir tampon/izin alternatif API tarafından onaylanmadı almıştır.

Scanf (Son sorunuza Cevap Olarak)< / ^ br . Kişisel olarak, kullandığım C iostreams Kütüphanesi (std::cin, std::print, << ve >> operatörler, std::getline, std::istringstream, std::ostringstream, vb.), genellikle bununla uğraşmak istemiyorum. Eğer saf C kullanmak zorunda olsam, yine de, kişisel olarak sadece strtol(), strtoul(), vs. ile birlikte fgetc() getchar() kullanırdım. ve işleri elle ayrıştırma, varargs veya biçim dizeleri büyük bir hayranı değilim beri. O, benim en iyi bildiğim için, [f]scanf(), [f]printf() vb ile sorun yok dedi. sürece zanaat biçim dizeleri kendinizi, hiç pas keyfi biçim dizeleri izin veya kullanıcı girdi olarak kullanılacak biçim dizeleri ve kullandığınız biçimlendirme makrolar tanımlanan <inttypes.h> uygun olan yerlerde. (Not snprintf() hedef arabelleğin boyutu ve biçimi dizeleri kullanmak belirtmek için başarısız ile bir ilgisi yoktur sprintf() ama) yerine kullanılmalıdır. O da, basit bir beşgen kullanmaktır-varargs olmadan biçimlendirme C , boost::format sağlar belirtmeliyim.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • Moodle

    Moodle

    11 Mayıs 2010
  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011