【问题标题】:Calling random altered functions based on an original function基于原始函数调用随机更改的函数
【发布时间】:2015-11-09 12:07:21
【问题描述】:

假设我为每个原始函数设置了 10 个更改后的函数,它们都做同样的事情,只是执行和数学的过程不同。每次应该在代码中使用原始函数时,我想从 10 个更改的函数中调用一个随机函数,而不是原始函数。我怎样才能做到这一点并避免编译其他 9 个更改过的函数,这些函数不是随机选择的并且不会被使用?

这是为每个具有唯一签名的接收器分发一个“不同”的构建。我能想到的唯一可能的方法是为每个原始函数创建一个文件夹,该文件夹包含 10 个单独的包含文件,用于每个更改的函数。这有点乱,但这是我能想到的唯一方法。

如果有更简单的方法,我想实现什么,请告诉我。例如,在编译时随机将垃圾代码添加到原始函数中——这会更好,因为它是动态的。我只是无法想象如何做到这一点。

这是一些伪代码:http://pastebin.com/v7Hv53nS

【问题讨论】:

  • 由于没有编译时随机数生成工具,我想最简单的方法是在你的 Makefile 中生成一个随机索引,将它作为宏传递给编译器,并在源代码中使用它代码将标记调度到一组重载函数中。
  • 您希望实现的选择是随机的,还是每个签名都不同
  • 每个签名不同@Beta

标签: c++ function random


【解决方案1】:

这个问题可以分成两个更小的问题。

第 1 部分: 确定将哪个变体提供给接收者。这相当于将签名映射到{1,...,10} 而不会发生冲突。顺便说一句,这意味着最多可以有十个唯一签名。 (如果您使用多个函数执行此操作,那么您必须决定每个接收器应接收一组唯一的实现还是一组唯一的实现,但不要介意暂时。)这似乎不是您要询问的部分,因此假设我们将此逻辑放入名为 pickVariant 的可执行文件(例如脚本)中。

第 2 部分: 给定变体的选择,编译变体并为接收者构建包(可执行文件、库等)。我会这样做:

在 Makefile 中:

VARIANT := $(shell pickVariant $(SIGNATURE))

foo.o: foo.cc
    @$(CXX) $< -DVARIANT=$(VARIANT) -c -Wall -o $@

在 foo.cc 中:

int addTwo(int n)
{
  int res;
#if VARIANT==1
  res = n+2;
#elif VARIANT==2
  res = n+1+1;
#elif VARIANT==3
  res = 5+n-3;
...
#elif VARIANT==10
  res = 2*n+2-n;
#endif

  return res;
}

【讨论】:

  • 谢谢,这正是我想要做的!但是,仍然存在 1 个问题。 Makefile 部分实际上是做什么的?我没有使用 Makefile,但我假设它与添加行/函数有关,它会在每次编译时创建一个随机 VARIANT 值?是否可以在没有 Makefile 的情况下实现,所以我可以在我的应用程序中对其进行硬编码? @Beta
  • @PriitJõe:对不起,我以为你在使用 Make;你用的是什么?核心是编译器的调用:g++ foo.cc -DVARIANT=7 -c -o foo.o,或者类似的东西。
  • 我正在运行 VS 2015 Pro 并构建一个简单的控制台应用程序。我对 boost 或任何其他更大的库以及 cmake eco 不太熟悉。我还能以某种方式做到这一点吗? @Beta
  • @PriitJõe:我确信 VS 可以做到,但我不是 VS 方面的专家,所以我不知道具体怎么做。我会检查“预处理器宏”的文档。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 2021-04-26
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2019-04-24
相关资源
最近更新 更多