Aracılığıyla paylaş


Güvenli şablon aşırı yüklemeleri

Microsoft, güvenliği iyileştirilmiş sürümler için birçok C Çalışma Zamanı kitaplığı (CRT) işlevini kullanım dışı bırakmıştır. Örneğin, strcpy_s için strcpydaha güvenli bir değiştirmedir. Kullanım dışı bırakılan işlevler, belleğin üzerine yazabilen işlemleri engellemediğinden güvenlik hatalarının yaygın kaynaklarıdır. Varsayılan olarak, bu işlevlerden birini kullandığınızda derleyici bir kullanımdan kaldırma uyarısı üretir. CRT, daha güvenli varyantlara geçişi kolaylaştırmaya yardımcı olmak için bu işlevler için C++ şablonu aşırı yüklemeleri sağlar.

Örneğin, bu kod parçacığı kullanım dışı olduğundan strcpy bir uyarı oluşturur:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

Kullanımdan kaldırma uyarısı, kodunuzun güvenli olmayabileceğini belirten bir uyarıdır. Kodunuzun belleğin üzerine yazamadığını doğruladıysanız, birkaç seçeneğiniz vardır. Uyarıyı yoksaymayı seçebilir, uyarıyı engellemek için CRT üst bilgilerinin include deyimlerinden önce simgeyi _CRT_SECURE_NO_WARNINGS tanımlayabilir veya kodunuzu kullanacak strcpy_sşekilde güncelleştirebilirsiniz:

char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function

Şablon aşırı yüklemeleri daha fazla seçenek sağlar. 1 olarak tanımlarsanız _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES , daha güvenli varyantları otomatik olarak çağıran standart CRT işlevlerinin şablon aşırı yüklemelerini etkinleştirir. 1 ise _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES , kodunuzda değişiklik yapılması gerekmez. Arka planda, çağrısı strcpy otomatik olarak sağlanan boyut bağımsız değişkeniyle çağrısı strcpy_s olarak değiştirilir.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES , gibi strncpybir sayı alan işlevleri etkilemez. Sayı işlevleri için şablon aşırı yüklemelerini etkinleştirmek için 1 olarak tanımlayın _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT . Ancak bunu yapmadan önce kodunuzun arabellek boyutunu değil karakter sayısını geçirdiğinden emin olun (yaygın bir hata). Ayrıca, güvenli değişken çağrıldığında işlev çağrısından sonra arabelleğin sonuna açıkça null bir sonlandırıcı yazan kod gereksizdir. Kesme davranışına ihtiyacınız varsa bkz _TRUNCATE. .

Dekont

Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT için 1 olarak da tanımlanmış olması gerekir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES . 1 olarak tanımlanırsa ve _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 0 olarak tanımlanırsa_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT, uygulama herhangi bir şablon aşırı yüklemesi gerçekleştirmez.

1 olarak tanımladığınızda _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES , güvenli varyantların ("_s" ile biten adlar) şablon aşırı yüklemelerini etkinleştirir. Bu durumda, 1 ise _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES , özgün kodda küçük bir değişiklik yapılmalıdır:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Yalnızca işlevin adının değiştirilmesi gerekir ("_s" eklenerek); şablon aşırı yüklemesi, boyut bağımsız değişkenini sağlama işlemini üstlenir.

Varsayılan olarak ve _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 0 (devre dışı) olarak tanımlanır ve _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 (etkin) olarak tanımlanır.

Şablon aşırı yüklemeleri yalnızca statik diziler için çalışır. Dinamik olarak ayrılan arabellekler diğer kaynak kodu değişikliklerini gerektirir. Yukarıdaki örnekleri yeniden ziyaret edin:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; change it to
                       // strcpy_s(szBuf, 10, "test");

Ve bu örnek:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; change it to
                         // strcpy_s(szBuf, 10, "test");

Ayrıca bkz.

CRT'deki güvenlik özellikleri
C çalışma zamanı (CRT) ve C++ Standart Kitaplığı (STL) .lib dosyaları