c - 如何正确检查在 C 中转换为 size_t 时 off_t 值不会溢出?
问题描述
我需要将 off_t 变量转换为 size_t 变量,并且我想检测是否可能发生溢出。在 C.
我最初的尝试如下所示:
off_t fsize;
size_t len;
...
if(fsize >= 0 && fsize <= SIZE_MAX) {
len = (size_t)fsize;
} else {
abort();
}
但是,编译器不喜欢我在有符号和无符号类型之间的比较 (fsize <= SIZE_MAX)。我也不能对 off_t 和 size_t 类型的各自大小做出假设。
解决方案
我也不能对 off_t 和 size_t 类型的各自大小做出假设。
要比较可比较范围没有明确关联的混合有符号类型,请转换为uintmax_t
.
一旦代码知道有符号 fsize >= 0
为真,转换为宽的无符号类型uintmax_t
肯定不会缩小fsize
值并消除警告。
if (fsize >= 0 && (uintmax_t) fsize <= SIZE_MAX) {
如果强制转换uintmax_t
为不必要的宽,我希望编译器仍能发出高效的代码。
推荐阅读
- python - ___tmp___/惩罚?作为回应
- php - 同一个查询laravel中的两个条件
- machine-learning - 如果转置卷积层接受 3 通道输入并给出 2 通道输出,它将有多少个内核,为什么?
- blockchain - ehtereum 智能合约从另一个合约中批准支出者
- flutter - 交互式查看器将滚轮输入更改为滚动
- javascript - 我的 javascript 不工作,但我的验证器说我的代码很好,并且没有语法错误,我该怎么办?
- c# - 当用户按下取消按钮时,如何回滚对在另一个(详细信息)表单中进行的绑定 WinForms DataGridView 行的更改?
- java - org.openqa.selenium.NoSuchSessionException:会话 ID 为空错误
- java - JavaFx,如何将 ObservableMap 插入 TableView?
- python - BS4 MemoryError: stack overflow and EOFError: Ran out of input when using multiprocessing in python