Bagikan melalui


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