从受限制的输入集生成代码

时间:2016-08-19 19:29:57

标签: metaprogramming code-generation

假设我有一个映射(使用已知类型),例如

1:假, 4:假, 8:是的, 16:真的

我想生成一个函数接受输入并给出正确的输出。我不关心上面映射中没有的任何输入会发生什么,例如3将永远不会出现。

一个天真的解决方案是使用switch语句生成函数,例如

f(int x) {
    if x == 1 return false;
    else if x == 4 return false;
    else if x == 8 return true;
    else if x == 16 return true;
}

我希望能够使用输入集生成不在内存中扩展的代码。

f(int x) {
    return x >= 8;
}

这个问题有名字吗?我应该研究哪个领域?

1 个答案:

答案 0 :(得分:0)

你想"猜测"为未提供的输入生成什么代码。

你不能这样做。

[编辑:在进一步的讨论中,现在我很清楚他并不关心这些投入。我按原样留下答案,因为人们会像我一样假设他必须关心。无论如何,在这个答案的最后提供了惊人的建议。

想象一下,你有一个对手会在所有输入上指定一个函数f,但他/她只提供一个样本,就像你的例子一样。一些固定的输入。你现在应用一个oracle,它猜测f(9)是 true 。您的对手立即显示她的函数f(9)实际上是 false 。同样,如果你猜f(9)是假的。

攻击者总是可以制造一个与你的代码生成器猜测不匹配的输入/输出对。所以你根本无法做到正确。

您可以做的是接受您的猜测可能是错误的,并尝试选择一个复杂程度最低的函数来解释您到目前为止看到的输入/输出对。你的例子基本上就是其中之一。

如果你相信"简单"函数是一个比复杂函数更接近世界的函数,你可以生成代码并希望你不会在自然界遇到对手。

不要指望它是可靠的。

有了这些警告,OP可能会对GNU SuperOptimizer感兴趣。这可以找到产生一组提供的输入/输出对的机器指令的短序列[实际上,我认为你给它的功能是计算答案,就像OP的原始功能一样]"显然"字面上尝试每个指令序列的疯狂想法。

superoptimizer背后的天才是这个特技实际上适用于短指令序列。

我认为修改它以生成泛型" C"指令(例如有效的C动作),因为我认为无论如何它都使用C动作来建模机器指令。您可能需要修改您的功能以生成“不关心”#34;输入的结果并不重要,并且教授不关心的GNU superoptimizer"是一个有效的结果。事实上,这也是GNU superoptimizer的一个有用的补充,用于其原始目的。