当前位置: 首页 > news >正文

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数

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

在每次累加之前,通过比较当前值与 cutoffcutlim 来判断是否会溢出。

这种方法避免了直接进行溢出操作导致未定义行为。

遍历字符串并逐字符处理 
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;

当所有字符都成功处理后,返回最终的整数值

相关文章:

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数

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…...

PG:ERROR: cannot freeze committed xmax

目录 原因**问题原因****PostgreSQL 底层逻辑** 解决方案1**问题分析****排查步骤****1. 检查长时间运行的事务****2. 检查未提交的事务****3. 检查 autovacuum 配置****4. 检查事务 ID 使用情况****5. 检查表的 relfrozenxid** **解决方法****1. 手动运行 VACUUM FREEZE****2.…...

《论软件的可靠性评价》审题技巧 - 系统架构设计师

论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节&#xff0c;是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容&#xff1a; 首先&#xff0c;本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…...

【项目设计】自主HTTP服务器

目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI、URL、URN HTTP的协议格式 HTTP响应协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CGI机制的概念 CGI机制的实现步骤 CGI机制的意义 …...

Linux操作系统:基于Linux的个人Web服务器搭建与自动化运维实践

基于Linux的个人Web服务器搭建与自动化运维实践 摘要 在互联网的海洋中&#xff0c;每个人都想拥有一艘属于自己的小船——一个个人Web服务器。Linux作为开源界的“老大哥”&#xff0c;无疑是搭建Web服务器的最佳选择。本文通过幽默风趣的方式&#xff0c;详细介绍了在Linux…...

[创业之路-321]:创新开拓思维和经营管理思维的比较

目录 一、概述 1.1、定义与内涵 1、创新开拓思维&#xff1a; 2、经营管理思维&#xff1a; 1.2、特点与优势 1、创新开拓思维的特点与优势&#xff1a; 2、经营管理思维的特点与优势&#xff1a; 3、应用场景与限制 4、总结 二、创新开拓思维与经营管理思维&#xf…...

vivado修改下载器下载速率

Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…...

运维基线方案说明

1. 总体思路 建立运维基线的核心目标是保障系统稳定性、提升安全性、及时响应异常事件并不断优化系统性能。初创公司资源有限&#xff0c;方案应尽可能简单、易用&#xff0c;同时具备一定的自动化和标准化能力。建议从以下几个层面入手&#xff1a; 标准化文档&#xff1a;制…...

pycharm中配置PyQt6详细教程

PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…...

大湾区经济网报道:2025春运收官 全国跨区流动90亿,大湾区12亿人次

&#xff08;原标题&#xff1a;2025年春运收官&#xff1a;全国跨区流动超90亿人次 大湾区贡献12亿人次&#xff09; 大湾区经济网2月23日电&#xff08;记者 余芳&#xff09;2025年春运昨日&#xff08;2月22日&#xff09;正式结束&#xff0c;全国跨区域人员流动量达90.2…...

Docker用户的困境:免费项目的减少与成本的增加

摘要 在生产环境中&#xff0c;Docker用户正面临新的挑战&#xff1a;免费项目逐渐减少&#xff0c;收费服务成为主流趋势。表面上免费的选项&#xff0c;由于缺乏必要的支持和及时更新&#xff0c;反而可能导致更高的隐性成本。对于依赖Docker进行开发和部署的企业而言&#x…...

1.4 嵌入式系统的软件

嵌入式系统的开发流程中&#xff0c;硬件和固件设计完成后&#xff0c;嵌入式软件承担起实现功能、用户交互、系统集成和性能优化等任务&#xff1b;嵌入式系统软件分为设备驱动、操作系统和应用程序三个层面。 因此嵌入式系统软件开发工程师通常分为三类&#xff1a;嵌入式系统…...

PHP2(WEB)

##解题思路 打开页面什么线索都没有&#xff0c;目录扫描只是扫出来一个index.php&#xff0c;而源代码没有东西&#xff0c;且/robots.txt是不允许访问的 于是一番查询后发现&#xff0c;有个index.phps的文件路径&#xff0c;里头写着一段php的逻辑&#xff0c;对url的id参数…...

【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下载 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…...

一、计算机等级考试——题库

&#xff08;1&#xff09;选择题 &#xff08;2&#xff09;基本操作题 &#xff08;3&#xff09;上网题 &#xff08;4&#xff09;文字题 &#xff08;5&#xff09;表格题 &#xff08;6&#xff09;演示文稿 二、计算机等级考试——标准评分 &#xff08;1&#xff09;选…...

Android系统开发 给system/app传包报错

一、现象 adb 命令推送apk到system/app下提示 remote couldnt create file: Read-only file system demo /oem/appsystem app 在Android设备上&#xff0c;/system 分区通常是只读的&#xff08;Read-only file system&#xff09;&#xff0c;这意味着普通用户或应用程序…...

libxls库的编译以及基于Visual studio的配置

最近有一个需求在windows处理xls&#xff0c;所以就需要libxls这个库&#xff0c;调查了一下&#xff0c;基于C的库的解析情况如下&#xff1a; 所以最理想的就是Libxlsd个开源的方案 基于历史整理的 libxls 在 MinGW 下的编译步骤 前提条件 系统&#xff1a;Windows&#…...

OpenHarmony构建系统-GN与子系统、部件、模块理论与实践

理论 OpenHarmony源码体系 OpenHarmony的源码架构基于模块化设计&#xff0c;为了方便系统的功能的增加和裁剪&#xff0c;设计了基于GN构建的模块系统。整个模块可从大到小划分为产品(product)、领域/子系统集(domain)、子系统(sub system)、部件(component)、模块/组件(modu…...

kafka+spring cloud stream 发送接收消息

方案 1&#xff1a;使用旧版 StreamListener&#xff08;适用于 Spring Cloud Stream < 2.x&#xff09; 1. 添加依赖&#xff08;pom.xml&#xff09; <!-- Spring Cloud Stream Kafka Binder --> <dependency> <groupId>org.springframework.clo…...

使用ArcGIS Pro自动矢量化水系

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;自动矢量化是一项至关重要的技术&#xff0c;它能够将栅格图像中的要素转换为矢量数据&#xff0c;从而方便后续的分析和处理。本文将详细介绍如何使用ArcGIS Pro自动矢量化水系&#xff0c;适用于那些颜色相对统一、…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...