【发布时间】:2018-11-23 00:35:32
【问题描述】:
我的应用程序计算用户指定的一些整数表达式。我想检测所有潜在的错误并报告它们。
所有计算都在int64_t(签名)中完成。公式可能包含几乎所有 C++ 二元运算符(+、-、*、/、%、|、||、&、&& 和六个比较运算符)和整数(可能是负数)。
问题是:在评估可能导致我的程序终止的表达式时,可能会发生哪些错误?我想出了其中两个:
- 除以零(或模数)
-
std::numeric_limits<int64_t>::min()除以 -1。
也可能发生有符号整数溢出,但据我所知,在这种设置下,它不会对大多数 CPU 造成任何有害影响,因此我们忽略它。
【问题讨论】:
-
CPU 不(直接)相关。你的 CPU 不知道 C++。重要的是编译器对您的代码做了什么,它很可能会将其转换为仅在不发生溢出时才有效的东西。
-
有符号整数溢出导致未定义行为。它可能是无害的,也可能会召唤nasal demons。
-
IIRC 转移负数也有一个棘手的部分,但无论如何你都不允许
<</>>。 -
@KavehVahedipour 运算符用于内置类型?扔?..
-
@IvanSmirnov 他们可能会。如果您非常担心非法数学运算,您绝对应该关心 UB,即溢出。
标签: c++ arithmetic-expressions