Kesalahan Runtime C R6035
Microsoft Visual C++ Runtime Library, Error R6035 - Modul dalam aplikasi ini menginisialisasi cookie keamanan global modul sementara fungsi yang mengandalkan cookie keamanan tersebut aktif. Hubungi __security_init_cookie sebelumnya.
__security_init_cookie harus dipanggil sebelum penggunaan pertama cookie keamanan global.
Cookie keamanan global digunakan untuk perlindungan overrun buffer dalam kode yang dikompilasi dengan /GS (Buffer Security Check) dan dalam kode yang menggunakan penanganan pengecualian terstruktur. Pada dasarnya, pada entri ke fungsi yang dilindungi yang diserbu, cookie diletakkan di tumpukan, dan saat keluar, nilai pada tumpukan dibandingkan dengan cookie global. Setiap perbedaan di antara mereka menunjukkan bahwa buffer overrun telah terjadi dan menghasilkan penghentian segera program.
Kesalahan R6035 menunjukkan bahwa panggilan ke __security_init_cookie
dilakukan setelah fungsi yang dilindungi dimasukkan. Jika eksekusi berlanjut, penyerbuan buffer yang memuaskan akan terdeteksi karena cookie pada tumpukan tidak akan lagi cocok dengan cookie global.
Pertimbangkan contoh DLL berikut. Titik entri DLL diatur ke DllEntryPoint melalui opsi linker /ENTRY (Entry-Point Symbol). Ini melewati inisialisasi CRT yang biasanya akan menginisialisasi cookie keamanan global, sehingga DLL itu sendiri harus memanggil __security_init_cookie
.
// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
DllInitialize();
...
__try {
...
} __except()... {
...
}
}
void DllInitialize() {
__security_init_cookie();
}
Contoh ini akan menghasilkan kesalahan R6035 karena DllEntryPoint menggunakan penanganan pengecualian terstruktur dan oleh karena itu menggunakan cookie keamanan untuk mendeteksi overrun buffer. Pada saat DllInitialize dipanggil, cookie keamanan global telah dimasukkan ke tumpukan.
Cara yang benar ditunjukkan dalam contoh ini:
// Correct way to call __security_init_cookie
DllEntryPoint(...) {
__security_init_cookie();
DllEntryHelper();
}
void DllEntryHelper() {
...
__try {
...
} __except()... {
...
}
}
Dalam hal ini, DllEntryPoint tidak dilindungi dari overruns buffer (tidak memiliki buffer string lokal dan tidak menggunakan penanganan pengecualian terstruktur); oleh karena itu dapat dengan aman memanggil __security_init_cookie
. Kemudian memanggil fungsi pembantu yang dilindungi.
Catatan
Pesan kesalahan R6035 hanya dihasilkan oleh CRT debug x86, dan hanya untuk penanganan pengecualian terstruktur, tetapi kondisinya adalah kesalahan pada semua platform, dan untuk semua bentuk penanganan pengecualian, seperti C++ EH.