Tag: 整数溢出

使用argc = 0执行进程

是否可以执行argc = 0的进程? 我需要执行一个程序,但它的argc等于0是非常重要的。有没有办法做到这一点? 我试图在命令行中放置2 ^ 32个参数,使其看起来好像argc = 0但是参数数量有一个最大限制。

整数溢出与减法

好的,所以我需要实现一个返回零或一的方法,具体取决于xy是否导致溢出。 Example: subTract(0x80000000,0x80000000) = 1, subTract(0x80000000,0x70000000) = 0, 我不是在寻找这种方法的实现。 我不明白哪一个应该导致溢出,并且几乎不可能开始。 为什么其中一个会导致溢出? 什么定义了减法溢出。 假设系统使用2的补码和32位的整数表示

C中的乘法溢出

我正在做一些安全性CTF练习,并且遇到了这个问题。 这是已编译程序的C源代码: int main(int i, long **a) { if(*a[1] * 0x1064deadbeef4601u == 0xd1038d2e07b42569u) //exec shell return 0; } 困扰我的事情: 当我关闭gcc标志时,长**主参数将无法编译,因此我无法在计算机上重现问题。 这是一个使用不同的编译器吗? 编译程序在CTF服务器上运行正常。 在测试相等性之前,程序在乘法过程中反复溢出。 我尝试使用线性同余方程(mod 2 ^ 64)和扩展的欧几里德算法来找到所需的x输入,但这对我不起作用。 有人可以帮我解决这个问题吗? 我试图找到* a [1],正确的程序参数。 在gdb中反汇编主要给出: (gdb) disas main Dump of assembler code for function main: 0x000000000040050c : push %rbp 0x000000000040050d : mov %rsp,%rbp 0x0000000000400510 : sub $0x10,%rsp 0x0000000000400514 […]

在C表达式中发生整数溢出时会发生什么?

我有以下C代码: uint8_t firstValue = 111; uint8_t secondValue = 145; uint16_t temp = firstValue + secondValue; if (temp > 0xFF) { return true; } return false; 这是替代实现: uint8_t firstValue = 111; uint8_t secondValue = 145; if (firstValue + secondValue > 0xFF) { return true; } return false; 第一个例子很明显, uint16_t类型足以包含结果。 当我在OS / X上使用clang编译器尝试第二个示例时,它正确返回true。 那里发生了什么? 是否有某种临时的 ,更大的类型来包含结果?

C ++ while循环优化不能正常工作

我有这段代码: #include int main(int argc, const char** argv) { int a = argv[0][0]; int b = argv[0][1]; while ((a >= 0) && (a < b)) { printf("a = %d\n", a); a++; } return 0; } 我用gcc-4.5 -02 -Wstrict-overflow=5编译它。 编译器向我大吼大叫warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp […]

重复排列:避免溢出

背景: 鉴于n球,使得: ‘a’ balls are of colour GREEN ‘b’ balls are of colour BLUE ‘c’ balls are of colour RED … (当然a + b + c + … = n ) 可以安排这些球的排列数量由下式给出: perm = n! / (a! b! c! ..) 问题1:我如何“优雅地”计算perm以尽可能避免整数溢出,并确保当我完成计算时,我要么具有正确的perm值,要么我知道最终结果会溢出吗? 基本上,我想避免使用像GNU GMP这样的东西。 可选地,问题2:这是一个非常糟糕的主意,我应该继续使用GMP吗?

为什么以下程序会发生溢出?

void main () { int i; if (i < 0) { i = -i; }; } 任何人都可以帮我理解为什么在上述程序中可能出现溢出?

找到两个值的平均值的正确方法是什么?

我最近了解到整数溢出是C中未定义的行为(侧面问题 – 它是否也是C ++中的UB?) 通常在C编程中,您需要找到两个值a和b的平均值。 但是,执行(a+b)/2会导致溢出和未定义的行为。 所以我的问题是 – 在C中找到两个值a和b的平均值的正确方法是什么?

检测uint64_t整数溢出与C的乘法

是否有任何有效且可移植的方法来检查C中的int64_t或uint64_t操作数的乘法运算何时溢出? 例如,为了添加uint64_t,我可以这样做: if (UINT64_MAX – a < b) overflow_detected(); else sum = a + b; 但我无法得到一个类似的乘法相似的简单表达式。 对我来说,所有这一切都将操作数分解为高和低uint32_t部分,并在检查溢出时执行这些部分的乘法,这些内容非常难看,也可能效率低下。 更新1 :添加了一些实现多种方法的基准代码 更新2 :添加了Jens Gustedt方法 基准程序: #include #include #include #define N 100000000 int d = 2; #define POW_2_64 ((double)(1 << 31) * (double)(1 << 31) * 4) #define calc_b (a + c) // #define calc_b (a + d) […]

如何处理嵌入式C中的包装计数器

我需要处理一个计数器,让我为我的申请打勾。 计数器是32位,所以我需要知道的是如何在它包装时处理它。 例如: 我有一个函数返回一个(timestamp + shifttime),我有另一个函数,它将返回1或0,这取决于时间是否已经过去,但我的计数器可能会包装如何处理这个? 。 谢谢 非常感谢所有回复的人。 我将在此编辑中提供更多详细信息。 我使用的是STM32 Cortex-M3。 我想使用RTC计数器将其用作我的应用程序的滴答,以安排需要在特定时间间隔发生的任务。 RTC可以产生溢出中断,因此检测中断不是问题。 我遇到的主要问题(或者至少我认为是一个问题)是某些任务获得(时间戳+class次),即。 int main( void ) { FlashLedTimeStamp = ReturnCounter( 20 ); // currentcounter value + a shift of 20 StatusLedTimeStamp = ReturnCounter( 3 ); // currentcounter value + a shift of 3 //then later on …. while(1) { /* other tasks […]