缓冲区溢出STL向量

时间:2015-11-24 08:56:42

标签: c++ vector stl

我正在将一个STL向量的内容复制到另一个STL向量。 程序是这样的

std::vector<uint_8>  l_destVector(100); //Just for illustration let us take the size as 100.
std::vector<uint_8>  l_sourceVector; //Let us assume that source vector is already populated.

memcpy( l_destVector.data(), l_sourceVector.data(), l_sourceVector.size() );

上面的例子非常简单,但在我的实际代码中是大小 目标向量的动态计算。 此外,源向量将动态填充,从而可以拥有不同长度的数据。 因此,它增加了缓冲区溢出的可能性。

我遇到的问题是,当缓冲区溢出时,我的程序在memcpy时没有崩溃,但有时候很难调试。

我们如何解释这种行为?

/ ********************************************** ************************************************** ****** / 基于我正在编辑问题的回答,使我的担忧更容易理解。

因此,这是一个遗留代码,并且有很多地方使用memcpy复制了vector,我们不打算更改现有代码。我主要担心的是“memcpy不能保证立即崩溃,如果不是为什么?”,我会诚实地承认这不是很好的代码。

实际使用的简要说明如下。

在下面的方法中,i_DDRSPDBuffer和i_dataDQBuffer根据调用方法中的某些逻辑生成。

o_dataBuffer被分配了一个足以从两个输入缓冲区获取数据的内存空间,但是调用updateSPDDataToRecordPerDimm的方法中的一些最近更改导致其中一个流中的溢出。

typedef std::vector<uint8_t> DataBufferHndl;
errHdl_t updateSPDDataToRecordPerDimm(
        dimmContainerIterator_t i_spdMmap,
        const DataBufferHndl & i_DDRSPDBuffer,
        const DataBufferHndl & i_dataDQBuffer,
        DataBufferHndl & o_dataBuffer) 

{

uint16_t l_dimmSPDBytes = (*i_spdMmap).second.dimmSpdBytes;

// Get the Data Buffer Handle for the input and output vectors
uint8_t * l_pOutLDimmSPDData = o_dataBuffer.data();
const uint8_t * l_pInDDRSPDData = i_DDRSPDBuffer.data();
const uint8_t * l_pInDQData = i_dataDQBuffer.data();


memcpy(l_pOutLDimmSPDData, l_pInDDRSPDData, l_dimmSPDBytes);
memcpy(l_pOutLDimmSPDData + l_dimmSPDBytes,
    l_pInDQData, LDIMM_DQ_DATA_BYTES);

memcpy(l_pOutLDimmSPDData ,
       l_pInDQData, LDIMM_DQ_DATA_BYTES); ====> Expecting the crash here but the crash happens some where after the method updateSPDDataToRecordPerDimm returns.

}

3 个答案:

答案 0 :(得分:0)

它不必崩溃,它是未定义的行为。

如果您在调试模式下使用std::copy而不是std::vector<uint_8>::iterator s,那么您可能会遇到一个可以捕获它的断言。

答案 1 :(得分:0)

它在memcpy时不会崩溃,因为你只“覆盖分配的向量后面的内存”。只要您的程序无法读取该损坏的内存并使用该数据,您的程序就会继续运行。

如前所述,使用memcpy不是复制stl容器内容的推荐方法。

你是安全的

的std ::拷贝 的std ::矢量::分配

在这两种情况下,你都会得到上面提到的迭代器调试,它会触发接近错误的点。

答案 2 :(得分:0)

不要那样做!它最终会咬你。

使用std::copyoutput_iterator,或者因为您知道目标的大小,resize向量到正确的大小或创建一个正确大小的向量并管道直接内容,或简单的分配操作符。