草庐IT

c++ - 为什么 std::regex_iterator 会导致此数据的堆栈溢出?

我一直在使用std::regex_iterator来解析日志文件。我的程序已经运行了几个星期并且已经解析了数百万行日志,直到今天,当今天我针对日志文件运行它并出现堆栈溢出时。事实证明,只有日志文件中的一个日志行导致了问题。有谁知道为什么我的正则表达式会导致如此大规模的递归?这是一个显示问题的独立小程序(我的编译器是VC2012):#include#include#includeusingnamespacestd;std::wstringtest=L"L3T1535679726859[CreateRegistryAction]CreatingREGISTRYAction:\n"L"Ide

c++ - 这个检测整数加法溢出的函数真的有用吗?

在阅读thisquestion的评论时,我发现了一个指向comp.lang.cFAQ的链接这显示了一个据称检测整数溢出的“仔细加法函数”:intchkadd(inta,intb){if(INT_MAX-b如果b==-1,这如何不溢出?如果假设a和b都是正数,为什么要让它们成为int而不是unsignedint第一名? 最佳答案 OP已确定INT_MAX-b可能会溢出,从而使剩余代码无法进行适当的溢出检测。它不起作用。if(INT_MAX-b无UB检测溢出的方法如下:intis_undefined_add1(inta,intb){re

c++ - __int128 @ 最小负值的 UDL(用户定义文字)整数溢出

为了清楚和简单起见,我将缩短以下数字:−170,141,183,460,469,231,731,687,303,715,884,105,728为-170…728170,141,183,460,469,231,731,687,303,715,884,105,727为170…727这些数字表示128位有符号整数(gcc中的__int128)的最小值和最大值。我为这种数据类型实现了用户定义的文字(原始文字),因为gcc不提供定义这种类型常量的方法:_u128forunsigned__int128和_i128为__int128。减号不是UDL的一部分,而是应用于UDL结果的一元减号运算符。因此

c++ - 在 C/C++ 中允许有符号整数溢出

我希望有符号整数在变得太大时溢出。如何在不使用下一个最大数据类型(或者当我已经在int128_t时)的情况下实现这一目标?例如,使用8位整数19*12通常是260,但我想要结果111100100,第9位被截断,因此是-27。 最佳答案 C中未定义有符号溢出,that'sforreal.一种解决方案如下:signed_result=(unsignedint)one_argument+(unsignedint)other_argument;上述解决方案在从unsigned到int的最终转换中涉及实现定义的行为,但不调用未定义的行为。对于

c++ - 如何用 pthread 捕获堆栈溢出?

我有一个C++应用程序,它有很多线程,其中大多数线程的堆栈大小为32k。问题是有时我会遇到stackoverflow,我想检测哪个线程导致了stackoverflow并将其写入日志文件,问题是我无法捕获它。我阅读了有关SIGSEGV的内容,并且我能够仅在没有线程的情况下捕获此信号。我还尝试使用pthread_sigmask()并使用libsigsegv但我也失败了。谁能给我一个关于在线程中发生堆栈溢出时捕获SIGSEGV的小示例? 最佳答案 在大多数情况下,为多线程应用程序捕获堆栈溢出与为单线程应用程序捕获堆栈溢出没有任何不同。它可

c++ - 为什么 C++ 下溢/溢出行为被视为未定义?

我知道整数下溢和上溢是未定义的。但是,考虑到C++最终编译为汇编,行为实际上没有定义吗?按位表示保持不变,整数格式保持不变0111..11将始终滚动到1000..00,下溢也是如此,那么为什么它不被视为已定义的行为?关于汇编编译,我是从我们在学校学到的基本汇编中推导出来的,但是代码块给出了intx=INT_MAX;inty=x+1;编译为00401326movl$0x7fffffff,0x8(%esp)0040132Emov0x8(%esp),%eax00401332inc%eax00401333mov%eax,0xc(%esp)现在,不管x的值如何,总有一个inc或add指令吗?那么

c++ - 模数是否溢出?

我知道(INT_MIN/-1)会溢出,但(INT_MIN%-1)不会。至少这是在两个编译器中发生的情况,一个是c++11之前的版本(VC++2010),另一个是c++11之后的GCC4.8.1intx=INT_MIN;cout给予:-21474836480这个行为标准是定义的还是实现定义的?还有除法运算会溢出的其他情况吗?模运算符是否会溢出? 最佳答案 根据CERTC++SecureCodingStandard模jarcanoverflow它说:[...]Overflowcanoccurduringamodulooperationw

C++ long 过早溢出

我在使用C++时遇到了一个奇怪的问题,长数据类型在它应该溢出之前很久就溢出了。我正在做的(到目前为止已经成功)是让整数表现得像float,因此范围[-32767,32767]被映射到[-1.0,1.0]。它绊倒的地方是更大的参数表示大于1.0的float:inlinelongtimes(longa,longb){printf("a=%ldb=%ld",a,b);a*=b;printf("a*b=%ld",a);a/=32767l;printf("a*b/32767=%ld\n",a);returna;}intmain(void){printf("%ld\n",times(98301l,

c++ - 导致除法溢出错误 (x86)

我有几个关于x86或x86_64架构上的除法溢出错误的问题。最近我一直在阅读有关整数溢出的内容。通常,当算术运算导致整数溢出时,会设置FLAGS寄存器中的进位位或溢出位。但显然,根据thisarticle,除法运算产生的溢出不会设置溢出位,而是触发硬件异常,类似于除以零时。现在,除法导致的整数溢出比乘法要少得多。只有几种方法可以触发除法溢出。一种方法是做类似的事情:int16_ta=-32768;int16_tb=-1;int16_tc=a/b;在这种情况下,由于有符号整数的补码表示,不能在16位有符号整数中表示正数32768,所以除法运算溢出,导致错误值为-32768。几个问题:1)

c++ - 你能举一个C++中堆栈溢出的例子吗?

您能举一个C++中堆栈溢出的例子吗?除了递归情况:voidfoo(){foo();} 最佳答案 不涉及无限递归的典型情况是在堆栈上声明一个过大的自动变量。例如:intfoo(){intarray[1000000];} 关于c++-你能举一个C++中堆栈溢出的例子吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1657484/