Lua 绕过元表

Lua 绕过元表,直接访问 table 的字段。

绕过元表

rawset(table, index, value),在不触发元方法的情况下,设置 table[index] 的值为 value。

rawget(table, index),在不触发元方法的情况下,获取 table[index] 的值。

现有一个 hero 表,设置了元表和元方法。

local hero = {level = 1,exp = 0
}local mt = {__index = function (table, key)print("trigger __index")end,__newindex = function (table, key, value)print("trigger __newindex")end
}
setmetatable(hero, mt)

如果去访问一个不存在的 key,则会进入元表的元方法。

因为 __newindex 被赋值为一个函数,只有打印,没有把值存到 table 里,所以 hero 里还是没有 star 字段。

hero.star = 5
print(hero.star)-- trigger __newindex
-- trigger __index
-- nil

现在使用 rawset 为 hero 添加一个新字段 star,再使用 rawget 从 hero 中获取 star 字段。

可以发现,没有触发元方法的打印,hero 表中也添加了 star 字段。

rawset(hero, "star", 5)
local star = rawget(hero, "star")
print(star)-- 5

防止死循环

修改一下元方法,在 __index 中返回 table[key] 的值,在 __newindex 中设置 table[key] 为 value。

local hero = {level = 1,exp = 0
}local mt = {__index = function (table, key)print("trigger __index")return table[key]end,__newindex = function (table, key, value)print("trigger __newindex")table[key] = valueend
}
setmetatable(hero, mt)

看上去似乎没有什么问题,但是如果触发了这两个元方法,它们内部的逻辑(也就是 table[key])又会触发元方法,进入死循环,最后栈溢出。

hero.star = 5-- trigger __newindex
-- trigger __newindex
-- trigger __newindex
-- ...
-- C stack overflowprint(hero.star)-- trigger __index
-- trigger __index
-- trigger __index
-- ...
-- C stack overflow

要防止这种死循环,可以利用 rawset 和 rawget,避免再次触发元方法。

local hero = {level = 1,exp = 0
}local mt = {__index = function (table, key)print("trigger __index")return rawget(table, key)end,__newindex = function (table, key, value)print("trigger __newindex")rawset(table, key, value)end
}
setmetatable(hero, mt)

再次访问 star 字段,就不会栈溢出了。

hero.star = 5
-- trigger __newindexprint(hero.star)
-- 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/33059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写一个坏越的个人天地(二)

小红书上搜了下博客,感觉好像没有让自己喜欢的。昨天刚好学了点grid布局,来试试 菜单栏直接使用el-menu 下边布局就用grid局部了,这块初步想法是轮播+你的天气和我的天气+自我介绍 天气的话,这边要先找一下有没有天气的api 我这边百度搜了个聚合的api,一天可以免费调用5…

Linux系统iptables应用SNAT和DNAT

一、SNAT 1.SNAT应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) 2.SNAT原理 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢 数据包从内网发送到公网时,SNAT会把数据包的源IP由私…

网页抓取和网页爬取之间有何区别?

随着互联网的发展和信息的爆炸式增长,数据收集和处理已成为企业和个人不可或缺的需求。在此背景下,网页抓取和网络爬虫已成为两种常见的数据收集方法。虽然这两种方法看似相似,但它们的方法和目标存在显著差异。本文将为您详细介绍网页抓取和…

H4020 12V24V36V40V1A 同步降压芯片IC Buck-DCDC 低功耗,高效率 100%占空比

H4020是一款12V24V36V40V1A的同步降压(Buck)DC-DC转换器,专为需要高效率、低功耗和精确电压/电流控制的应用而设计。它内置了高压MOSFET,支持宽范围的输入电压(5V-36V),并能提供高达1A的持续输出…

【最佳实践】你肯定不知道的useEffect 钩子的工作原理?知其然不知其所以然

大家好,我是DX3906 useEffect 是 React 库中用于处理副作用的钩子(Hook)。它允许你在函数组件中执行与 DOM 相关的操作和生命周期函数类似的逻辑。useEffect 钩子的工作原理涉及到 React 的渲染流程和副作用的调度机制。以下是其工作原理的详…

Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

Elasticsearch 是一个强大的工具,尤其在全文检索、实时分析、机器学习、地理数据应用、日志和事件数据分析、安全信息和事件管理等场景有大量的应用。 然而,Elastic Stack 技术栈的选型及应用效能取决于正确的使用方式。选型错误或者误用 Elasticsearch …

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment"Center" Content"Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header"打开"/><MenuItem Header"-"/><MenuItem Header"关闭"/&…

LeetCode35.搜索插入位置

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。 如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须…

IOS Swift 从入门到精通:闭包第二部分,高级闭包

文章目录 当闭包接受参数时使用闭包作为参数当闭包返回值时使用闭包作为参数简写参数名称高级闭包: 具有多个参数的闭包高级闭包:从函数返回闭包高级闭包:捕获值总结当闭包接受参数时使用闭包作为参数 这是闭包开始变得有点像线路噪声的地方:传递给函数的闭包也可以接受它…

磁盘未格式化:深度解析、恢复策略与预防措施

一、磁盘未格式化的定义与现象 在计算机存储领域&#xff0c;磁盘未格式化通常指的是磁盘分区或整个磁盘的文件系统信息出现丢失或损坏的情况&#xff0c;导致操作系统无法正确读取和识别磁盘上的数据。当尝试访问这样的磁盘时&#xff0c;系统往往会弹出一个警告框&#xff0…

Makefile实战论(一)

为什么写这个呢&#xff0c;其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景&#xff0c;导致我不是很熟练&#xff0c;或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣&#xff0c;借着demo来分析一下资深工程师写的Makefile&a…

【Python】使用matplotlib绘制图形(曲线图、条形图、饼图等)

文章目录 一、什么是matplotlib二、matplotlib 支持的图形三、如何使用matplotlib1. 安装matplotlib2. 导入matplotlib.pyplot3. 准备数据4. 绘制图形5. 定制图形6. 显示或保存图形7. &#xff08;可选&#xff09;使用subplots创建多个子图注意事项&#xff1a; 四、常见图形使…

联盟学习:技术原理、特点及适用场景

一、引言 随着大数据和人工智能技术的快速发展&#xff0c;数据成为了推动科技进步的重要资源。然而&#xff0c;在实际应用中&#xff0c;数据往往呈现出碎片化、分散化的特点&#xff0c;如何有效地利用这些数据成为了业界关注的焦点。联盟学习&#xff08;Federated Learni…

880基础题查漏补缺

高等数学 函数极限连续 无穷大包括∞与-∞ 无穷小≠0 0无穷大0 有界函数无穷大不定 极限不存在极限不存在极限可能存在可能不存在 极限存在极限存在极限存在 等价无穷小替换的x可广义化&#xff0c;比如sin(ax2)~ax2 lim x n e x \dfrac{x^n}{e^x} exxn​时&#xff0c;e…

安卓逆向经典案例—H5appXX运维

H5app的class不一定是android.webkit.WebView 也可能是腾讯X5内核或者是uc webview 殊途同归也要去hook webview的系统函数和可调式方法setWebContentsDebuggingEnabled。突破sign算法&#xff0c;输出协议和加密算法的作用是什么&#xff1f;分析c-sign值 在加密的位置下断点 …

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 SOAPHEADERS 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类&#xff0c;该子类…

【vite】入门 publicDir 到高阶玩法

【vite】入门 publicDir 到高阶玩法 &#x1f4cc; 使用方式 &#x1f9e9; 默认选项 publicDir默认选项为字符"public"&#xff0c;表示静态资源默认指向public。 import { defineConfig } from vite export default defineConfig({publicDir: public })说明&am…

昇思25天学习打卡营第6天|使用静态图加速

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介…

代码随想录——摆动序列(Leetcode376)

题目链接 贪心 class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length < 1){return nums.length;}// 当前一对差值int cur 0;// 前一对差值int pre 0;// 峰值个数int res 1;for(int i 0; i < nums.length - 1; i){cur nums[i 1] - nums[i];i…

黑苹果EFI详细配置说明

先上网址: https://dortania.github.io/OpenCore-Install-Guide/installer-guide/opencore-efi.html 1: 了解作用 ACPI作用: 总结: ACPI是UEFI引导方式和操作系统之间的硬件抽象接口,概述了硬件设备,如 USB 控制器、CPU 线程、嵌入式控制器、系统时钟等 硬件设备识别和驱动:…