运行时检查失败 #2 - 变量“结果”周围的堆栈已损坏

Posted

技术标签:

【中文标题】运行时检查失败 #2 - 变量“结果”周围的堆栈已损坏【英文标题】:Run-Time Check Failure #2 - Stack around the variable 'result' was corrupted 【发布时间】:2016-09-11 12:01:57 【问题描述】:

我已编译此代码并得到 运行时检查失败 #2 - 围绕变量“结果”的堆栈已损坏异常。但是当我将 result 数组大小从 2 更改为 4 时,异常消失了。你能解释为什么会这样吗? 抱歉,如果你觉得这个问题太简单了。

#include "stdafx.h"

string get_cpu_name()

    uint32_t data[4] =  0 ;
    _asm
    
        cpuid;
        mov data[0], ebx;
        mov data[4], edx;
        mov data[8], ecx;
    
    return string((const char *)data);

void assembler()

    cout << "CPU is " << get_cpu_name() << endl;

    float f1[] =  1.f , 22.f;
    float f2[] =  5.f , 3.f ;
    float result[2] =  0.f ;

    /*float f1[] =  1.f , 22.f , 1.f , 22.f ;
    float f2[] =  5.f , 3.f , 1.f , 22.f ;
    float result[4] =  0.f ;*/


    _asm
    
        movups xmm1, f1;
        movups xmm2, f2;
        mulps xmm1, xmm2;
        movups result, xmm1;
    

    /*for (size_t i = 0; i < 4; i++)*/
    for (size_t i = 0; i < 2; i++)
    
        cout << result[i] << "\t";
    
    cout << endl;




int main()

    assembler();
    getchar();
    return 0;

【问题讨论】:

我不熟悉SSE汇编,那么movups移动了多少字节? @immibis。如您所见,我也是 SSE 的新手。假设它取决于xmm1 的大小。 xmm1 的大小为 128 位。 在 x86 float 上的长度为 32b = 4B(答案为 2*4 的来源)。所以你可以使用float result[4]double result[2]double 是 64b)或uint8_t result[16] 来确保你有 16 个 bytes :) . @Ped7g。谢谢! 【参考方案1】:

movups 指令 writes 128 bits (16 bytes) to memory。您正在将其写入 8 字节数组(2*4 字节或 64 位)的位置。数组后面的 8 个字节也会被写入。

您应该确保至少有 16 个字节的空间来写入结果,或者您应该确保在那里写入的空间少于 16 个字节。

【讨论】:

以上是关于运行时检查失败 #2 - 变量“结果”周围的堆栈已损坏的主要内容,如果未能解决你的问题,请参考以下文章

运行时检查失败 #2 - 变量周围的堆栈已损坏

运行时检查失败 #2 - 变量“primes”周围的堆栈已损坏

运行时检查失败 #2 - 变量“l1”周围的堆栈已损坏

运行时检查失败 #2 - 变量“索引”周围的堆栈已损坏

运行时检查失败 #2 - 变量“cid1”周围的堆栈已损坏

运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏