Проблема с использованием станд.:: копия

Я получаю предупреждение при использовании функции копии станд.

У меня есть a byte массив, который я объявляю.

byte *tstArray = new byte[length];

Затем у меня есть пара других массивов байтов, которые объявляются и инициализируются с некоторыми шестнадцатеричными значениями, которые я хотел бы использовать в зависимости от некоторого входа исходного пользователя.

У меня есть серия того, если операторы, которые я использую, чтобы в основном проанализировать исходный вход, и на основе некоторой строки, я выбираю который массив байтов использовать и при этом скопировать результаты в исходный tstArray.

Например:

if(substr1 == "15")
{
   std::cout<<"Using byte array rated 15"<<std::endl;
   std::copy(ratedArray15,ratedArray15+length,tstArray);
} 

Предупреждение, которое я получаю, предупреждает C4996: 'станд.:: копия': Вызов функции с параметрами, которые могут быть небезопасными - этот вызов, полагается на вызывающую сторону, чтобы проверить, что переданные значения правильны.

Возможное решение состоит в том, чтобы быть отключить это предупреждение, useing-D_SCL_SECURE_NO_WARNINGS, я думаю. Ну, именно это я исследую.

Но, я не уверен, означает ли это, что мой код действительно небезопасен, и я на самом деле должен был сделать некоторую проверку?

7
задан Ajay 12 August 2015 в 05:41
поделиться

4 ответа

C4996 означает, что вы используете функцию, помеченную как __ declspec (устарело) . Вероятно, использование D_SCL_SECURE_NO_WARNINGS просто #ifdef отключит устаревание. Вы можете прочитать заголовочный файл, чтобы знать наверняка.

Но вопрос в том, почему он устарел? MSDN, похоже, ничего не говорит об этом на странице std :: copy (), но, возможно, я смотрю не на ту. Обычно это делалось для всех «небезопасных функций манипулирования строками» во время серьезного продвижения безопасности XPSP2. Поскольку вы не передаете длину целевого буфера в std :: copy, если вы попытаетесь записать в него слишком много данных, он с радостью выполнит запись за пределами конца буфера.

Чтобы сказать, является ли ваше использование небезопасным, нам потребуется просмотреть весь ваш код. Обычно есть более безопасная версия, которую они рекомендуют, когда таким образом осуждают функцию. Вы можете просто скопировать строки другим способом. Эта статья кажется более глубокой. Похоже, они подразумевают, что вы должны использовать std :: checked_array_iterator вместо обычного OutputIterator.

Что-то вроде:

stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length);
std::copy(ratedArray15, ratedArray15+length, chkd_test_array);

(Если я правильно понимаю ваш код.)

9
ответ дан 6 December 2019 в 19:36
поделиться

По сути, это предупреждение говорит вам о том, что вы должны быть абсолютно уверены, что tstArray указывает на массив, достаточно большой для хранения элементов длины, например std :: copy этого не проверяет.

4
ответ дан 6 December 2019 в 19:36
поделиться

Что ж, я предполагаю, что одностороннее прекращение поддержки библиотеки stdlib корпорацией Майкрософт также включает передачу char * в std :: copy . (На самом деле они испортили целый ряд функций.)

Я полагаю, что некоторые из них имеют некоторые достоинства ( fopen () затрагивает глобальную ERRNO , так что это не поток- безопасно), но другие решения кажутся не очень рациональными. (Я бы сказал, что они взяли слишком большую полосу для всего этого. Должны быть уровни, такие как не потокобезопасный, непроверяемый и т.д.)

Я бы рекомендовал прочитать MS-doc по каждой функции, если вы Тем не менее, вы хотите знать проблемы, связанные с каждым случаем, достаточно хорошо задокументировано, почему каждая функция имеет это предупреждение, и причина обычно разная в каждом случае.

1
ответ дан 6 December 2019 в 19:36
поделиться

По крайней мере, кажется, что VC++ 2010 RC не выдает это предупреждение на уровне предупреждения по умолчанию.

-1
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: