Предупреждения типа 'wcstok': эта функция или переменная могут быть небезопасны. Попробуйте вместо этого использовать wcstok_s - PullRequest
1 голос
/ 15 мая 2011

Я просто использую эти широкие символьные литералы в своем коде, чтобы узнать о них

     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 ]

2 голосов
/ 15 мая 2011

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

2 голосов
/ 15 мая 2011

Существует еще одна причина не использовать оригинальную функцию семейства strtok :

[...] Однако в одном потоке чередование вызовов одной из этих функций может привести к повреждению данных и неточным результатам . При разборе различных строк завершите анализ одной строки, прежде чем начинать анализировать следующую. Также помните о потенциальной опасности при вызове одной из этих функций из цикла, где вызывается другая функция. Если другая функция в конечном итоге использует одну из этих функций, в результате чередуется последовательность вызовов, что приводит к повреждению данных.

Причина в том, что strtok не является реентерабельным: считалось, что при его разработке было бы неплохо использовать глобальную переменную в качестве хранилища для контекста (как вы думаете, strtok может вспомнить, куда продолжить между каждым вызовом функции?).

Прошлое - это прошлое, и мы не должны судить о коде десятилетия назад, но потом, со всеми новыми стандартами (C99 приходит на ум), я все еще удивлен, что эта функция не подверглась рефакторингу.

По крайней мере, семейство функций strtok_s , созданное Microsoft, использует для этого предоставленную пользователем переменную (называемую context). Если у вас есть выбор, для производственного кода используйте strtok_s.

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

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

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

1 голос
/ 15 мая 2011

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

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

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

...