Запутывание кода в сильно шаблонной библиотеке
Большая часть нашей коммерческой библиотеки 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)
}
Есть ли способ обеспечить уровень запутывания в нашем шаблонном коде равным или лучше, чем компиляция обычного кода (т.е. технически обратимым, но не выгодным и не оптимальным для этого)?
РЕДАКТИРОВАТЬ: Чтобы уточнить, наша цель состоит в том, чтобы запретить пользователям читать реализацию, а не предотвратить незаконное копирование нашей работы. Ради вопроса, пожалуйста, предположите, что у нас есть веские причины для этого требования.
1 ответ
мы бы де-факто выпустили его с открытым исходным кодом
Неправильно. "Открытый исходный код" означает, что ваша лицензия совместима с OSI и, скорее всего, не будет.
Спросите своего адвоката.
Вы неправильно ищете технический ответ на юридический вопрос.
Есть ли способ обеспечить уровень запутывания для нашего шаблонного кода, равный или лучше, чем компиляция обычного кода
Если у вас есть время, вы можете, например, заменить каждый идентификатор в вашей библиотеке каким-то ненужным мусором. Например, если вы используете secret
идентификатор, добавьте что-то вроде
#define secret s_1eovFxBcc2F
перед любым другим кодом. Позже вы можете даже запустить скрипт, заменяющий каждое вхождение secret
с s_1eovFxBcc2F
, Конечно твой secret
не должно появляться ни в каких системных заголовках, которые вы используете.
ИМХО, это было бы потерей времени, но могло бы сделать вашего менеджера счастливым.
Что действительно важно, так это лицензия, применимая к вашим клиентам. Ни один серьезный бизнес (и уж точно не крупные) не может позволить себе идти против закона.
Чтобы уточнить, наша цель состоит в том, чтобы запретить пользователям читать реализацию,
Затем предоставьте только, в качестве опубликованного интерфейса вашей библиотеки, набор C-подобных (и, возможно, объявленных extern "C"
) функций, только с непрозрачными типами данных.
Кстати, вы рассматривали противоположный подход - сделать вашу библиотеку открытым исходным кодом, возможно, с лицензией GPL (и продавать альтернативные, менее дружественные по отношению к свободному программному обеспечению, лицензии), так что каждая (распределенная) программа, использующая ее, должна быть также под лицензией GPL (или должен купить вашу обширную другую лицензию)?
(Я настаиваю, юридические вопросы обычно не имеют технических решений)