C6262

警告 C6262:函数使用了堆栈中的 <constant> 字节:超过了 /analyze:stacksize<constant>。请考虑将某些数据移到堆中

此警告指出在函数内检测到了超出预设阈值 (constant 2)的堆栈使用率。此警告的默认值堆栈帧范围是用户模式 16 KB,核心架构 1 KB。堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。核心架构具有 12 KB 堆栈大小限制,不能递增;因此,内核模式代码应积极限制堆栈使用。

若要更正此警告后的问题,您可以将一些数据移至堆或移动到其他动态内存。在用户模式下,大量堆栈帧可能不是问题,此警告可能是因为堆栈帧增加堆栈溢出的风险。(如果函数大量使用堆栈或递归可能会产生大量堆栈帧。)如果堆栈溢出出现用户模式总的堆栈大小将增加,但是只会增加到系统限制。可以使用 /analyze 命令行选项更改 <constant 2>的值,但是增加该值引入了错误不会报告的风险。

内核模式代码 (例如,驱动程序 <constant 2> 的值设置为 1 KB。正确编写的驱动程序应具有处理此值的少量功能,并且可以更改下限。用于用户模式代码减少堆栈大小的相同技术可以适用于核心架构代码。

示例

下面的代码生成此警告,因为 char buffer 分配 16382 个字节,而局部整数变量 i 又分配 4 个字节,两者合起来超过了 16K 字节的默认堆栈大小限制:

// 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++)C++ 标准库参考

若要通过调整堆栈大小来更正此警告

  1. 在菜单栏上选择“项目”、“属性”。

    将显示**“属性页”**对话框。

  2. 展开“配置属性”。

  3. 展开 “C/C++”。

  4. 选择 “命令行” 属性。

  5. 在“附加选项”中添加 /analyze:stacksize16388

请参见

任务

如何:使用本机运行时检查

参考

/STACK(堆栈分配)

_resetstkoflw