有没有办法看到在Rcpp代码中创建和调用的R函数的主体?

时间:2017-09-07 12:24:55

标签: c++ r rcpp

我很好奇如何加密包中的R函数,这样一旦构建了包,就可以调用该函数,但是找不到后面的算法。该算法用R。

编写

假设我们在Rcpp中创建一个Function并使用导出的Rcpp函数包装器调用它。源代码是一个字符串,用于创建要评估为Function的表达式。

#include <Rcpp.h>
using namespace Rcpp;

ExpressionVector secret_expr("function(x) x + 1");
Function secret_fun = secret_expr.eval();

//' Secret function
//' @param x a numeric vector
//' @export
// [[Rcpp::export]]
SEXP SF(SEXP x)
{
  return secret_fun(x);
}

一旦包含上述C ++代码的包构建为二进制文件,我们似乎无法查看secret_fun的正文。但是,仍然可以通过在shell中调用strings package.so | grep function来显示函数体,其中package.so是构建包的二进制文件。

这意味着为了隐藏函数体,我们不能直接在C ++代码中编写它。我发现https://stackoverflow.com/a/1360175/2906900非常有趣,所以我用上面的例子测试它:

#include "HideString.h"
#include <Rcpp.h>
using namespace Rcpp;

DEFINE_HIDDEN_STRING(Secret, 0x2f, ('f')('u')('n')('c')('t')('i')('o')('n')('(')('x')(')')('x')('+')('1'))

ExpressionVector secret_expr(GetSecret());
Function secret_fun = secret_expr.eval();

//' Secret function
//' @param x a numeric vector
//' @export
// [[Rcpp::export]]
SEXP SF(SEXP x)
{
  return secret_fun(x);
}

这次我无法通过strings找到任何有意义的功能,而且功能完全相同。因此,似乎很有可能以这种方式加密敏感算法。但我想知道是否有一种简单的方法可以解决这个问题?

0 个答案:

没有答案