运行时检查失败 #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 - 变量“结果”周围的堆栈已损坏的主要内容,如果未能解决你的问题,请参考以下文章