草庐IT

c++ - 避免包装器 DLL 中的堆栈溢出

我有一个要添加全屏后处理效果的程序。我没有该程序的源代码(它是专有的,尽管开发人员确实向我发送了调试符号的拷贝,.map格式)。我已经编写并运行了效果代码,没问题。我现在的问题是将两者联系起来。到目前为止,我尝试了两种方法:使用Detours修改原程序的导入表。这很好用并且保证稳定,但我与之交谈过的用户对此并不满意,它需要安装(除了提取存档之外),并且根据条款使用Detours修补程序是否有效存在一些问题最终用户许可协议(protocol)。因此,该选项已被淘汰。另一种选择是传统的DLL替换。我已经包装了OpenGL(opengl32.dll),我需要程序来加载我的DLL而不是系统拷贝

c++ - 如果你有另一个因素和溢出的产品,你如何计算一个因素?

a*x=b我有一个看似相当复杂的乘法/imul问题:如果我有a和b,如果它们都是32位双字(例如0-1=FFFFFFFF、FFFFFFFF+1=0),我如何计算x)?例如:0xcb9102df*x=0x4d243a5d在那种情况下,x是0x1908c643。我发现了一个类似的问题,但前提不同,我希望有一个比给出的解决方案更简单的解决方案。 最佳答案 数字具有模乘逆模2的幂,当且仅当它们是奇数。其他一切都是经过位移的奇数(即使是零,也可能是任何东西,所有位都被移出)。所以有几种情况:给定a*x=btzcnt(a)>tzcnt(b)无解

c++ - C++中的自动溢出检测?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:BestwaytodetectintegeroverflowinC/C++当我在C++中使用大量数字编写代码时,我常常无法判断何时发生溢出,即使我使用的是longlong或其他64位数据类型。有没有比观察错误值更有效的方法来检测何时发生溢出?

c++ - 避免并行递归异步算法中的递归模板实例化溢出

这个问题通过一个简化的例子更容易解释(因为我的真实情况远非“最小”):给定...templatevoidpost_in_thread_pool(T&&f)...函数模板,我想创建一个具有树状递归结构的并行异步算法。我将使用std::count_if编写以下结构的示例作为占位符。我将要使用的策略如下:如果我检查的范围长度小于64,我将回到顺序std::count_if功能。(0)如果它大于或等于64,我将在线程池中生成一个作业,该作业在范围的左半部分递归,并在当前线程上计算范围的右半部分。(1)我将使用原子共享int“等待”计算两半。(2)我将使用原子共享int累积部分结果。(3)简化代

c++ - 创建一个自定义整数,强制始终在指定范围内;如何克服整数溢出?

如题。作为练习,我想创建一个int来对其值施加约束,并且不允许将其设置为指定范围之外的值。这是我尝试解决这个问题的方法:#include#include#includeusingnamespacestd;intmain();templateclassConstrainedValue{valtypeval;staticboolcheckval(valtypeval){returnminvalval=val;return*this;}operatorconstvaltype&()//Notneededherebutcanbe;safesinceitreturnsaconstreferenc

c++ - **有符号**正整数的一元减运算符何时会导致溢出?

通常,INT_MIN是-2^n而INT_MAX是2^n-1是否可以保证,如果x是positive类型的int则expressoin-x没有不会导致溢出? 最佳答案 它是隐式保证的,因为它对所有允许的签名形式都是正确的:(以16位int为例)1的补码,INT_MIN=-32767,INT_MAX=32767二进制补码,INT_MIN=-32768,INT_MAX=32767符号和大小,INT_MIN=-32767,INT_MAX=32767不允许使用其他形式。正如我们所见,对于所有允许的形式,abs(INT_MIN)>=abs(INT

c++ - (如何)你如何处理 C++ 代码中可能出现的整数溢出?

时不时地,尤其是在对某些代码库进行64位构建时,我注意到在很多情况下都可能出现整数溢出。最常见的情况是我做这样的事情://CreatesaQPixmapoutofsomeblockofdata;thisfunctioncomesfromlibraryAQPixmapcreateFromData(constchar*data,unsignedintlen);conststd::vectorbuf=createScreenShot();returncreateFromData(&buf[0],buf.size());//事情是std::vector::size()很好地返回了一个size_

使用shellcode的缓冲区溢出练习

我正在对C程序上的缓冲区过载进行练习,该问题的目的是将根外壳插入程序中,以获取根壳。这就是我到目前为止所拥有的:步骤1.首先,让我们在文件中查看我的C代码file.c:root@kali:~#cat./file.c#include#includevoidpremio(){printf("Ihavealteredtheprogramsflow\n");}intmain(intargc,char*argv[]){charbuffer[100];if(argc!=2){printf("Use:%sargument\n",argv[0]);return-1;}strcpy(buffer,argv[1]

c++ - 如何抑制来自 UBsan 的一些无符号整数溢出错误?

我的大部分-fsanitize=unsigned-integer-overflow错误都是错误,但有时我会按预期明确使用它,这会导致UBSan产生误报。有没有办法为特定表达式关闭UBSan无符号整数溢出检查?编辑以回应Shafik评论,这里是一个例子:unsigneda=0;unsignedb=a-1;//error:unsignedintegeroverflow大多数时候这是一个错误,有时不是。有了UBSan,人们可以发现每次发生的错误,修复错误,但我还没有找到消除误报的方法。编辑2:要启用检查,需要通过-fsanitize=integer(启用所有整数检查)或fsanitize=u

c++ - 循环中的 Stroustrup 和溢出 size_type

我正在阅读BjarneStroustrup的“使用C++的编程原则和实践”,我需要对我在第25.5.3节中发现的令人惊讶的部分进行澄清。作者声称如果我们想遍历std::vector,然后使用像这样的循环变量for(vector::size_typei=0;i不如对vector使用迭代器安全类:for(vector::iteratorp=v.begin();p!=v.end();++p)因为,作为无符号类型,i可能会溢出。他指出使用迭代器的循环没有这样的限制。我有点困惑,因为我了解到size_type保证足够大以表示可能的最大vector,因此size_type类型的变量永远不会在这样的