Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613

Разница между strcpy_s и strcpy?

08.10.2016, 20:24. Показов 10144. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Писал программу с использованием оператора strcpy.
Компилятор выдал такое вот предупреждение:
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
Чем отличается strcpy_s от strcpy?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2016, 20:24
Ответы с готовыми решениями:

strcpy/strcpy_s
Добрый вечер! Есть класс (упрощенно): class const_string { public: const_string(char const* s) { strcpy(str, s); /...

В чем разница между функциями strcat() и strcpy()?
В чем разница между функциями strcat() и strcpy()?

Чем отличаются функции strcpy и strcpy_s
Подскажите в чем отличаются функции: strcpy от strcpy_s, sprintf от sprintf_s, strcat от strcat_s, и т.д. И какой вариант...

19
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
08.10.2016, 20:35
это более "безопасный" аналог этих же функций, если не изменяет память они более потоко безопасны

Добавлено через 4 минуты
вот на msdn смысл _s функций
тык
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.10.2016, 10:28
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Чем отличается strcpy_s от strcpy?
Функции с '_s' на конце и некоторые другие - это более безопасная альтернатива
некоторым функциям стандартной библиотеки. "Безопасный" в данном контексте - это:

* более строгая проверка аргументов;

* контроль выхода за пределы буфера (как правило, за счет дополнительного параметра);

* обеспечение завершающего нуля в некоторых случаях (там, где стандартные функции
такой гарантии не обеспечивают);

* строго определенная реакция на ошибку (как правило, приводит к срабатыванию
invalid_parameter_handler; поведение стандартных функций в аналогичных ситуациях,
как правило, не определено - UB);

* и т.д.

Более подробнее - здесь:

Security Features in the CRT
https://msdn.microsoft.com/en-... 0s5kh.aspx
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.10.2016, 11:35
Fatmarmelad, добавлю, что ходят слухи, что MS не имели право по умолчанию не компилировать функции определённые в стандартной библиотеки
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.10.2016, 11:50
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что MS не имели право по умолчанию не компилировать функции
"Не имели права" - это звучит как-то слишком, как будто нарушили чьи-то
патентные требования или условия соглашения на много миллионов долларов...
Этак можно любой статический анализатор кода загнобить, что он не дает
проект нормально скомпилировать. Почему-то по поводу Secure CRT, SDL, SAL и т.п.
часто упреки в сторону MS слышу, как будто они кого-то насильно заставляют
этими возможностями пользоватся.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.10.2016, 12:01
Цитата Сообщение от Убежденный Посмотреть сообщение
как будто они кого-то насильно заставляют
этими возможностями пользоватся.
И я о чём. Добавили фичу? Добавьте как галочку или еще как - но по умолчанию их фича работает, и её нужно отключать. Зачем лишнии действия)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.10.2016, 12:07
Разве не логичнее, чтобы все новые фичи были по умолчанию включены?
Я бы, например, не хотел каждый раз при создании проекта явно включать
поддержку C++11/14.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.10.2016, 12:09
Убежденный, а разве удобно открывая чужой проект/код у себя в VS приходится фиксить ошибки компиляции *_s
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.10.2016, 12:29
rikimaru2013, на счет этого согласен. При апгрейде проектов с предыдущих
версий Visual C++ стоило бы все новые опции оставлять выключенными, это разумно.
Но выдавать какой-нибудь варнинг во время апгрейда, что, мол, теперь доступна
такая-то опция, почитать можно здесь и т.п.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.10.2016, 12:39
На всякий случай. strcpy_s и прочие аналоги являются микрософтовским расширением. Коды с их использованием будут непереносимыми.

GNU'шники пошли немного по другому пути. Они наваяли целую пачку специальных builtin'ов, а в системных хидерах стандартные интерфейсы определяют через эти builtin'ы. Таким образом и контроль появляется, и пользовательский исходник остаётся переносимым

https://gcc.gnu.org/onlinedocs... e-Checking
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.10.2016, 13:40
Убежденный, я к этому и клонил если перечитать мои посты)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.10.2016, 13:46
Цитата Сообщение от Evg Посмотреть сообщение
На всякий случай. strcpy_s и прочие аналоги являются микрософтовским расширением.
Сейчас уже это не совсем так. strcpy_s и некоторые другие похожие функции включены в стандарт С11.
Вот ссылка на TR 24731-1, который теперь часть стандарта С11.
2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.10.2016, 13:46
Цитата Сообщение от Убежденный Посмотреть сообщение
Разве не логичнее, чтобы все новые фичи были по умолчанию включены?
Логично в том случае, если они не ломают совместимость и соответствуют стандарту.
strcpy (в отличие, напримет от gets, которую убрали в c11) соответсвует всем стандартам C и С++.
Вывод ошибки при ее использовании говорит только об одном - отношении MS к стандартам.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.10.2016, 16:37
Цитата Сообщение от gng Посмотреть сообщение
Логично в том случае, если они не ломают совместимость и соответствуют стандарту.
Ну в таком случае поддержка по дефолту C++11 и выше в новых компиляторах не логична,
потому что ломает совместимость со старым кодом C++98/03. Давайте опять катить бочки на MS,
что они снова положили болт на совместимость и всех кинули.

Вывод ошибки при ее использовании говорит только об одном - отношении MS к стандартам.
Я смотрю на это иначе. Данная "принудиловка" в стиле MS - это попытка сразу отучать
начинающих программистов использовать древние окаменелости strcpy, strcat, sprintf и т.п.,
где очень легко нарваться на выход за пределы буфера или получить неопределенное
поведение программы. В этом случае есть хоть какая-то вероятность, что программист
обратит на это внимание и хотя бы поинтересуется на MSDN, почему это вдруг функции
стали небезопасными и код перестал компилироваться, и уже потом сделает для себя
выводы и выберет какой-то свой подход, а не будет сразу тупо задавливать варнинг
каким-нибудь _CRT_SECURE_NO_WARNINGS. Некоторый код лучше и правда никогда не
компилировать и не выпускать в продакшн.

Я бы вообще для новых проектов включал все доступные опции безопасности на максимум,
вместе с /Wall (treat warnings as errors), статическим анализом кода и всем остальным.
Все равно люди опытные в несколько кликов смогут перенастроить все под себя, а
начинающим будет полезно сразу включать все возможные проверки кода, хотя бы в
течение определенного времени.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
09.10.2016, 16:46
Цитата Сообщение от DrOffset Посмотреть сообщение
который теперь часть стандарта С11.
При вызове конструктора ошибка: L "Buffer is too small" & & 0
Цитата Сообщение от Croessmah Посмотреть сообщение
Конечно, там написано, что реализация оставляет
за собой право решить предоставлять эти функции или нет.
В случае, если данные функции предоставляются, макрос
_ _STDC_WANT_LIB_EXT1_ _ ставится в 1, если нет, то в 0.
Указать на пункт стандарта не могу,
т.к. под рукой нет C11, а качать с
моим текущим интернетом - тоже не вариант.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.10.2016, 19:16
Croessmah, Однако даже так противоречий со сказанным мной нет. Я сказал, что функции включены в стандарт - ну так они включены, какие вопросы. Я сделал оговорку, что теперь эти функции нельзя считать исключительно Microsoft-specific даже с учетом того, что их может не быть в какой-то конкретной реализации.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
09.10.2016, 19:52
Цитата Сообщение от DrOffset Посмотреть сообщение
Однако даже так противоречий со сказанным мной нет.
Я уточнил, что их реализация не обязательна.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.10.2016, 20:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Указать на пункт стандарта не могу
Цитата Сообщение от Croessmah Посмотреть сообщение
Я уточнил, что их реализация не обязательна
Там по ссылке на TR про это тоже написано
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2016, 20:24
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а разве удобно открывая чужой проект/код у себя в VS приходится фиксить ошибки компиляции *_s
удобнее, чем игнорировать факт морального старения.

вы обновляете проект.
вы модернизируете проект так,
что бы он соответствовал веяниям нового времени.

зачем вы вообще это делаете, если хотите,
что б все оставалось по старому?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.10.2016, 22:47
Цитата Сообщение от Убежденный Посмотреть сообщение
Ну в таком случае поддержка по дефолту C++11 и выше в новых компиляторах не логична,
потому что ломает совместимость со старым кодом C++98/03.
Поддержка по дефолту C++11 и выше оставит код с strcpy без предупреждений, даже с -Wextra (во всяком случае, и gcc, и clang поступают так), поскольку функция соответствует стандарту и при правильном использовании код не будет "дырявым".
Если подобным образом "приучать" новичков к "правильному" стилю, так лучше сразу рекомендовать писать код на Яве или на Решётке. Использование указателей само по себе потенциально несет больше угроз для безопасности, чем какая-то strcpy.
Причиной для МС отучать от подобных функций мне видится только желание "подсадить" на свои аналоги.

Добавлено через 12 минут
PS. И, все же, да.
И стандартизаторы, и разрабы компиляторов обратную совместимость ставят одной из основных целей и отходят от этого принципа разве что в исключительных случаях, напр. как с gets, которая явно открывает путь "дырам".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2016, 22:47
Помогаю со студенческими работами здесь

Как правильно задействовать strcpy_s вместо strcpy?
Имеется простой класс, да, strcpy отрабатывает корректно, но, хотелось бы понять, как правильно задействовать strcpy_s вместо strcpy, что...

Ошибка error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
#include <iostream> #include <cstring> #include <fstream> #include<string> #include<iomanip> using namespace std; struct...

Выдает ошибку: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
Уважаемые форумчане! У меня не работает программа. Все написано "вроде" правильно. Выдает ошибку: error C4996: 'strcpy': This function...

Какая разница между различными сокетами (например, между 775 и 1155)?
Обясните пожалуйста какая разница между сокетами, пример есть сокет 775 и 1155 я понимаю что разем не тот процессора другие но! как насчет...

Разница между 0 и 00 ?
Как заставить программу различать 0 и 00 (ноль и два ноля, как в рулетке)? Вариант с заменой 00 на какое-то число не подходит, так как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru