草庐IT

c++ - 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义?

C标准明确指定有符号整数溢出具有未定义行为。然而,大多数CPU使用已定义的溢出语义实现有符号算术(除法溢出可能除外:x/0和INT_MIN/-1)。编译器编写者一直在利用这种溢出的未定义性来添加更积极的优化,这些优化往往会以非常微妙的方式破坏遗留代码。例如,此代码可能在较旧的编译器上工作,但在当前版本的gcc和clang上不再适用:/*Incrementabyavaluein0..255,clampatopositiveintegers.Thecoderelieson32-bitwrap-around,buttheCStandardmakessignedintegeroverflowu

c++ - 如何检测 c/c++ 程序中可能/潜在的堆栈溢出问题?

是否有一种标准方法可以查看您的应用有多少堆栈空间以及在运行期间堆栈使用的最高水位线是多少?同样在实际溢出的可怕情况下会发生什么?它会崩溃、触发异常或信号吗?是否有标准,或者所有系统和编译器都不同?我正在专门寻找Windows、Linux和Macintosh。 最佳答案 在Windows上会产生堆栈溢出exception。下面的windows代码说明了这一点:#include#includevoidStackOverFlow(){CONTEXTcontext;//weareinterestedcontrolregistersconte

c++ - Valgrind 报告段溢出

使用valgrind/callgrind运行我的程序时,我经常收到以下消息:==21734==线程#1中的brk段溢出:无法增长到0x4a39000(地址不同)请注意,它前面没有堆栈溢出消息。我找不到有关此消息的任何文档,我也不知道究竟是什么溢出。谁能帮我找出问题所在?这是valgrind的问题,还是我的程序的问题? 最佳答案 第1327行,来自valgrindsourcecode指向用户手册,“请参阅用户手册中的限制部分”:Limitssectionitem1:OnLinux,Valgrinddeterminesatstartup

c++ - 由于内存损坏,整数溢出是否会导致未定义的行为?

我最近读到C和C++中的有符号整数溢出会导致未定义的行为:Ifduringtheevaluationofanexpression,theresultisnotmathematicallydefinedornotintherangeofrepresentablevaluesforitstype,thebehaviorisundefined.我目前正在尝试了解此处未定义行为的原因。我认为这里发生了未定义的行为,因为当整数变得太大而无法适应基础类型时,它开始操纵自身周围的内存。所以我决定在VisualStudio2015中编写一个小测试程序,使用以下代码测试该理论:#include#incl

json - IE8 原生 JSON.parse 错误导致堆栈溢出

TL;DR:将任何非内置函数添加到Array.prototypeANDFunction.prototype将导致IE8原生JSON解析器在解析任何包含数组的JSON时发生堆栈溢出,但仅当您还将reviver函数传递给JSON.parse()。这开始是一个问题,但我回答了我自己的原始问题,所以现在我要问:任何人都可以想到一个解决这个IE8错误的方法,它不涉及消除所有修改Array.js的JS库。原型(prototype)和Function.prototype?原问题:我有大约13k的JSON数据要解析。数据的结构是一个具有单个值的对象,它是一个嵌套数组。{'value':[[stuff]

java - Java有缓冲区溢出吗?

Java有缓冲区溢出吗?如果是,你能给我一些场景吗? 最佳答案 由于Java字符串基于char数组并且Java会自动检查数组边界,因此缓冲区溢出仅在不寻常的情况下可能发生:如果你通过JNI调用原生代码在JVM本身中(通常用C++编写)解释器或JIT编译器无法正常工作(Java字节码强制边界检查) 关于java-Java有缓冲区溢出吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions

c++ - 有符号整数溢出在 C++ 中仍然是未定义的行为吗?

据我们所知,signedintegeroverflowisundefinedbehavior.但是在C++11cstdint文档中有一些有趣的东西:signedintegertypewithwidthofexactly8,16,32and64bitsrespectivelywithnopaddingbitsandusing2'scomplementfornegativevalues(providedonlyiftheimplementationdirectlysupportsthetype)Seelink这是我的问题:因为标准明确规定对于int8_t、int16_t、int32_t和i

c++ - 在 C/C++ 中检测有符号溢出

乍一看,这个问题可能与Howtodetectintegeroverflow?重复,但实际上有很大不同。我发现虽然检测无符号整数溢出非常简单,但在C/C++中检测有符号溢出实际上比大多数人想象的要困难。最明显但最幼稚的方法是:intadd(intlhs,intrhs){intsum=lhs+rhs;if((lhs>=0&&sumrhs)){/*anoverflowhasoccurred*/abort();}returnsum;}问题在于,根据C标准,有符号整数溢出是未定义的行为。换句话说,根据标准,一旦你甚至导致有符号溢出,你的程序就像您取消引用空指针一样无效。所以不能导致未定义的行为,

c++ - 为什么#include <string> 在这里防止堆栈溢出错误?

这是我的示例代码:#include#includeusingnamespacestd;classMyClass{stringfigName;public:MyClass(conststring&s){figName=s;}conststring&getName()const{returnfigName;}};ostream&operator如果我注释掉#include我没有收到任何编译器错误,我猜是因为它包含在#include中。.如果我在MicrosoftVS中“右键单击-->转到定义”,它们都指向xstring中的同一行文件:typedefbasic_string,allocato

c++ - 为什么使用 GCC 在 x86 上整数溢出会导致无限循环?

以下代码在GCC上进入无限循环:#includeusingnamespacestd;intmain(){inti=0x10000000;intc=0;do{c++;i+=i;cout0);cout所以这里是交易:有符号整数溢出在技术上是未定义的行为。但是x86上的GCC使用x86整数指令实现整数运算-溢出时换行。因此,我原以为它会在溢出时换行——尽管它是未定义的行为。但显然情况并非如此。那么我错过了什么?我使用以下代码编译:~/Desktop$g++main.cpp-O2GCC输出:~/Desktop$./a.out5368709121073741824-2147483648000..