一般来说,如何防止C语言中发生整数溢出?

Ami*_*emi 7 c integer-overflow

一般来说,如何防止C编程语言中发生整数溢出?我的意思是,有什么功能可以防止吗?最后,整数溢出是否会让我像缓冲区溢出等那样被黑客攻击?

gna*_*729 7

假设您有两个 int 值 a、b,并且您想要检查 a+b 是否不会产生上溢或下溢。

\n

有两种情况:\xe2\x89\xa5 0 和\xe2\x89\xa4 0。在第一种情况下,不能出现下溢。如果 b > INT_MAX - a,则发生溢出。在第二种情况下,你不能有溢出。如果 b < INT_MIN - a,则可能会发生下溢。作为单个表达式:

\n
a >= 0 ? b > INT_MAX - a : b < INT_MIN - a\n
Run Code Online (Sandbox Code Playgroud)\n


Lun*_*din 1

每当你声明一个整型变量时:

  1. 实际考虑它包含的数字有多大/有多小。
  2. 实际考虑是否需要签名或不签名。未签名通常问题较少。
  3. 选择能够满足上述要求的最小类型(intn_t或其他口味,如果您愿意)。uintn_tstdint.h...fast_t
  4. 如果需要,请提出包含变量将保存的最大和/或最小值的整数常量,并在进行算术时对照这些常量进行检查。

也就是说,不要不假思索地int在代码中漫无目的地发送垃圾邮件。

除了溢出之外,有符号类型也可能因其他原因而出现问题,即每当您需要进行按位算术时。为了避免上溢/下溢和意外的有符号按位算术,您还需要了解各种隐式整数类型提升规则。


整数溢出是否会让我像缓冲区溢出等那样被黑客攻击?

事实并非如此,但如果有人意识到的话,任何错误当然都可以被利用——正如您在几乎每个电脑游戏中看到的那样。