2010-04-29 5 views
21

MSVC'nin "güvenli" sprintf işlevleriyle yanlış güvenlik algısı, hedef arabellek boyutunu 'bilen' bir şablon sürümüne sahiptir. Ancak bu kod mutlu bytes bitiminden sonra yığını üzerinde 567890 ..."snprintf_s"

char bytes[5]; 
_snprintf_s(bytes, _TRUNCATE, "%s", "1234567890"); 

yanlış ne herhangi bir fikir boyalar veya bu bilinen bir hatadır?

(ı VS2005 çalışıyorum - 2008 veya 2010 yılında test etmedi)

+2

Güzel bul, göründü. –

+2

Ouch! Bu utanç verici bir şey. – bobince

cevap

21

O a bug in Visual C++ 2005 gibi görünen (sorun bu bağlantı alma yaşıyorum; Google also has it cached).

Ben 2008 ve 2010, dize doğru kesilir Visual C++, Visual C++ 2005'te sorunu yeniden başardı ( bytes 1234\0 içerir) ve beklendiği gibi -1 döndürülür.

+3

Teşekkürler! Görünüşe göre hata raporu MS Connect sitesinden kayboldu ... – xtofl

-6

Örnek hatalıydı.

kodu olmalıdır: Yanlış kodu için

char bytes[5]; 
_snprintf_s(bytes, 5, _TRUNCATE, "%s", "1234567890"); 

, o olabilir derleyici herhangi bir uyarı vermedi ama snprintf için zayıf kontrol olacağını bir hata.

+9

-1: Hem eski hem de cevaplı olan soru, 'char' dizisini içeren '_snprintf_s' aşırı yüklenmesinden bahsediyor. . Boyutu alması gerekmez çünkü boyut parametresinden boyut alabilir. Bunun dışında VC 2005, bu kırıldı. –

1

Örnek gerçekten doğrudur. sürümüyle birlikte -

Microsoft Visual Studio 2005 
Version 8.0.50727.867 (vsvista.050727-8600) 
... 
Visual C++ 77626-009-0000007-41722 

- SP1'i, manzara düzeltmeyi ve kütüphane düzeltmeleri birkaç içerir - yukarıda belirtilen fonksiyon

template <size_t size> 
int _snprintf_s(
    char (&buffer)[size], 
    size_t count, 
    const char *format [, 
     argument] ... 
); 

hala arabası olduğunu. Ancak, asıl büyüleyici olduğunu 4 varyant fonksiyonlarının sadece bu fonksiyon

  • TAMAM: int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • Buggy: template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
  • TAMAM: int _snwprintf_s (geniş karakter sürümü)
  • TAMAM: template <size_t size> int _snwprintf_s (Evet, geniş karakter sürümü TAMAM)

buggy, biri templa kullanıyorsa te sürümü tamam ve eğer geniş karakterli versiyonlardan birini kullanıyorsan, o da iyi. Şaşırtıcı.