Tag: 溢出

C中的无符号溢出

考虑以下C代码: #include uint32_t inc(uint16_t x) { return x+1; } 当使用gcc-4.4.3在纯x86_64系统上使用标志-std = c99 -march = core2 -msse4.1 -O2 -pipe -Wall进行编译时,它会生成 movzwl %di,%eax inc %eax retq 现在,在C中预测无符号溢出。我不太了解x86_64汇编,但据我所知,16位参数寄存器被移动到32位寄存器,该寄存器递增并返回。 我的问题是,如果x == UINT16_MAX怎么办。 会发生溢出,标准规定x + 1 == 0,对吗? 但是,如果%eax是一个32位寄存器,它现在包含UINT16_MAX + 1,这是不正确的。 这让我在这里连接一个问题:是否有一种可移植的方法来禁用C中的无符号溢出,这样编译器就可以假设存储在大寄存器中的小变量的高位始终为0(所以它不需要清除它们)? 如果不是(或者如果解决方案在语法上是令人讨厌的),至少在GCC中有没有办法做到这一点? 非常感谢您的宝贵时间。

最有效的便携式溢出检测?

可能重复: 乘数大,如何捕获溢出 接近C,C ++和D等金属语言,最有效的合理可移植方式(即使用汇编程序,虽然你可以假设两个补码运算和环绕行为)来检测无符号64位的溢出乘法上的整数?

这种情况是否足以在乘法中进行溢出检查

int isOverflow(uint a, uint b) { // a and b are unsigned non-zero integers. uint c = a * b; if (c b ? a : b)) return 1; else return 0; } 我错过了什么吗? 我认为上面的代码片段会起作用。 编辑 :我已经看到其他解决方案,如大数字的乘法,如何捕获溢出 ,使用一些奇特的方法来检查它。 但对我来说,简单的解决方案也看起来正确。 这就是我问这个问题的原因。

黑客挑战 – 在代码中查找漏洞

我的朋友最近完成了一次黑客挑战并将其发送给我(二进制和源代码)。 我之前想问他提示,因为我想自己做:) 我一直在经历它,但我正在努力找到这个漏洞。 #include #include #include #include static void usage(const char *argv0) { printf(“Build your own string!\n”); printf(“\n”); printf(“Usage:\n”); printf(” %s length command…\n”, argv0); printf(“\n”); printf(“Each command consist of a single character followed by it’s index.\n”); printf(“\n”); printf(“Example:\n”); printf(” %s 11 h0 e1 l2 l3 o4 w6 o7 r8 l9 d10\n”, argv0); exit(1); } int […]

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

不,这不是如何检测整数溢出的重复? 。 问题是一样的,但问题是不同的。 gcc编译器可以优化掉溢出检查(使用-O2),例如: int a, b; b = abs(a); // will overflow if a = 0x80000000 if (b < 0) printf("overflow"); // optimized away gcc人认为这不是一个错误。 根据C标准,溢出是未定义的行为,它允许编译器执行任何操作 。 显然, 任何事情都包括假设溢出永远不会发生。 不幸的是,这允许编译器优化掉溢出检查。 最近的CERT文件中描述了检查溢出的安全方法。 本文建议在添加两个整数之前执行类似的操作: if ( ((si1^si2) | (((si1^(~(si1^si2) & INT_MIN)) + si2)^si2)) >= 0) { /* handle error condition */ } else { sum = […]

整数溢出的概念

int溢出如何工作。 我的意思是问如果发生溢出,整数值的最终结果是什么? 我需要在纸上理解它。 就像我给出了一个多项选择题: 11 ^ 5产生: 一个。 12 湾 14 C。 15 d。 17。 我知道答案是(b)14 ,但想知道为什么?

C:如何防止使用scanf溢出输入?

我对C比较陌生,想知道如何防止输入溢出…… 例如,我有: scanf(“%d”, &a); 其中a是整数。 那么我能做些什么来阻止某人输入一个大于最大整数的数字呢? 由于我正在处理的问题的限制,你必须使用scanf 。 我如何限制输入? 提前致谢。

如何用环绕或溢出减去两个无符号整数

有两个无符号整数(x和y)需要减去。 x总是大于y。 但是,x和y都可以环绕; 例如,如果它们都是字节,则在0xff之后变为0x00。 问题是如果x环绕,而y则没有。 现在x似乎小于y。 幸运的是,x不会缠绕两次(只保证一次)。 假设字节,x已经包装并且现在是0x2,而y没有并且是0xFE。 x – y的正确答案应该是0x4。 也许, ( x > y) ? (xy) : (x+0xff-y); 但我认为还有另一种方式,涉及2s赞美?在这个嵌入式系统中,x和y是最大的unsigned int类型,因此添加0xff …是不可能的 编写语句的最佳方法是什么(目标语言是C)?

如何确定分配的C缓冲区的大小?

我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量。 char *buffer = (char *)malloc(sizeof(char) * 10); 做一个 int numElements = sizeof(buffer); 不回10,有关如何实现这一点的任何想法?