gpt4 book ai didi

c - 如何安全地从 int 转换为 size_t?

转载 作者:太空狗 更新时间:2023-10-29 17:11:50 24 4
gpt4 key购买 nike

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

warning: conversion to 'size_t' from 'int' may change the sign of the result [-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;
}

我错过了什么吗?是否已经存在具有安全转换的库?

我能找到的最接近的是 Microsoft Intsafe.h , 但它似乎仅适用于 Win32 类型。

编辑 根据 chux 的评论修改。

最佳答案

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

  1. 截断或扩展
  2. 摒弃有符号或无符号
  3. 抛弃常量性或非常量性

size_t 始终是一个无符号类型,大到足以容纳一个 void 指针。类型转换自int 到 size_t 涉及两个强制转换操作:扩展,然后丢弃签名。

这里有两个函数在 GCC 4.8.3 上不会产生编译器警告(使用“-Wall -Werror -Wextra”)。它们内联返回失败(通过标记值),而不是在额外的返回参数中。

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);
}

关于c - 如何安全地从 int 转换为 size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27490762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com