ngx_atoi
聲明在 src/core/ngx_string.h
ngx_int_t ngx_atoi(u_char *line, size_t n);
?定義在?src/core/ngx_string.c
ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n == 0) {return NGX_ERROR;}cutoff = NGX_MAX_INT_T_VALUE / 10;cutlim = NGX_MAX_INT_T_VALUE % 10;for (value = 0; n--; line++) {if (*line < '0' || *line > '9') {return NGX_ERROR;}if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {return NGX_ERROR;}value = value * 10 + (*line - '0');}return value; }
函數簽名?
ngx_int_t ngx_atoi(u_char *line, size_t n)
u_char *line
:待轉換的字符串指針size_t n
:字符串有效長度(避免依賴'\0'終止符)返回值 :
- 如果成功,返回轉換后的整數值。
- 如果失敗(例如字符串包含非數字字符或超出整數范圍),返回
NGX_ERROR
。功能
該函數的作用是將一個長度為
n
的字符串轉換為一個整數,并確保轉換過程中不會發生溢出。
1. 參數檢查?
if (n == 0) {return NGX_ERROR; }
檢查輸入字符串的長度是否為 0。
如果長度為 0,則無法進行任何轉換,直接返回錯誤。
這是最基本的邊界條件檢查,防止后續邏輯因無效輸入而崩潰。
2. 定義變量并計算溢出閾值?
ngx_int_t value, cutoff, cutlim; cutoff = NGX_MAX_INT_T_VALUE / 10; cutlim = NGX_MAX_INT_T_VALUE % 10;
變量說明 :
value
:用于存儲當前累積的整數值。
cutoff
:整數最大值除以 10 的結果。
cutlim
:整數最大值對 10 取余的結果。
NGX_MAX_INT_T_VALUE
:當前平臺的整型最大值定義在 src/core/ngx_config.h
#define NGX_MAX_INT_T_VALUE 9223372036854775807
在每次累加之前,通過比較當前值與
cutoff
和cutlim
來判斷是否會溢出。這種方法避免了直接進行溢出操作導致未定義行為。
遍歷字符串并逐字符處理?
for (value = 0; n--; line++) {if (*line < '0' || *line > '9') {return NGX_ERROR;}
?
作用 :逐字符遍歷輸入字符串,并檢查每個字符是否為合法的數字字符。
邏輯 :
*line < '0' || *line > '9'
:判斷當前字符是否不在'0'
到'9'
范圍內。如果發現非法字符,立即返回錯誤。
意圖 :
確保輸入字符串只包含數字字符。
提前終止無效輸入的處理,提高效率。
檢測整數溢出
if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {return NGX_ERROR;}
作用 :在累加之前,檢測當前值是否會超出整數范圍。
邏輯 :
value >= cutoff
:當前值已經接近整數最大值。
(value > cutoff || *line - '0' > cutlim)
:如果當前值大于
cutoff
,則一定會溢出。如果當前值等于
cutoff
,但當前字符對應的數字大于cutlim
,也會溢出。意圖 :
通過提前檢測溢出,避免在累加時觸發未定義行為。
這是 Nginx 設計中非常重要的健壯性保障。
累加當前字符的數值?
value = value * 10 + (*line - '0');
- 作用 :將當前字符的數值累加到
value
中。- 邏輯 :
*line - '0'
:將字符'0'
到'9'
轉換為對應的整數值 0 到 9。value * 10
:將當前值左移一位(相當于乘以 10)。- 最終結果是將當前字符的數值追加到已有整數的末尾。
- 意圖 :
- 實現字符串到整數的逐步轉換。
返回最終結果?
return value;
當所有字符都成功處理后,返回最終的整數值