d不变放进只读节,实现强制不变

news/2025/1/19 6:02:45/

原文
目前,D编译器把串字面放进只读节中,但大多数其他类型静态不变数据没有针对恶意写入保护.
这里是不变崩溃的例子.
问题是,抛异常时,d运行时修改了静态不变异常实例.问题也与它有关.
如果把不变对象放进只读段中,且运行时任意写,都触发段错误,那么更易解决此类问题.微控制器的裸代码也可能从中受益,因为这样可把CTFE生成的不变数据放入NOR闪存,而不浪费SRAM空间.
怎么样,需要新的DIP吗?
我试过使用DMD代码,并把数组字面放入只读节.
要使其正确,还需要更多工作.不变标志还有问题.
如果类和构实例有构造器,还会删除不变标志.但是这与CTFE生成数据真有关系吗?
检测数据是否由CTFE生成,也不是很明显.用.ownedByCtfe得到的结果很奇怪.有提示吗?

正确实现它不是很困难吗?因为不能真正把数据放入只读内存,但必须保护整个页,如在窗口上用VirtualProtect().特别是如何让GC仍可分配不变数据.或我不理解这方面的?

当然,字面可且应设置为只读,但对全部不变数据,我不觉得对.

不变好处是什么?
好处
一旦初化不变数据,就永远不变.有很多用法:
1,多线程读取不变数据时,不需要同步的访问数据.
2,处理不变数据时,没有数据竞争,撕裂,顺序一致性和缓存一致性问题.
3,深度复制数据结构时,不需要复制不变部分.
4,即使通过引用传递(最常见),也可按值类型对待不变大块数据.
5,不变类型,提供了更多的自文档化信息.
6,不变数据可放在硬件保护只读存储器中,甚至可放在ROM中.
7,如果更改不变数据,则肯定是内存崩溃错误,并且可自动检查此类数据完整性.
8,不变类型提供了许多优化机会.
9,充当可变不变世界间的桥梁,因此单个函数可用来接受两种类型参数.
我总按必须在编译时构造,并可把不变放进程序的RO节,来理解不变.

是的,但这不是现实.可在运行时构造不变数据,并且在共享静态构造器等中经常这样.你的变化破坏性太大,突然不能这样了.
如,以下程序有效:

import std.stdio : writeln;
import std.datetime : Clock;immutable int a;shared static this()
{a = Clock.currTime().year;
}void main()
{writeln(a);
}

上例中,"a"不能放在只读存储器中.
此时,可用'常'关键字.

所以他特别指出静态不变的而不仅是不变.

我在早先消息中提到了静态不变CTFE.一些不变数据是在编译时生成的,可安全地进入只读节.现在只对改进这一点感兴趣.

但是,既然你提到了抓GC分配的不变数据的写访问,那么可借助额外的工具来完成.可用valgrind.

#include <stddef.h>
#include <valgrind/memcheck.h>void vg_mark_block(void *p, size_t size)
{int valgrind_handle = VALGRIND_CREATE_BLOCK(p, size, "MARKED BLOCK");VALGRIND_MAKE_MEM_NOACCESS(p, size);
}
extern(C) void vg_mark_block(void *p, size_t size) @nogc;void main() @nogc {try {static immutable e = new Exception("test");vg_mark_block(cast(void*)e, __traits(classInstanceSize, typeof(e)));throw e;} catch (Exception e) {assert(e.msg == "test");}
}

插件未来可抓GC分配支持的不变数据的写访问.已在ldc中.然而,就像valgrind一样,目前ASAN不支持毒化内存区域为只读.

如果更改"immutable int a;""immutable int a = 2030;",编译器会拒绝你的构造器.

如果同时声明和初化变量,那么把它放进只读节可能是安全的.如果错了,请纠正.


http://www.ppmy.cn/news/5113.html

相关文章

【推荐】安全访问服务边缘(SASE)资料汇总合集24篇

Secure Access Service Edge (SASE) 是Gartner推出的一个新的技术理念。SASE将 SD-WAN和网络安全解决方案&#xff08;FWaaS、CASB、SWG 和ZTNA&#xff09;融合到统一的云原生服务中。SASE是Gartner最新提出的一个技术理念&#xff0c;SASE用于从分布式云服务交付聚合的企业网…

vue后台系统管理项目-商城轮播图管理功能

商城轮播图管理功能 功能介绍&#xff1a; 1.轮播图列表分页功能&#xff1b; 2.轮播图添加功能&#xff1b; 3.轮播图编辑功能&#xff1b; 4.轮播图删除功能&#xff1b; 5.轮播图启用禁用功能&#xff1b; 6.轮播图获取排序号功能&#xff1b; 7.轮播图查看详情功能&#xf…

前端:vue-element-admin 搭建踩坑笔记

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

小红书素人怎么找?素人投放需要注意什么?

小红书素人怎么找&#xff1f;素人投放需要注意什么? 在小红书上做营销推广&#xff0c;如果是投放给素人&#xff0c;可以帮助你在短时间内建立起对品牌的认知&#xff0c;那么&#xff0c;素人怎么找呢&#xff1f; 一般都是从小红书官方小程序里寻找。 我们可以在小红书…

Linux编辑器-vim的使用

vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于xwindow、 mac o…

Vuex的相关知识

「Vuex的相关知识」 ​ vuex是一种对vue 应用中多个组件的共享状态进行集中式的管理(读/写)&#xff1b; vuex的工作原理&#xff1a; https://segmentfault.com/a/1190000021717329 ​ vuex 核心概念和API&#xff1a;state、mutations、actions、getters、modules、向外暴…

前端简单案例——扩展卡

效果展示 色块可以替换成图片&#xff0c;改变background-color为background-image即可。 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

插入类排序

问题引入 【问题描述】 实现直接插入排序、希尔排序。 【输入形式】 输入2组待排序序列。 【输出形式】 输出分别使用插入排序、希尔排序的排序结果。 【样例输入】 5 7 3 5 0 -9 6 2 4 6 3 4 2 【样例输出】 insertSort: -9 0 3 5 7 shellSort: 2 2 3 4 4 6 程序设计 #inclu…