Почему ошибка C6386 переполнение буфера с функциями strsafe.h StringCch? - PullRequest
0 голосов
/ 10 июля 2019

Итак, я запустил Analyze в VS 2017 с моим C ++ кодом. Это дает мне переполнение буфера со следующим:

TCHAR *sTemp = new TCHAR[5]();
if (sTemp)
    StringCchCopy(sTemp, 5, L"0123456789");

Когда я шагаю по коду, sTemp равен «0123», а 4-я позиция равна \ 0.

Когда я запускаю Analyze для кода, я получаю ошибку C6386:

Warning C6386   Buffer overrun while writing to 'sTemp':  the writable size is 'unsigned int' bytes, but '10' bytes might be written.

Почему? Я также попытался изменить массив на 10 и StringCchCopy на 5, но ошибка все та же.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Предупреждение относится к тому факту, что исходная строка никогда не будет помещаться внутри места назначения. Длина исходной строки равна 10, а размер получателя - 5 единиц кода. Совсем не важно, что статический анализатор не может определить размер динамически распределяемого целевого массива.

Если бы это было так, и это обнаружило бы несоответствие между фактическим размером и требуемым вами размером, это вызвало бы ошибку, а не предупреждение.

0 голосов
/ 10 июля 2019

Документы для StringCchCopy говорят, что вторым параметром должен быть размер буфера назначения и , чтобы буфер назначения был достаточно большим, чтобы содержать исходную строку.Вы не проверяете код возврата из функции, но я подозреваю, что это будет STRSAFE_E_INSUFFICIENT_BUFFER, что означает «Операция копирования завершилась неудачно из-за недостатка места в буфере. Буфер назначения содержит усеченную версию с нулевым символом в конце ожидаемого результата. В ситуацияхтам, где усечение приемлемо, это не обязательно может рассматриваться как условие сбоя.инструмент видит, что ваша исходная строка длиннее целевого буфера, и выдает предупреждение.

...