C++ const std:string& 传递给第三方时的安全性 API

C++ const std:string& security when passing to a third-party API

我有第三方 API 希望我通过引用传递 std::string。它说它正在接受 const。这几乎没有任何意义,因为它可以将内存指针转换为非常量 char* 并修改我的字符串。

通过示例检查下面的代码。

我是否应该 concerned/suspicious 关于要求我传递 const std::string&(通过 const 引用)而不是 std::string(通过值)的第三方 API )?

他们告诉我这是因为他们想避免字符串复制,因为字符串可能很长。我是偏执还是有道理?

class Blah {

public:
    static void testBlah(const string& s) {
        char* blah = (char*) s.c_str(); // cast away from const char*
        blah[1] = 'b';
    }
};

int main() {

    cout << "!!!Hello There !!!" << endl; // prints !!!Hello World!!!

    const string s = "xxx"; // NOTE THE CONST !!!

    Blah::testBlah(s);

    cout << s << endl; // prints "xbx"

    return 0;
}

只需将其包装在您自己信任的 class:

#include <iostream>

class Blah {

public:
    static void testBlah(const std::string& s)
    {
        char* blah = (char*)s.c_str(); // cast away from const char*
        blah[1] = 'b';
    }
};

class Safe_Blah {
public:
    static void testBlah(const std::string s)
    {
        Blah::testBlah(s);
    }
};

int main()
{

    std::cout << "!!!Hello There !!!" << std::endl; // prints !!!Hello World!!!

    const std::string s = "xxx"; // NOTE THE CONST !!!

    //Blah::testBlah(s);
    Safe_Blah::testBlah(s);

    std::cout << s.c_str() << std::endl; // now prints "xxx"

    return 0;
}

接受 const& 对象的 API 承诺不修改该对象。虽然,是的,图书馆可能是邪恶的并且无论如何都会修改它,但这样做会违背诺言。如果您传递给它的对象被定义为 const,修改它将是 未定义的行为。从图书馆开发人员的角度来看,这将是非常糟糕的。基本上,图书馆开发人员会邀请 Chutulhu 来以任意、随机、未指定和不可预测的方式破坏他们的用户应用程序。

说到不信任你的图书馆,你就输了。就控制您调用的库的攻击者的安全性而言,C++ API 不是 "safe"。当您调用库中的函数时,您将执行控制权交给了该库。然后该库将有权读取和写入您应用程序的所有内存,并且如果它愿意,可以用它自己的东西替换所有内存。因此,如果您担心图书馆在背后做坏事,那您就太倒霉了。