Предупреждения типа '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,

И если вам нужно предоставить кроссплатформенный код, мой совет:

  1. напишите функцию, которая будет использоваться как косвенная к реальной
  2. В Windows перенаправить на strtok_s
  3. На любой платформе, где есть безопасный стрток (я нашел strtok_r при поиске), перенаправить на эту функцию
  4. На платформах, где нет безопасных strtok, пишите свои собственные (это совсем не сложно, и это хорошее упражнение для изучения программирования)

Теперь есть C++ альтернативы этим функциям C, либо сочетая std::string методы вместе или используя boost::tokenizer

Вы должны использовать std::wstring а также std::string и аналогичные функции стандартной библиотеки C++ вместо этих функций, так как они подвержены переполнению буфера и другим проблемам безопасности (не говоря уже о надежности приложения).

wcstok подвержен эксплойтам переполнения буфера. Компилятор рекомендует использовать альтернативную версию, которая имеет дело с этой угрозой.

Пожалуйста, обратитесь к замечаниям в документации MSDN для wcstok,

Если у вас есть полный контроль над данными, которые передаются wcstok тогда у вас нет причин для беспокойства. Если данные переданы wcstok может быть предоставлен пользователем тогда, что создает возможность для атаки переполнения буфера.

Другие вопросы по тегам