Предупреждения типа 'wcstok': эта функция или переменная могут быть небезопасны. Попробуйте вместо этого использовать wcstok_s
Я просто использую эти широкие символьные литералы в своем коде, чтобы узнать о них
wchar_t* wpsub = wcstok(names, names_delim);
wpsub = wcstok(NULL, names_delim);
wchar_t* wcopied=new wchar_t[wcslen(wname) + 1];
strcpy(nameptr, "singh");
wcscpy(wcopied, wname);
wcscat(wcopied, L" Singh");
почему я получаю это предупреждение, я все равно проигнорировал его. мы должны игнорировать любые такие предупреждения.
: warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
: see declaration of 'wcstok'
: warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
: see declaration of 'wcstok'
: warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
: see declaration of 'strcpy'
: warning C4996: 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
: see declaration of 'wcscpy'
: warning C4996: 'wcscat': This function or variable may be unsafe. Consider using wcscat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
: see declaration of 'wcscat'
3 ответа
Есть еще одна причина не использовать оригинальную функцию семейства strtok:
[...] Однако в пределах одного потока чередование вызовов одной из этих функций может привести к повреждению данных и неточным результатам. При разборе различных строк завершите анализ одной строки, прежде чем начинать анализировать следующую. Также помните о потенциальной опасности при вызове одной из этих функций из цикла, где вызывается другая функция. Если другая функция завершает работу с использованием одной из этих функций, чередующаяся последовательность вызовов приведет к повреждению данных.
Причина в том, что strtok
не является реентерабельным: считалось, что когда он разрабатывался, было бы неплохо использовать глобальную переменную в качестве хранилища для контекста (как вы думаете, strtok
можете вспомнить, где продолжить между каждым вызовом функции?).
Прошлое - это прошлое, и мы не должны судить о коде десятилетия назад, но потом, со всеми новыми стандартами (C99 приходит на ум), я все еще удивлен, что эта функция не была реорганизована.
По крайней мере, семейство функций strtok_s, созданное Microsoft, использует для этого предоставленную пользователем переменную (называемую context
). Если у вас есть выбор, для производственного кода используйте strtok_s
,
И если вам нужно предоставить кроссплатформенный код, мой совет:
- напишите функцию, которая будет использоваться как косвенная к реальной
- В Windows перенаправить на strtok_s
- На любой платформе, где есть безопасный стрток (я нашел
strtok_r
при поиске), перенаправить на эту функцию - На платформах, где нет безопасных strtok, пишите свои собственные (это совсем не сложно, и это хорошее упражнение для изучения программирования)
Теперь есть C++ альтернативы этим функциям C, либо сочетая std::string
методы вместе или используя boost::tokenizer
Вы должны использовать std::wstring
а также std::string
и аналогичные функции стандартной библиотеки C++ вместо этих функций, так как они подвержены переполнению буфера и другим проблемам безопасности (не говоря уже о надежности приложения).
wcstok
подвержен эксплойтам переполнения буфера. Компилятор рекомендует использовать альтернативную версию, которая имеет дело с этой угрозой.
Пожалуйста, обратитесь к замечаниям в документации MSDN для wcstok
,
Если у вас есть полный контроль над данными, которые передаются wcstok
тогда у вас нет причин для беспокойства. Если данные переданы wcstok
может быть предоставлен пользователем тогда, что создает возможность для атаки переполнения буфера.