VisualStudio2013C++项目有一个/GS开关以在运行时启用缓冲区安全检查验证。自升级到VS2013以来,我们遇到了更多的STATUS_STACK_BUFFER_OVERRUN错误,并且怀疑这与新编译器中改进的缓冲区溢出检查有关。我一直在尝试验证这一点并更好地了解如何检测缓冲区溢出。即使由语句更新的内存仅更改同一范围内堆栈上另一个局部变量的内容,也会报告缓冲区溢出,这让我感到困惑!因此,它不仅必须检查更改不会损坏不属于局部变量“拥有”的内存,而且该更改不会影响除分配给单个更新语句引用的局部变量之外的任何局部变量。这是如何运作的?自VS2010以来它是否发生了变化?编辑:这是
什么是字节溢出?当我从C程序生成的LLVM中间表示中转储x86ASM时,会出现大量溢出,通常为4字节大小。我无法弄清楚它们为什么会发生以及它们取得了什么成就。他们似乎“切断”了堆栈的一部分,但以一种不同寻常的方式:##thisfragmentcomesfromaCprogramrightbeforeamalloc()calltoastruct.##thereareotherspillsindifferentcircumstancesinthissameprogram,soit##isnotrelatedexclusivelytomalloc()...subESP,84movEAX,60
例如,当我们调用递归函数时,连续的调用存储在堆栈中。但是,由于错误,如果它无限继续,错误是“段错误”(如在GCC上看到的)。不应该是“堆栈溢出”吗?那么两者的基本区别是什么?顺便说一句,解释会比维基百科链接更有帮助(经历了那个,但没有回答特定查询)。 最佳答案 堆栈溢出是[a]原因,段错误是结果。至少在x86和ARM上,“堆栈”是为放置局部变量和函数调用的返回地址而保留的一block内存。当堆栈耗尽时,将访问保留区域之外的内存。但是应用程序并没有向内核请求这block内存,因此会生成一个SegFault用于内存保护。
以下代码为我生成堆栈溢出错误intmain(intargc,char*argv[]){intsieve[2000000];return0;}我该如何解决这个问题?我正在使用TurboC++,但想将我的代码保留在C中编辑:感谢您的建议。上面的代码只是举例,我实际上在函数中声明了数组,而不是在submain中。另外,我需要将数组初始化为零,所以当我搜索malloc时,我发现calloc非常适合我的目的。Malloc/calloc也比在堆栈上分配的优点是允许我使用变量来声明大小。 最佳答案 您的数组太大而无法放入堆栈,请考虑使用堆:int
最近引起了很多关注,有符号整数溢出在C和C++中是官方未定义的。但是,给定的实现可以选择定义它;在C++中,一个实现可以将std::numeric_limits::is_modulo设置为true以指示有符号整数溢出对于该类型是明确定义的,并且像无符号整数一样进行换行。VisualC++将std::numeric_limits::is_modulo设置为true。这几乎不是一个可靠的指标,因为GCC多年来一直将此设置为true并且具有未定义的有符号溢出。直到本周早些时候,我从未遇到过VisualC++的优化器除了对有符号整数提供环绕行为之外所做的任何事情。我发现了一种情况,如果将INT
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Howdopromotionrulesworkwhenthesignednessoneithersideofabinaryoperatordiffer?我试图在C++中解决整数提升和溢出问题。我对以下几点感到有些困惑:a)如果我有以下代码段:inti=-15;unsignedj=10;std::cout我退出-5%UINT_MAX。这是因为表达式i+j自动提升为无符号吗?我试图阅读标准(4.13):——任何无符号整数类型的秩应等于相应有符号整数类型的秩。我不确定我是否读错了,但如果这是真的,为什么i+j以无符
这更像是一个设计问题(我知道为什么会这样,只是想看看人们如何处理它)。假设我有一个简单的链表struct:structList{inthead;std::shared_ptrtail;};shared_ptr允许在多个列表之间共享子列表。但是,当列表变得很长时,其析构函数中可能会发生堆栈溢出(由shared_ptrs的递归释放引起)。我尝试过使用显式堆栈,但这变得非常棘手,因为一个尾部可以由多个列表拥有。如何设计我的List来避免这个问题?更新:澄清一下,我不是在重新发明轮子(std::forward_list)。上面的List只是真实数据结构的简化版。真正的数据结构是一个有向无环图,
我的程序经常需要执行以下计算:给定:N是一个32位整数D是一个32位整数abs(N)D!=0X是任意值的32位整数查找:X*N/D作为一个舍入整数,X缩放为N/D(即10*2/3=7)显然我可以直接使用r=x*n/d,但我经常会从x*n得到溢出。如果我改为执行r=x*(n/d),那么我只会得到0或x,因为整数除法会丢弃小数部分。然后是r=x*(float(n)/d)但在这种情况下我不能使用float。准确度会很好,但不如速度和确定性函数重要(在相同的输入下总是返回相同的值)。N和D目前已签名,但如果有帮助,我可以解决它们始终未签名的问题。适用于任何X值(以及N和D,只要N目前我正在使用
我创建了一个使用new递归创建自身的类(只是为了好玩!),预计由于无限动态分配(堆)这将抛出std::bad_alloc溢出)。但是发生堆栈溢出而不是std::bad_alloc。为什么会这样?classOverflow{private:Overflow*overflow;public:Overflow(){overflow=newOverflow();}};intmain(){Overflowoverflow_happens;//stackoverflowhappensinsteadofstd::bad_allocexeption}@Caleth询问如果我将newOverflow()
我有下面列出的代码,当我运行它时它会报告堆栈溢出。我使用传递值到showTest()。我期望的是它将Test结构的拷贝复制到堆栈(推送到堆栈),然后在函数调用结束时Test结构将被释放(从堆栈中弹出)。所以我打了三遍。它应该压入堆栈并在每个函数调用结束时弹出。如果每次调用函数时它都插入堆栈并从堆栈中弹出,我看不到任何堆栈问题。但是,当我运行此代码时,它会在main的第一行报告堆栈溢出异常。(我使用VisualStudio2017。)如果我删除showTest()函数调用之一,那么我可以让它工作。非常感谢任何反馈。#includestructTest{staticintUserid;in