SORU
21 EYLÜL 2009, PAZARTESİ


Neden strncpy boş sonlandırmak değil mi?

strncpy() sözde tampon taşmaları önler. Ama eğer null bir sonlandırıcı olmadan taşma varsa engeller, tüm olasılık sonraki dize işlemi taşacak. Bu karşı korumak için kendimi yaparken buluyorum:

strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';

man strncpy verir:

Bu strncpy() fonksiyonu benzer, daha fazla n daha src bayt kopyalanan hariç. Eğer src ilk n byte arasında boş bayt yok, bu nedenle, sonuç boş sonlandırılmış olacak.

Boş olmadan bir şey görünüşte masum gibi sonlandırıcı:

   printf( "FOO: %s\n", dest );

...kaza olabilir.


strncpy() daha iyi, daha güvenli bir alternatif var mı?

CEVAP
21 EYLÜL 2009, PAZARTESİ


strncpy güvenli strcpy, başka bir ortasında bir dize eklemek için kullanılan olması gerekiyordu olarak kullanılmak üzere tasarlanmamıştır.

Tüm bu "güvenli" taşması açıkları azaltmak için daha sonra standartları eklenen düzeltmeleri snprintf vsnprintf gibi dize işleme işlevleri vb.

Wikipedia strncpy kendini güvende yazma alternatif olarak strncat söz:

*dst = '\0'; strncat(dst, src, LEN);

EDİT

Strncat boş ise uzun ya LEN char var eğer eşit bir dize sonlandırıcı zaman LEN karakterden uzun özledim.

Neyse, demek istediğim kullanarak strncat yerine herhangi bir homegrown çözüm gibi memcpy(..., strlen(...))/ne olursa olsun bu uygulama strncat olabilir hedef/platform optimize edilmiş bir kütüphane.

Elbette dst en azından nullchar tutan kontrol etmeniz gerekir, strncat doğru kullanmak gibi bir şey olur yani:

if(LEN) { *dst = '\0'; strncat(dst, src, LEN-1); }

Ben de strncpy eğer src n char, hedef dize kesilecek daha kısa olması durumunda, başka bir dizeye bir dize kopyalamak için pek kullanışlı değil, o admitt.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • boniver

    boniver

    17 NİSAN 2006
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011