C 如何安全地从int转换为size\u t?
在GCC中将int指定给size_t(或在malloc中使用它)会产生以下警告: 警告:从“int”转换为“size\u t”可能会更改结果的符号[-Wsign conversion] 为了解决这个问题,我想将转换包装在一个函数中,该函数首先检查转换是否有效,然后执行强制转换 这就是我到目前为止所做的: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
/* 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中出现编译器警告,请将单个强制转换操作执行的操作限制为以下操作之一:
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。