Kelebihan beban templat yang aman
Microsoft telah menghentikan banyak fungsi pustaka Runtime C (CRT) demi versi yang ditingkatkan keamanannya. Misalnya, strcpy_s
adalah penggantian yang lebih aman untuk strcpy
. Fungsi yang tidak digunakan lagi adalah sumber umum bug keamanan, karena tidak mencegah operasi yang dapat menimpa memori. Secara default, pengkompilasi menghasilkan peringatan penghentian saat Anda menggunakan salah satu fungsi ini. CRT menyediakan kelebihan beban templat C++ untuk fungsi-fungsi ini untuk membantu memudahkan transisi ke varian yang lebih aman.
Misalnya, cuplikan kode ini menghasilkan peringatan karena strcpy
tidak digunakan lagi:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Peringatan penghentian ada untuk memberi tahu Anda bahwa kode Anda mungkin tidak aman. Jika Anda telah memverifikasi bahwa kode Anda tidak dapat menimpa memori, Anda memiliki beberapa pilihan. Anda dapat memilih untuk mengabaikan peringatan, Anda dapat menentukan simbol _CRT_SECURE_NO_WARNINGS
sebelum menyertakan pernyataan untuk header CRT untuk menekan peringatan, atau Anda dapat memperbarui kode Anda untuk menggunakan strcpy_s
:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Kelebihan beban templat memberikan lebih banyak pilihan. Jika Anda mendefinisikan _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
ke 1, itu memungkinkan kelebihan beban templat fungsi CRT standar yang memanggil varian yang lebih aman secara otomatis. Jika _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
adalah 1, maka tidak ada perubahan pada kode Anda yang diperlukan. Di balik layar, panggilan ke strcpy
diubah ke panggilan ke strcpy_s
dengan argumen ukuran yang disediakan secara otomatis.
#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
tidak memengaruhi fungsi yang mengambil hitungan, seperti strncpy
. Untuk mengaktifkan kelebihan beban templat untuk fungsi hitungan, tentukan _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT
ke 1. Namun, sebelum melakukannya, pastikan kode Anda melewati jumlah karakter, bukan ukuran buffer (kesalahan umum). Selain itu, kode yang secara eksplisit menulis terminator null di akhir buffer setelah panggilan fungsi tidak perlu jika varian aman dipanggil. Jika Anda memerlukan perilaku pemotongan, lihat _TRUNCATE
.
Catatan
Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT
mengharuskan yang _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
juga didefinisikan sebagai 1. Jika _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT
didefinisikan sebagai 1 dan _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
didefinisikan sebagai 0, aplikasi tidak akan melakukan kelebihan beban templat apa pun.
Ketika Anda mendefinisikan _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
ke 1, itu memungkinkan kelebihan beban templat dari varian aman (nama yang berakhiran "_s"). Dalam hal ini, jika _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
adalah 1, maka satu perubahan kecil harus dilakukan pada kode asli:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
// ...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Hanya nama fungsi yang perlu diubah (dengan menambahkan "_s"); kelebihan beban templat mengurus penyediaan argumen ukuran.
Secara default, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
dan _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT
didefinisikan sebagai 0 (dinonaktifkan) dan _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
didefinisikan sebagai 1 (diaktifkan).
Templat kelebihan beban hanya berfungsi untuk array statis. Buffer yang dialokasikan secara dinamis memerlukan perubahan kode sumber lainnya. Mengunjungi kembali contoh di atas:
#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");
Dan contoh ini:
#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");
Baca juga
Fitur keamanan di CRT
File runtime C (CRT) dan C++ Standard Library (STL) .lib
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk