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