Peringatan C6262
Fungsi menggunakan constant_1 byte tumpukan: melebihi /analyze:stacksize constant_2. Pertimbangkan untuk memindahkan beberapa data ke tumpukan
Keterangan
Peringatan ini menunjukkan bahwa penggunaan tumpukan yang melebihi ambang batas prasetel (constant_2) telah terdeteksi dalam fungsi. Ukuran bingkai tumpukan default untuk peringatan ini adalah 16 KB untuk mode pengguna, 1 KB untuk mode kernel. Stack—bahkan dalam mode pengguna—terbatas, dan kegagalan untuk menerapkan halaman tumpukan menyebabkan pengecualian luapan tumpukan. Mode kernel memiliki batas ukuran tumpukan 12 KB, yang tidak dapat ditingkatkan. Cobalah untuk secara agresif membatasi penggunaan tumpukan dalam kode mode kernel.
Untuk memperbaiki masalah di balik peringatan ini, Anda dapat memindahkan beberapa data ke timbunan atau ke memori dinamis lainnya. Dalam mode pengguna, satu bingkai tumpukan besar mungkin tidak menjadi masalah—dan peringatan ini dapat ditekan—tetapi bingkai tumpukan besar meningkatkan risiko luapan tumpukan. (Bingkai tumpukan besar mungkin terjadi jika fungsi menggunakan tumpukan dengan berat atau rekursif.) Ukuran tumpukan total dalam mode pengguna dapat ditingkatkan jika luapan tumpukan benar-benar terjadi, tetapi hanya hingga batas sistem.
Untuk kode mode kernel—misalnya, dalam proyek driver—nilai constant_2 diatur ke 1 KB. Driver yang ditulis dengan baik harus memiliki beberapa fungsi yang mendekati nilai ini, dan mengubah batas ke bawah mungkin diinginkan. Teknik umum yang sama yang digunakan untuk kode mode pengguna untuk mengurangi ukuran tumpukan dapat disesuaikan dengan kode mode kernel.
Nama analisis kode: EXCESSIVESTACKUSAGE
Sesuaikan ukuran tumpukan untuk menekan peringatan
Anda dapat menggunakan /analyze:stacksize
opsi baris perintah untuk mengubah nilai untuk constant_2, tetapi meningkatkannya menimbulkan risiko bahwa kesalahan mungkin tidak dilaporkan.
Untuk menekan peringatan pada baris perintah
/analyze:stacksize <new-size>
Tambahkan opsi ke baris perintah pengkompilasi. Gunakan nilai untuk<new-size>
nilai yang lebih besar dari constant_1. Misalnya, jika constant_1 adalah 27180, Anda dapat memasukkan/analyze:stacksize 32768
.
Untuk menekan peringatan dalam IDE
Di Ide Visual Studio, pilih proyek di jendela Penjelajah Solusi.
Pada bilah menu, pilih Properti Proyek>.
Dalam kotak dialog Halaman Properti, pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.
Di Opsi tambahan, tambahkan
/analyze:stacksize <new-size>
, di mana<new-size>
lebih besar dari constant_1. Misalnya, jika constant_1 adalah 27180, Anda dapat memasukkan/analyze:stacksize 32768
. Pilih OK untuk menyimpan perubahan.
Contoh
Kode berikut menghasilkan peringatan ini karena char buffer
memerlukan 16.382 byte pada tumpukan, dan variabel i
bilangan bulat lokal memerlukan 4 byte lain, yang bersama-sama melebihi batas ukuran tumpukan default 16 KB.
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
Kode berikut mengoreksi peringatan ini dengan memindahkan beberapa data ke timbunan.
// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char *buffer;
i = 0;
buffer = (char *) malloc( MAX_SIZE );
if (buffer != NULL)
{
buffer[0] = '\0';
// code...
free(buffer);
}
}
Penggunaan malloc
dan free
memiliki banyak perangkap, seperti kebocoran memori dan pengecualian. Untuk menghindari kebocoran semacam ini dan masalah pengecualian sama sekali, gunakan mekanisme yang disediakan oleh C++ Standard Library (STL). Ini termasukshared_ptr
, unique_ptr
, dan vector
. Untuk informasi selengkapnya, lihat Smart Pointer dan Pustaka Standar C++.
Lihat juga
/STACK
(Alokasi tumpukan)
_resetstkoflw
Cara: Menggunakan pemeriksaan run-time asli