gpt4 book ai didi

segmentation-fault - 向右旋转和向右疯狂操作会引发段错误

转载 作者:行者123 更新时间:2023-12-04 07:57:21 27 4
gpt4 key购买 nike

Tritwise操作(向右旋转和疯狂操作)无法正确运行,并在Malbolge编译器/解释器中引发分段错误。

在看到有关Coding Challenges和Code Golf的惊人答案之后,我决定开始在Malbolge编程,并且学会使用硬编程语言进行编程。

当我尝试输出固定字符时,我注意到*p(在Normalized Malbolge中)在我尝试使用它们的大多数时间都抛出了分段错误。

我试图使用Internet并在Google上查找字符串“'Malbolge'
我还尝试在不同的上下文中使用这些命令,发现如果没有输入(我不想要的话),该命令将起作用。

我正在使用由tio.run或Online Try It托管的online interpreter

我尝试使用的代码:

归一化的Malbolge:/*<

马尔堡:u&a

Try it online!

归一化的Malbolge:/p*<v

马尔堡:u=%`M

Try it online!

归一化的Malbolge:/pp<v

马尔堡:u=<`M

Try it online!

我期望u&au=%`Mu=<`M的输出是不会引发任何错误的输出,但是实际输出是分段错误。

确切的错误:
/srv/wrappers/malbolge: line 3: 21992 Segmentation fault (core dumped) /opt/malbolge/malbolge .code.tio < .input.tio其中21992可以是任何数字(最有可能在几千到一万之间)

最佳答案

我一直在调试器中逐步浏览Malbolge解释器,以诊断此处发生的情况。我会说“恭喜,您已经在Malbolge解释器中发现了一个错误”,但是鉴于规范和解释器在其他方面不匹配(通常将权威版本视为解释器),并且是马尔博基(Malbolge),就我所知,这是故意的行为。 (好吧,这实际上可能不是预期的行为,但是许多其他功能也没有被视为重要的编程技术。)

Malbolge将所有内容存储在一个大数组中,包括代码和数据。命令打算在运行后自行修改(使用Malbolge术语为“ encrypt”),但是解释器并没有最终正确实现该命令:它实际上是在运行命令,然后查看命令所指向的地址。代码指针并对其进行加密。这就是为什么跳转将对跳转目标之前的指令而不是跳转指令本身进行加密。

如果您正在运行的命令超出了33到126的范围,则该命令将不会运行(实际上,在我拥有的Malbolge解释器的版本中,代码和数据指针也不会增加,这似乎是它将不可避免地导致无限循环;也许还有其他版本可以解决该问题。这是一项重要的检查,因为加密例程只是通过索引查找表来工作;值在33到126范围之外的值将最终从数组之前或之后读取任意字节的内存。

不幸的是,因为代码和数据存储在一个大数组中,所以一条命令最终可能在运行时对其进行修改:运行之前,该命令的范围可能在33到126之间(从而使安全检查成功)。运行时,它超出范围,然后加密最终将对查找表进行越界索引。 Malbolge解释器用C编写,对于越界读取具有不确定的行为,但是对于超出界限很长距离的读取,可能会(但不能保证)出现分段错误。

让我们看一下代码u&a会发生什么:

Command   A     C     D   memory
start 0 0 0 117, 38, 97, 29432, 98, 29431, 98, 29432, 97, ...
/ input 0 0 117, 38, 97, 29432, 98, 29431, 98, 29432, 97, ...
encrypt input 1 1 111, 38, 97, 29432, 98, 29431, 98, 29432, 97, ...
* 39378 1 1 111, 39378, 97, 29432, 98, 29431, 98, 29432, 97, ...
encrypt 39378 2 2 111, ???, 97, 29432, 98, 29431, 98, 29432, 97, ...


如您所见,您实际上并没有旋转加载到 A的输入;旋转操作从 D指向的地址读取(而不是从 A读取),因此您要旋转38(内存位置1中 *命令在内存中的表示)以产生39378。该值被存储到 A和内存位置1中。不幸的是,内存位置1是当前正在执行的命令,因此当需要对其进行加密时,解释器将对查询表进行越界读取(尝试在仅覆盖33到126范围的表中查找与39378对应的位置),如果幸运的话,会产生细分错误。

在“简单的” Malbolge程序中,这种行为很有可能发生,因为C和D以相同的值开始并以相同的速率增加。如果您希望轮换指令影响当前运行的命令以外的其他内容,则必须以某种方式使它们不同步。最简单的方法通常是 j命令(注意:使用结果数据指针可能不是特别容易,但是至少它可能在代码指针之外)。

顺便说一句,实际旋转用户输入要比您提供的示例程序花费更多的精力。您必须先将其存储到内存中,并且能够根据A的值写入内存的唯一操作是 p,这要求所讨论的单元格已经具有适当的值(为避免丢失信息,这需要为29524,您必须通过Malbolge算术生成一个值,因为它不能作为原始程序的一部分输入,即使这样,您最终还是会在输入值中将0个Trits与1个Trits交换。然后,您必须将数据指针发送回写入输入的单元格,以便可以在其上运行 *来旋转它。

关于segmentation-fault - 向右旋转和向右疯狂操作会引发段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com