簡體   English   中英

如何安全地從int轉換為size_t?

[英]How can I convert to size_t from int safely?

在GCC中將int賦給size_t(或在malloc中使用它)會產生以下警告:

警告:從'int'轉換為'size_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;
}

我錯過了什么嗎? 是否存在已安裝轉換的庫?

我能找到的最接近的東西是Microsoft Intsafe.h ,但它似乎只適用於Win32類型。

編輯修改按照chux'評論。

要避免GCC中的編譯器警告,請將單個強制轉換操作執行的操作限制為以下之一:

  1. 截斷或擴展
  2. 拋棄簽名或無簽名
  3. 拋棄常數或非常數

size_t始終是一個無符號類型,足以容納void指針。 從int到size_t的轉換涉及兩個強制轉換操作:extend,然后拋棄signed-ness。

這兩個函數在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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM