1 定义
ngx_atoof 函数 定义在 ./nginx-1.24.0/src/core/ngx_string.c
off_tngx_atoof(u_char*line,size_tn){off_tvalue,cutoff,cutlim;if(n==0){returnNGX_ERROR;}cutoff=NGX_MAX_OFF_T_VALUE/10;cutlim=NGX_MAX_OFF_T_VALUE%10;for(value=0;n--;line++){if(*line<'0'||*line>'9'){returnNGX_ERROR;}if(value>=cutoff&&(value>cutoff||*line-'0'>cutlim)){returnNGX_ERROR;}value=value*10+(*line-'0');}returnvalue;}
ngx_atoof 函数 用于将指定长度 `n` 的字节序列 `line` 安全地转换为 `off_t` 类型的非负整数。 它会检查非法字符与溢出, 若输入为空、含有非数字字符或结果超过 `off_t` 最大值,则返回 `NGX_ERROR`(-1), 否则返回转换后的数值。
2 详解
1 函数签名
off_tngx_atoof(u_char*line,size_tn)
返回值 返回类型:off_t 返回转换后的数值
参数1 u_char *line 输入,待处理的数据
参数2 size_t n 待处理数据长度
2 逻辑流程
1 局部变量 2 检查输入长度 3 溢出限制 4 循环解析 5 返回成功转换的 off_t 值
1 局部变量
{off_tvalue,cutoff,cutlim;
value: 累积转换过程中的整数值,初始为 0,最终存储转换结果。 cutoff: 溢出判断的关键阈值,等于 off_t 最大值除以 10(去掉个位)。 cutlim: off_t 最大值模 10 的结果,即最大值的个位数字。 这两个变量用于在真正执行 value * 10 + digit 之前,安全地预判是否会溢出,
2 检查输入长度
if(n==0){returnNGX_ERROR;}
检查输入长度是否为 0。 如果 n 为 0,说明没有字节需要转换, 空序列无法表示一个有效数字,因此直接进入错误分支 当长度为零时,返回错误码。
3 溢出限制
cutoff=NGX_MAX_OFF_T_VALUE/10;cutlim=NGX_MAX_OFF_T_VALUE%10;
计算溢出检查的上界 cutoff 计算溢出检查的个位限制 cutlim
4 循环解析
for(value=0;n--;line++){if(*line<'0'||*line>'9'){returnNGX_ERROR;}if(value>=cutoff&&(value>cutoff||*line-'0'>cutlim)){returnNGX_ERROR;}value=value*10+(*line-'0');}
循环,逐位处理 n 个字符 检查当前字符是否为十进制数字字符 遇到非数字字符时返回错误码 溢出预判检查 该条件由两部分通过 && 连接, 只有当可能发生溢出时才进入错误分支。 value >= cutoff: 首先判断当前的 value 是否已达到或超过阈值。 如果 value < cutoff,则 value * 10 + digit 肯定小于最大值,安全,不必进一步判断。 如果 value >= cutoff,则进一步判断 (value > cutoff || *line - '0' > cutlim): 若 value > cutoff,则 value * 10 就已经大于最大值,必然溢出。 若 value == cutoff,则 value * 10 等于(最大值 - cutlim), 此时只有当要加的数字 *line - '0' 大于 cutlim 才会溢出。
5 返回成功转换的 off_t 值
returnvalue;}