Комментарий переполнения буфера от CODESONAR об использовании итератора stl :: map

....
wstring wstrFirst;
INFO_t* pstInfo = NULL;
INFO_MAP::const_iterator itrReqInfoEnd = RequestedInfoMap_i.end();
for( INFO_MAP::const_iterator itrReqInfo = RequestedInfoMap_i.begin();
itrReqInfo != itrReqInfoEnd;
++itrReqInfo )
{
wstrFirst = itrReqInfo->first;
pstInfo = itrReqInfo->second;
...

Пожалуйста, смотрите фрагмент кода выше.
Я использую CODESONAR (инструмент статического анализа) для этого.
Моя проблема в том, что в последней строке (pstInfo = itrReqInfo->second;), CODESONAR показывает следующую ошибку:

Этот код читает после конца буфера, на который указывает itrReqInfo->.

. itrReqInfo-> оценивает &wstrFirst._Bx.

. Первое чтение байта происходит по смещению 48 от начала буфера, на который указывает itrReqInfo->, емкость которого составляет 48 байтов.

. Смещение превышает емкость.

. Переполнение происходит в памяти стека. Проблема может возникнуть, если выделенный код выполняется.

(здесь выделенный код означает pstInfo = itrReqInfo->second;)

Это ложно-положительный? Если нет, как я могу это исправить?

0

Решение

поскольку itrReqInfo это const_iterator и for только идет через map от начала до конца, не вижу, как что-либо может быть прочитано за пределами буфера. Но нужно было бы увидеть более полный пример этой ошибки, чтобы знать наверняка.

0

Другие решения

Мне сообщили о подобной проблеме в Codesonar, и я исправил ее, используя «const reference».

В вашем случае я бы попробовал что-то вроде этого …

wstring wstrFirst;
INFO_MAP::const_iterator itrReqInfoEnd = RequestedInfoMap_i.end();
for( INFO_MAP::const_iterator itrReqInfo = RequestedInfoMap_i.begin();
itrReqInfo != itrReqInfoEnd;
++itrReqInfo )
{
wstrFirst = itrReqInfo->first;
const INFO_t& pstInfo = itrReqInfo->second;
0

По вопросам рекламы [email protected]