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

perl 语言中 AUTOLOAD 的用法

这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个 AUTOLOAD函数,并且会为该函数提供相同的参数。因此,我们可以在 AUTOLOAD函数里面针对未定义的函数进行特殊处理,比如实现未定义的函数,然后调用该函数,就好像这个函数一直都存在一样。

比如,下面的示例程序会在你调用未定义函数时发出警告,而不是直接退出:

#!/usr/bin/env perlsub AUTOLOAD {our $AUTOLOAD;warn "You attempt to call an undefined function: $AUTOLOAD\n";
}&foo; # $AUTOLOAD will be set to main::foo
print "Exit normally ...\n"

运行结果如下所示:

$ ./autoload.pl 
You attempt to call an undefined function: main::foo
Exit normally ...

下面是一个更加实用的例子,即我们在 AUTOLOAD中实现未定义的函数:

#!/usr/bin/env perlsub AUTOLOAD {my $name = our $AUTOLOAD;*$AUTOLOAD = sub { print "calling function $name(@_)\n"; };goto &$AUTOLOAD;
}foo(30);
goo(40);
hoo(50);

运行结果如下所示:

$ ./autoload_2.pl 
calling function main::foo(30)
calling function main::goo(40)
calling function main::hoo(50)

OpenSSL项目中的很多地方都有用到 perl语言,它主要负责项目建构和汇编代码的生成工作。其中,在生成加解密算法汇编优化代码的 perl脚本中,有很多架构都用到了 AUTOLOAD机制去简化汇编指令的书写。下面看一个 OpenSSLx86实现的例子,从 crypto/chacha/asm/chacha-x86_64.pl文件中节选出如下代码:

#!/usr/bin/env perlsub AUTOLOAD()          # thunk [simplified] 32-bit style perlasm
{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://;my $arg = pop;$arg = "\$$arg" if ($arg*1 eq $arg);$code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n";
}@x=("%eax","%ebx","%ecx","%edx",map("%r${_}d",(8..11)),"%nox","%nox","%nox","%nox",map("%r${_}d",(12..15)));
@t=("%esi","%edi");sub ROUND {                     # critical path is 24 cycles per round
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($xc,$xc_)=map("\"$_\"",@t);
my @x=map("\"$_\"",@x);("&add   (@x[$a0],@x[$b0])",     # Q1"&xor   (@x[$d0],@x[$a0])","&rol   (@x[$d0],16)","&add  (@x[$a1],@x[$b1])",     # Q2"&xor  (@x[$d1],@x[$a1])","&rol  (@x[$d1],16)","&add   ($xc,@x[$d0])","&xor   (@x[$b0],$xc)","&rol   (@x[$b0],12)","&add  ($xc_,@x[$d1])","&xor  (@x[$b1],$xc_)","&rol  (@x[$b1],12)",)
}foreach (&ROUND(0, 4, 8,12)) { eval; }
foreach (&ROUND(0, 5,10,15)) { eval; }print "$code\n";

从上面的代码可以看到,表面上,add()xor()rol()这些函数并没有被声明和实现,但该脚本定义了 AUTOLOAD函数,并在 AUTOLOAD函数中进行了统一的处理,比如,将 &add(xx, yy)函数调用转换为了 add yy,xx指令字符串。
因此,上述脚本的运行结果如下所示:

$ ./autoload_3.pl add	%r8d,%eaxxor	%eax,%r12drol	$16,%r12dadd	%r9d,%ebxxor	%ebx,%r13drol	$16,%r13dadd	%r12d,%esixor	%esi,%r8drol	$12,%r8dadd	%r13d,%edixor	%edi,%r9drol	$12,%r9dadd	%r9d,%eaxxor	%eax,%r15drol	$16,%r15dadd	%r10d,%ebxxor	%ebx,%r12drol	$16,%r12dadd	%r15d,%esixor	%esi,%r9drol	$12,%r9dadd	%r12d,%edixor	%edi,%r10drol	$12,%r10d

相关文章:

perl 语言中 AUTOLOAD 的用法

这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个…...

服务器放在香港好用吗?

​  相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…...

C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)

文章目录 本栏简介1. 什么是设计模式2. GOF 设计模式3. 从面向对象谈起4. 深入理解面向对象5. 软件设计固有的复杂性5.1 软件设计复杂性的根本原因5.2 如何解决复杂性 ? 6. 结构化 VS. 面向对象6.1 同一需求的分解写法6.1.1 Shape1.h6.1.2 MainForm1.cpp 6.2 同一需求的抽象的…...

Docker技术--WordPress博客系统部署初体验

如果使用的是传统的项目部署方式,你要部署WordPress博客系统,那么你需要装备一下的环境,才可以部署使用。 -1:操作系统linux -2:PHP5.6或者是更高版本环境 -3:MySQL数据环境 -4:Apache环境 但是如果使用Docker技术,那么就只需要进行如下的几行简单的指令: docker run …...

提高代码可读性和可维护性的命名建议

当进行接口自动化测试时,良好的命名可以提高代码的可读性和可维护性。以下是一些常用的命名建议: 变量和函数命名: 使用具有描述性的名称,清晰地表达变量或函数的用途和含义。使用小写字母和下划线来分隔单词,例如 log…...

Docker基础入门:Docker网络与微服务项目发布

Docker基础入门:Docker网络与微服务项目发布 一、前言二、Docker0理解2.1 ip a查看当前网络环境2.2 实战--启动一个tomact01容器(查看网络环境)2.3 实战--启动一个tomact02容器(查看网络环境)2.4 容器与容器之间的通信…...

Docker安装详细步骤

Docker安装详细步骤 1、安装环境准备 主机:192.168.40.5 zch01 设置主机名 # hostnamectl set-hostname zch01 && bash 配置hosts文件 [root ~]# vi /etc/hosts 添加如下内容: 192.168.40.5 zch01 关闭防火墙 [rootzch01 ~]# systemct…...

十六、pikachu之SSRF

文章目录 1、SSRF概述2、SSRF(URL)3、SSRF(file_get_content) 1、SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…...

最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码

全新PHP短网址系统URL缩短器平台,它使您可以轻松地缩短链接,根据受众群体的位置或平台来定位受众,并为缩短的链接提供分析见解。 系统使用了Laravel框架编写,前后台双语言使用,可以设置多域名,还可以开设套…...

漱玉平民大药房:多元化药店变革的前夜

作者 | 王聪彬 编辑 | 舞春秋 来源 | 至顶网 本文介绍了漱玉平民大药房在药品零售领域的数字化转型和发展历程。通过技术创新, 漱玉平民 建设了覆盖医药全生命周期的大健康生态圈,采用混合云架构和国产分布式数据库 TiDB,应对庞大的会员数据处…...

如何实现AI的矢量数据库

推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而,人工智能模型有点像美食厨师。他们可以创造奇迹,但他们需要优质的成分。人工智能模型在大多数输入上都做得很好,但如果它们以最优化的格式接收输入,它们就会真正…...

Java与Modbus-TCP/IP网络通讯

1.需求样例 举例5:浮点数参数读取(读取温度测量值)查看参数列表,温度测量值地址为320,根据Modbus协议,读取参数地址转换为16进制为:00H A0H,读取长度为2个字:00H 02H。 …...

音视频 ffmpeg命令图片与视频互转

截取一张图片 ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp -i 输入 -y 覆盖 -f 格式 image2 一种格式 -ss 起始值 -vframes 帧 如果大于1 那么 输出加%03d t…...

C++的基类和派生类构造函数

基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生…...

C语言中对json格式数据的解析和封装

首先需要调库&#xff1a;#include <cJSON.h> Json的数据结构介绍&#xff1a; /* The cJSON structure: */ typedef struct cJSON { /*next/prev允许您遍历数组/对象链。或者&#xff0c;使用GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *next; struct c…...

RT-Thread自动初始化机制

自动初始化机制是指初始化函数不需要被显示调用&#xff0c;只需要在函数定义处通过宏定义的方式进行申明&#xff0c;就会在系统启动过程中被执行。 int rt_hw_usart_init(void) {rt_hw_serial_register(&serial1, "uart1",RT_DEVICE_FLAG_RDWR | RT_DEVICE_FL…...

在本地搭建Jellyfin影音服务器,支持公网远程访问影音库的方法分享

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…...

强盛集团面试题实战(持续更新)

目录 第一章、面试题1.1&#xff09;王:8月301.2&#xff09;1.3&#xff09; 第二章、2.1&#xff09;2.2&#xff09;2.3&#xff09; 第三章、3.1&#xff09;3.2&#xff09;3.3&#xff09; 第四章、4.1&#xff09;4.2&#xff09;4.3&#xff09; 友情提醒&#xff1a;先…...

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…...

go gin 参数绑定常用验证器

https://pkg.go.dev/github.com/go-playground/validator/v10#readme-baked-in-validations min 最小max 最大len 长度限制gt 大于eq 等于ne 不等于eqfield 与某个字段值一样nefield 与某个字段值不一样oneof 枚举 ,以空格分开startswithendswithdive 数组 package mainimpor…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...