首页 > 解决方案 > 如何正确检查在 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 类型的各自大小做出假设。

标签: cposix

解决方案


我也不能对 off_t 和 size_t 类型的各自大小做出假设。

要比较可比较范围没有明确关联的混合有符号类型,请转换为uintmax_t.


一旦代码知道有符号 fsize >= 0为真,转换为宽的无符号类型uintmax_t肯定不会缩小fsize值并消除警告。

if (fsize >= 0 && (uintmax_t) fsize <= SIZE_MAX) {

如果强制转换uintmax_t为不必要的宽,我希望编译器仍能发出高效的代码。


推荐阅读