是C++;向第三方提供库时是否包含安全漏洞? 我不是C++专家,我更喜欢C,我不在技术前沿,但我偶尔会以图书馆的形式向第三方提供一些科学软件。我知道依靠编译并不是保护我专有权益的好方法,但我一直信任我的“客户”

是C++;向第三方提供库时是否包含安全漏洞? 我不是C++专家,我更喜欢C,我不在技术前沿,但我偶尔会以图书馆的形式向第三方提供一些科学软件。我知道依靠编译并不是保护我专有权益的好方法,但我一直信任我的“客户”,c++,include,C++,Include,然而,我突然想到,“恶意”第三方可能会通过编辑我的包含文件来滥用我的软件;将私人:班级成员改为公众:是一个特别令人担忧的问题 我的担心是没有根据的吗?如果没有,是否有一种解决方案,或者是一种预编译头的方法 PS我知道pimpl的习惯用法,但我的一些同事并没有进入动态记忆。另外,c++11还没有达到这些部分。我不确定您为什么认为这是一个问题。如果人们想弄乱你的代码(并可能以这种方式破坏他们自己的代码),为什么不呢?如果您想保护库中使用的算法不被反向引用,我会理解,但是简单地访问private变量并

然而,我突然想到,“恶意”第三方可能会通过编辑我的包含文件来滥用我的软件;将私人:班级成员改为公众:是一个特别令人担忧的问题

我的担心是没有根据的吗?如果没有,是否有一种解决方案,或者是一种预编译头的方法


PS我知道pimpl的习惯用法,但我的一些同事并没有进入动态记忆。另外,c++11还没有达到这些部分。

我不确定您为什么认为这是一个问题。如果人们想弄乱你的代码(并可能以这种方式破坏他们自己的代码),为什么不呢?如果您想保护库中使用的算法不被反向引用,我会理解,但是简单地访问
private
变量并不是您应该担心的事情

毕竟,
private
并不能提供任何真正的保护,您可以随时执行以下操作

class My
{
public:
    int i()
    {
        return _i;
    }

private:
    int _i = 5;
};

struct Omg
{
public:
    int _i;
};

int main()
{
    My m;
    Omg * o = (Omg*)(&m);
    o->_i = 10;
    std::cout << m.i();
    return 0;
}
我的班级
{
公众:
int i()
{
返回i;
}
私人:
int_i=5;
};
结构Omg
{
公众:
int_i;
};
int main()
{
我的m;
Omg*o=(Omg*)(&m);
o->u i=10;

我不知道你为什么认为这是一个问题。如果人们想弄乱你的代码(并可能以这种方式破坏他们自己的代码),为什么不呢?如果您想保护库中使用的算法之类的东西不被反向引用,我会理解的,但是简单地访问
private
变量并不是您应该担心的事情

毕竟,
private
并不能提供任何真正的保护,您可以随时执行以下操作

class My
{
public:
    int i()
    {
        return _i;
    }

private:
    int _i = 5;
};

struct Omg
{
public:
    int _i;
};

int main()
{
    My m;
    Omg * o = (Omg*)(&m);
    o->_i = 10;
    std::cout << m.i();
    return 0;
}
我的班级
{
公众:
int i()
{
返回i;
}
私人:
int_i=5;
};
结构Omg
{
公众:
int_i;
};
int main()
{
我的m;
Omg*o=(Omg*)(&m);
o->u i=10;

std::cout很多时候,交付给客户的软件都由客户代码和专有代码组成。客户代码是软件的一部分,客户或客户可以阅读甚至修改。另一方面,专有代码是软件作者想要保护的代码,并禁止其他人使用,包括c客户

为了保护专有代码,您可以将其放入单独的文件中,并将其编译到DLL中。但这并不安全,因为黑客可以在该DLL上使用反编译器并访问源代码

一种更可靠的方法是使用加密工具,但我没有使用任何工具来了解如何将加密文件编译或转换为库文件


最后,客户端代码将链接到并调用专有代码。因此,是否进行保护是一个早期决定,它将深刻影响软件的整个设计。

很多时候,交付给客户的软件由客户端代码和专有代码组成。客户端代码是客户或cli使用的软件的一部分另一方面,专有代码是软件作者想要保护的代码,并禁止包括客户在内的其他人使用

为了保护专有代码,您可以将其放入单独的文件中,并将其编译到DLL中。但这并不安全,因为黑客可以在该DLL上使用反编译器并访问源代码

一种更可靠的方法是使用加密工具,但我没有使用任何工具来了解如何将加密文件编译或转换为库文件


最后,客户端代码将链接到并调用专有代码。因此,是否进行保护是一个早期决定,它将深刻影响软件的整个设计。

您可以使用纯接口或,以使SDK的使用者不易访问您的类的内部细节。最终,他们拥有已编译的code可以反汇编它并执行任何操作,但如果您希望分布式包含文件不易被SDK客户端滥用,那么具体类上的纯接口或pimpl习惯用法可以从发布的标题中隐藏这些细节。

您可以使用纯接口或o SDK的使用者。最终,他们拥有已编译的代码,可以反汇编代码并执行任何操作,但如果您希望分布式包含文件不易被SDK客户端滥用,那么具体类上的纯接口或pimpl习惯用法可以从发布的头文件中隐藏这些细节。

为什么您担心有人会告诉我你给了他们什么?如果他们把事情弄糟了,那不是你的错。我想我的担心有两方面。1)他们可能会破坏软件运行的系统,2)他们可能会以我无法控制的方式使用我的软件。@Dave,除非你站在他们身后,看着他们做什么,否则你永远无法控制别人如何使用你的软件。@DaveC++确实使通过piml习惯用法实现的实现更容易。您不必担心您的听众不在动态内存中。它们与具有完全正常值语义的类一起工作。您编写了类构造函数和析构函数,因此您处理了(一点)。使用pimpl的动态内存。@mAlters感谢并同意。但是有些人喜欢保证堆没有被使用。你为什么担心有人把你给他们的东西弄糟了?如果他们弄糟了,那不是你的错。我想我的担心有两个方面。1)他们可能会破坏软件运行的系统,2)第ey可能会以我无法控制的方式使用我的软件。@Dave,除非你站在其他人的身后,并且