带memset_s分配器的std :: vector

时间:2015-04-02 21:26:35

标签: c++ security c++11 vector

我有一些安全关键代码,我想确保在释放之前始终擦除敏感缓冲区。我可以实现一个在其析构函数中调用memset_s的缓冲类,但也许有一种更方便的方法。

如果我用一个在deallocate()中调用memset_s的变量替换std :: allocator,那么强制std :: vector不会在除临时状态之外的任何地方分配T对象吗?

感谢。

2 个答案:

答案 0 :(得分:2)

有两个原因可以让你拥有这样的T对象:作为向量的元素,或者出于其他原因。

它们不能成为向量的元素,因为它会违反连续性,并且会违反swap的无投掷保证。如果由于其他原因而有元素,则必须构造具有可观察复杂性的元素。此外T::T()可能无法使用(DefaultConstructable不是必需的),或者它可能会抛出哪个也是可观察到的效果。

因此,一般来说vector不能隐藏"元件。

答案 1 :(得分:2)

分配器是一个模板参数,如果您决定为特定用例实现一个参数,它将仅在您明确选择使用此分配器的那些对象中处于活动状态:

std::vector<T,SecureAllocator> v; // this uses the memset_s under the hood
std::vector<T>                 n; // this doesn't

现在,分配器修改了对象的类型,这意味着如果你有以std::vector<T>为参数的函数,你将无法传递std::vector<T,SecureAllocator>

或者,您可以实现一个多态分配器,其中可以在运行时控制内存源。这在BSL(github中可用的C ++ 03标准库的实现)中得到支持,在这种情况下,即使从不同的源分配,向量也是相同的类型:

bsl::vector<T> v(bslma::Default::allocator()); 
     // bslma::Default::allocator() is new/delete
bsl::vector<T> n(secureAllocator());