C 如何安全地从int转换为size\u t?

C 如何安全地从int转换为size\u t?,c,casting,type-conversion,C,Casting,Type Conversion,在GCC中将int指定给size_t(或在malloc中使用它)会产生以下警告: 警告:从“int”转换为“size\u t”可能会更改结果的符号[-Wsign conversion] 为了解决这个问题,我想将转换包装在一个函数中,该函数首先检查转换是否有效,然后执行强制转换 这就是我到目前为止所做的: /* Convert int src to size_t dst. */ /* Assumes dst points to valid size_t address. */ int safe_s

在GCC中将int指定给size_t(或在malloc中使用它)会产生以下警告:

警告:从“int”转换为“size\u t”可能会更改结果的符号[-Wsign conversion]

为了解决这个问题,我想将转换包装在一个函数中,该函数首先检查转换是否有效,然后执行强制转换

这就是我到目前为止所做的:

/* Convert int src to size_t dst. */
/* Assumes dst points to valid size_t address. */
int safe_size_t_from_int(size_t *dst, int src) {
    if(src < 0) return SAFE_ERROR_NEGATIVE;
    if(SIZE_MAX < INT_MAX) {
        if(src > (int)SIZE_MAX) return SAFE_ERROR_OVERFLOW;
    }
    *dst = (size_t)src;
    return SAFE_SUCCESS;
}
/*将int src转换为size\t dst*/
/*假设dst指向有效的大小地址*/
int-safe_-size_-t_-from_-int(size_-t*dst,int-src){
如果(src<0)返回安全错误负;
如果(尺寸最大值<内部最大值){
如果(src>(int)SIZE\u MAX)返回安全错误\u溢出;
}
*dst=(尺寸)src;
回归成功;
}
我遗漏了什么吗?是否已经存在具有安全转换的库

我能找到的最接近的东西是,但它似乎只适用于Win32类型


编辑根据chux的注释进行修改。

为避免GCC中出现编译器警告,请将单个强制转换操作执行的操作限制为以下操作之一:

  • 截断或扩展
  • 抛弃有符号的或无符号的
  • 丢弃常数或非常数
  • size\u t始终是一个无符号类型,其大小足以容纳空指针。铸造 int到size_t涉及两个强制转换操作:扩展,然后强制转换

    这里有两个函数在GCC4.8.3上不产生编译器警告(带“-Wall-Werror-Wextra”)。它们以内联方式(通过sentinel值)返回失败,而不是在额外的返回参数中

    int size_t2int(size_t val) {
        return (val <= INT_MAX) ? (int)((ssize_t)val) : -1;
    }
    
    size_t int2size_t(int val) {
        return (val < 0) ? __SIZE_MAX__ : (size_t)((unsigned)val);
    }
    
    int size\u t2int(size\t val){
    
    返回(val@iharob-好吧-但我还是不明白你为什么需要打字it@Carlise因为某些函数采用size\u t,例如int。检查它是否合适是一件好事。我被教导在强类型语言(如C)中,您应该始终从不同类型强制转换,而不仅仅是假设编译器将为您下载。一个原因是要注意编译器警告。我还被教导启用所有警告并处理每一个警告。其中一个原因是,如果您在一大群人中收到一个您认为合适的新警告,您可能会错过它。@WeatherVane:这肯定是一个人们不同意的领域,但我想说,您不应该在必要时。强制转换是一种代码气味(通常是bug)而且到处都有免费的强制转换,这使得检查错误的强制转换的工作要多得多。@n.m.第三方库给了我一个int大小,我想malloc那么多字节,但是malloc需要一个size\u t。除了sentinel返回之外,int2size似乎和我的函数做了几乎相同的事情。但是,它假设int\u MAX是的,这个代码假设(sizeof(size_t)>=sizeof(int))。我想可能有一个平台测试失败,但我不知道有一个平台。对于像我这样不知道ssize_t的人,可以保证保存至少从-1到size_MAX的值。因此将val转换为ssize_t可以消除无符号的ness。