检测您的程序是否已被突变


16

编写一个无错误终止的程序。

如果任何单个字节被任何其他字节替换,则程序应输出

CORRUPTED
  • 不要从文件中读取源代码
  • 您的程序不应产生任何其他输出

这是因此最短的答案以字节为单位。

编辑:删除了“不损坏”要求


辐射硬化有很多类似的问题,但是我还没有发现任何类似的问题。
FryAmTheEggman

7
致下降投票者:如果您选择正确的语言,我怀疑这是可能的(如果非常困难的话)。请不要关闭或删除该问题,除非您认为除了不可能之外,还有其他问题。

7
是什么改变了是什么意思?被另一个字节代替?
丹尼斯

4
@ ais523 FWIW我对这项挑战不以为然,因为它看起来草率,而不是因为我认为这太难了。
丹尼斯,

5
并不是说所有事情都不清楚,但是可以更清楚一些。您可以弄清是否需要完整的程序,添加示例程序并说明所有可能的修改,提及单字节替换将如何影响UTF-8编码的文件,添加可用于测试提交的脚本,并提及程序不应该接受输入等
Dennis

Answers:


30

梨树,76字节

$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~

该程序包含一些无效的UTF-8杂散八位字节。因此,它显示为Windows-1252中的样子。(默认情况下,如果“梨树”在字符串文字或类似文字中看到非ASCII八位位组,则会将其视为不透明对象,并且在不了解其字符代码的情况下就不会试图理解它;这种行为可以是通过编码声明进行了更改,但该程序没有一个。因此,该程序在逻辑上处于“未指定ASCII兼容字符集”。无论如何,所有非ASCII八位字节都在注释中,因此,这并不重要。)

说明

梨树校验和程序,查找具有CRC-32的最长子串 00000000。(如果有平局,它将首先按八位字母顺序进行选择。)然后旋转程序以将其放在开始位置。最后,该程序被解释为几乎是Perl的超集的语言,定义了Perl中未定义的一些内容,以与Python中相同的方式工作(并做了一些小的更改,例如,print在A Pear Tree中打印最终换行符)但不是在Perl中)。这种机制(以及整个语言)是为解决问题而设计的;这不是前者,但绝对是后者。

在此程序中,我们有两个值得注意的子字符串,CRC-32分别为00000000; 整个程序都会这样做,而它print"$@CORRUPTED"__DATA__ =®®本身也会这样做(出现两次)。这样,如果程序没有损坏,它将设置$@NOT ,然后打印,然后再打印CORRUPTED。如果程序损坏,则整个程序的CRC-32将无法匹配,但较短的部分之一将保持不变。旋转到程序开始处的任何一个都将仅打印CORRUPTED,如$@空字符串一样。

字符串打印完成后, __DATA__将用于防止程序其余部分运行。(我想写这样的代码__END__可以用它代替,这显然可以节省两个字节。但是我现在最好发布这个版本,因为我花了很多时间来验证它,而修改后的版本必须是由于CRC的更改而重新验证了;并且我还没有为“有效载荷”打高尔夫而付出大量的努力,所以我想看看是否有人在我可以同时纳入的注释方面有其他改进。请注意,#这在字符损坏到换行符的情况下不起作用。)

您可能想知道我是如何首先控制代码的CRC-32的。这是一个非常简单的数学技巧,它基于CRC-32的定义方式:您将代码的CRC-32写入,以低位字节序写入(与CRC-32计算通常使用的字节顺序相反)程序),并与9D 0A D9 6D。然后将其附加到程序中,您将拥有一个CRC-32为0的程序。(作为最简单的示例,空字符串的CRC-32为0,因此9D 0A D9 6D其CRC-32也为0 )

验证

梨树可以处理大多数类型的突变,但我假设“更改”的意思是“替换为任意八位位组”。从理论上讲(尽管在短期内不太可能在程序中)在某个地方可能存在散列冲突,导致错误的程序运行,所以我不得不通过蛮力检查所有可能的八位位组替换将使程序正常工作。这是我使用的验证脚本(用Perl编写):

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length $program - 1)) {
    for my $a (0 .. 255) {
        print "$x $a    \r";
        my $p = $program;
        substr $p, $x, 1, chr $a;
        $p eq $program and next;
        alarm 4;
        run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
        if ($out ne "CORRUPTED\n") {
            print "Failed mutating $x to $a\n";
            print "Output: {{{\n$out}}}\n";
            print "Errors: {{{\n$err}}}\n";
            exit;
        }
    }
}

say "All OK!    ";

一个ñ位CRC检测到任何一个错误爆裂不超过n位。在给定的情况下,哈希冲突是不可能的,不需要暴力验证。
Rainer P.

@RainerP .:我知道一个突变会阻止CRC最初与0匹配的部分的CRC。但是,它可能会引入代码的新子字符串,其CRC值为0。暴力破解的目的是确保不会发生这种情况。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.