警告 C6262
函数使用 constant_1 字节的堆栈:超过 /analyze:stacksize constant_2。 考虑将部分数据移到堆
备注
此警告指示在函数中已检测到使用的堆栈超过预设阈值 (constant_2)。 对于用户模式,此警告的默认堆栈帧大小为 16 KB,对于内核模式,为 1 KB。 即使在用户模式下,堆栈也受到限制,未能提交堆栈页面会导致堆栈溢出异常。 内核模式具有 12 KB 的堆栈大小限制,此值无法增加。 尝试在内核模式代码中主动限制堆栈的使用。
若要更正此警告背后的问题,可以将部分数据移到堆或其他动态内存中。 在用户模式下,一个大型堆栈帧可能不是问题(此警告可能会被抑制),但大型堆栈帧会增加堆栈溢出的风险。 (如果函数大量使用堆栈或者是递归的,则可能会出现大型堆栈帧。)如果实际发生堆栈溢出,用户模式下的总堆栈大小可能会增加,但只能达到系统限制。
对于内核模式代码(例如,在驱动程序项目中),constant_2 的值设置为 1 KB。 编写良好的驱动程序应该很少有函数接近此值,降低该限制可能是可取的。 用户模式代码用于减小堆栈大小的常规方法可能也适用于内核模式代码。
代码分析名称:EXCESSIVESTACKUSAGE
调整堆栈大小以抑制警告
可以使用 /analyze:stacksize
命令行选项更改 constant_2 的值,但增加它带来的风险是可能不会报告错误。
在命令行上抑制警告
- 将
/analyze:stacksize <new-size>
选项添加到编译器命令行。 为<new-size>
使用大于 constant_1 的值。 例如,如果 constant_1 为 27180,则可以输入/analyze:stacksize 32768
。
在 IDE 中抑制警告
在 Visual Studio IDE 中,选择“解决方案资源管理器”窗口中的项目。
在菜单栏上,选择“项目”>“属性” 。
在“属性页”对话框中,选择“配置属性”>“C/C++”>“命令行”属性页。
在“其他选项”中,添加
/analyze:stacksize <new-size>
,其中<new-size>
大于 constant_1。 例如,如果 constant_1 为 27180,则可以输入/analyze:stacksize 32768
。 选择“确定”以保存更改 。
示例
以下代码生成了此警告,因为 char buffer
在堆栈上需要 16,382 字节,而本地整数变量 i
另外还需要 4 个字节,加在一起就超过了默认堆栈大小限制 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...
}
以下代码通过将部分数据移到堆来更正此警告。
// 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);
}
}
使用 malloc
和 free
有很多隐患,例如内存泄漏和异常。 为了完全避免此类泄露和异常问题,请使用 C++ 标准库 (STL) 提供的机制。 其中包括 shared_ptr
、unique_ptr
和 vector
。 有关详细信息,请参阅智能指针和 C++ 标准库。