数组参数的完整性检查(strlen等)

Cod*_*der 1 c c++ windows dll

无法通过搜索(可能是错误的关键字)找到答案,所以我正在创建一个新问题.

如何使用字符串参数处理dllexported方法的参数检查.一般规则永远不会信任用户,但实际上呢?例如:

int foo(const char *bar)
{
    if(!bar)
        return FAIL;

    ???
}
Run Code Online (Sandbox Code Playgroud)

假设库的用户调用我们的函数,如:

foo(reinterpret_cast<char*>(0x00000008));
Run Code Online (Sandbox Code Playgroud)

这应该首先导致AV:

strlen(bar);
Run Code Online (Sandbox Code Playgroud)

有办法防范这个吗?正确处理错误的方法?

我知道IsBadReadPtr是不可能的,因为这个函数是一类危险的,永远不会被使用.但是,我有什么方法可以处理这个问题吗?我不能__declpec(dllexport)std :: string,可以吗?此外,即使我愿意,std :: string也有某种线程本地存储或静态,当我从不同的模块使用时会导致访问冲突(据我所知(由静态或不同的堆引起?).

使用这些功能存在安全风险,堆栈溢出(R/E)IP覆盖,还是只会导致安全的AV?

wal*_*lyk 8

到目前为止,您只能照顾客户.如果他们将垃圾传递给你的功能,这是你的问题吗?


Kar*_*tel 5

"永远不要相信用户"是一种适用于不同环境的说法 - 当"用户"是运行客户端程序并将数据发送到您正在编写的服务器程序的人时.

当"用户"是使用您的代码作为库的人时,它应该更接近:"总是编写代码,以便任何出错的东西真的是用户的错;然后在出现问题时责怪用户".:)