草庐IT

C++ 11 正则表达式堆栈溢出/VS2012

我正在将一些较旧的Boost正则表达式代码转换为C++11,我偶然发现了我的一个测试用例的问题。这是一个使用std::regex导致堆栈溢出异常的场景,但使用boost::regex时效果很好。我没有更改正则表达式模式,并且已验证该模式是我想要的。似乎这个特定的字符串输入片段导致堆栈溢出。使用VS2012,x64调试构建:std::regexregx("(^|\\})(([^\\{:])+:)+([^\\{]*\\{)");conststd::stringtestinput="COLOR:#000;BACKGROUND-COLOR:#FFF;FONT-FAMILY:VERDANA,AR

c++ - 没有溢出的无限递归 - 这可能吗?

栈溢出的原因是栈空间用完了,但是如果函数没有参数,没有数据压栈呢?这仍然留下插入“返回”地址,但在预期无限递归的情况下,这是不必要的。所以我想问的是......是否可以使用某种调用约定,调用不会在堆栈上放置任何内容,只是跳转到第一条指令并执行,前提是最终指令将是对函数的另一个调用,直到最终执行终止?理想情况下,是否可以使用函数指针和动态链接来实现?只是说明一下,我指的是一个接受单个参数且不返回任何内容的函数,因此从技术上讲fastcall就足够了,但它仍然保留了一个要返回的地址,这最终会导致溢出。可以通过某种方式避免这种情况吗?另一个我之前没有提到的重点,我不是指单个函数的递归,例如在

c++ - C++ 字符串和流缓冲区溢出安全吗?

如果我使用std::cin、std::cout和std::string,是否存在有人利用缓冲区溢出的任何可能性?我问这个是因为我仍然看到很多人仍然使用以null结尾的字符串而不是C++中的标准容器。 最佳答案 你仍然看到人们在C++中使用C字符串的一个重要原因(除了不了解字符串,或者被困在C思维模式之外)是std::istream::getline适用于char指针而不是字符串。图书馆的许多其他部分也是如此。部分原因是“您无需为未使用的内容付费”。IE:只想获取一行文本的人不必实例化string(因此还必须引入另一个模板类)才能这样

c++ - 做一个有潜在溢出的乘法然后用除法验证有什么问题吗?

假设我有两个size_t变量,我需要将它们相乘并得到size_t的结果。size_tfirst=...;size_tsecond=...;size_tresult=first*second;它们可能会溢出,所以我需要检查一下。“干净”的方法是首先使用除法检查乘法是否可行:if(second!=0&&first>((size_t)-1)/second){//handleoverflow}//proceedwithcomputingfirst*second看似不太“干净”的方法是先乘,再用除法检查结果:size_tresult=first*second;if(second!=0&&resu

c++ - 是否有可能在多次乘法**溢出**后得到一个数字的原始值?

总结:有没有办法做到这一点?这就是我的意思:假设我有一个unsignedint数字。然后我乘以它几次(并且有溢出,这是预期的)。那么是否可以“还原”原始值?详细信息:都是关于Rabin-Karprollinghash的.我需要做的是:我有一个长字符串的哈希值——例如:“abcd”。然后我有一个较短的子字符串的散列-例如“cd”。如何使用给定的两个哈希值以O(1)计算“ab”哈希值?我现在拥有的算法:从“abcd”散列中减去“cd”散列(从多项式中删除最后一个元素)将“abcd”散列除以p^len("cd"),其中p是基数(质数)。所以这是:a*p^3+b*p^2+c*p^1+d*p^0

c++ - 没有有用且可靠的方法来检测 C/C++ 中的整数溢出?

不,这不是Howtodetectintegeroverflow?的拷贝.问题是一样的,但问题是不同的。gcc编译器可以优化溢出检查(使用-O2),例如:inta,b;b=abs(a);//willoverflowifa=0x80000000if(bgcc的人认为这不是一个错误。根据C标准,溢出是未定义的行为,它允许编译器做任何事情。显然,任何事情都包括假设永远不会发生溢出。不幸的是,这允许编译器优化溢出检查。最近的CERTpaper中描述了检查溢出的安全方法。.本文建议在添加两个整数之前做这样的事情:if(((si1^si2)|(((si1^(~(si1^si2)&INT_MIN))+

c++ - 堆栈溢出 : Duplicate temporary allocation in stack space?

structMemBlock{charmem[1024];MemBlockoperator*(constMemBlock&b)const{returnMemBlock();}}global;voidfoo(intstep=0){if(step==10000){global=global*MemBlock();}elsefoo(step+1);}intmain(){foo();return0;}ProgramreceivedsignalSIGSEGV,Segmentationfault.0x08048510infoo(step=4000)att.cpp:1212voidfoo(intst

c# - system.stackoverflowexception 无法计算表达式,因为当前线程处于堆栈溢出状态

当代码遇到此函数时,我收到System.StackOverFlowException。其中stringtype是用户定义的元组,等于类型库中的int函数。publicstaticboolEquals(StringTypeleftHand,StringTyperightHand){if(leftHand==rightHand){returntrue;}if((leftHand=="0")||(rightHand=="0")){returnfalse;}return(leftHand.myValue.Equals(rightHand.myValue)&&leftHand.myState.E

windows - 我不明白调用堆栈中重复 DispatchMessageW 的堆栈溢出错误

这是一个Delphi应用程序,但我想这是一个一般的Windows编程问题。我让我的应用程序在周末继续运行(在DelphiIDE中),然后回来发现堆栈溢出。栈是这样开始的……:75c4417ekernel32.GetDriveTypeW+0x23:75c452aekernel32.IsProcessorFeaturePresent+0xa9:75c45272kernel32.IsProcessorFeaturePresent+0x6d:75c45248kernel32.IsProcessorFeaturePresent+0x43:7678410bKERNELBASE.LoadString

windows - 如何禁用 Visual C++ 运行时中的缓冲区溢出检查?

我和一个fewthousandotherpeople,正在收到MicrosoftVisualC++运行时抛出的错误:为了搜索引擎的利益,他说:MicrosoftVisualC++RuntimeLibraryBufferoverrundetected!Program:%sAbufferoverrunhasbeendetectedwhichhascorruptedtheprogram'sinternalstate.Theprogramcannotsafelycontinueexecutionandmustnowbeterminated.现在我明白了什么是缓冲区溢出,以及为什么这是一件坏事。