gpt4 book ai didi

c++ - 哪些整数运算是不安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:52 25 4
gpt4 key购买 nike

我的应用程序计算用户指定的一些整数表达式。我想检测所有潜在的错误并报告它们。

所有计算都在 int64_t 中完成(签)。公式可能包括几乎所有的 C++ 二元运算符(+-*/%|||&、|1045,7915| 和六个比较运算符)和整数(可能是负数)。

问题是:在计算这样的表达式时可能会发生什么错误,从而使我的程序终止?我想到了其中两个:

  1. 除以零(或模数)
  2. &&减 -1。

有符号整数溢出也可能发生,但据我所知,在这种设置下它不会对大多数 CPU 造成任何危害,因此我们忽略它。

最佳答案

这是一个很好的引用:https://wiki.sei.cmu.edu/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow

正如它所解释的,有符号整数溢出是未定义的行为。您可能认为这无关紧要,因为您已经观察到 INT64_MAX + x 在您的特定系统上没有做任何奇怪的事情。您可能还认为它永远不会做任何奇怪的事情,因为优化器无法知道 x 的值。

但是未定义的行为仍然是未定义的,在许多其他可能的结果中,某些平台可能会终止您的程序(您说过要避免),因为它们在硬件中实现了溢出捕获或算术异常。

要编写对有符号整数进行算术运算的符合标准的 C++ 程序,您必须首先检查它们的值。一种可能足够好的廉价且简单的方法是在添加或减去之前简单地检查每个整数是否在 [INT64_MIN/2, INT64_MAX/2] 范围内。有关更详细的方法,请参见此处:How to detect integer overflow?

关于c++ - 哪些整数运算是不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50837044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com