0

我们的大部分商业 C++ 库都依赖于模板。我们计划将我们的产品作为头文件和动态链接库(封闭源代码)出售,但由于我们的大部分代码库都集中在头文件中,我们实际上会将其作为开源版本发布,并且缺少易于替换的小块。

这是我们的库接口中的一个类的示例:

template<class ItInput, class ItOutput>
struct serialize{
  ItOutput operator() (ItInput first, ItInput last, ItOutput d_first) {
    // operation on pointers (assuming that ++, -- and * operators work as expected for pointers) 
} 

有没有办法为我们的模板代码提供等于或优于编译常规代码的混淆级别(即技术上可逆但不有利可图,也不是最佳的这样做)?

编辑:澄清一下,我们的目标是防止用户阅读实施,而不是防止非法复制我们的工作。为了这个问题,请假设我们有这个要求的正当理由。

4

1 回答 1

7

我们实际上会将它作为开源发布

错误的。“开源”意味着您的许可证与OSI兼容,但很可能不兼容。

问你的律师。

您错误地寻求法律问题的技术答案。

有没有办法为我们的模板化代码提供与常规代码编译相同或更好的混淆级别

如果您有时间花点时间,例如,您可以用一些无用的垃圾替换库中的每个标识符。例如,如果您使用secret标识符,请添加类似

#define secret s_1eovFxBcc2F

在任何其他代码之前。稍后您甚至可以运行一个脚本来替换每次出现secrets_1eovFxBcc2F. 当然,您secret不应该出现在您使用的任何系统标题中。

恕我直言,这会浪费时间,但可能会让你的经理高兴。

真正重要的是适用于您的客户的许可证。任何严肃的企业(当然也不是大企业)都不能承担违法行为。

澄清一下,我们的目标是阻止用户阅读实现,

然后只提供一组类似 C(并且可能已声明extern "C")的函数,作为库的已发布接口,只有不透明的数据类型

顺便说一句,您是否考虑过相反的方法,使您的库开源,可能带有 GPL 许可证(并出售替代品,对自由软件不太友好的许可证),因此使用它的每个(分布式)程序也必须是 GPL 版(或者必须购买您广泛的其他许可证)?

(我坚持认为,法律问题通常没有技术解决方案)

于 2017-07-11T16:23:17.453 回答