Error c4996 sprintf

I'm working on a C++ DDL, however I get the following issue in some places: C4996 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use

I’m working on a C++ DDL, however I get the following issue in some places:

C4996 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

I did try #define _CRT_SECURE_NO_WARNINGS, but the issue remains.
This is the code:

sprintf(szDebugString, "%s: 0x%x (%s%s%i)", ptrName, (DWORD)funcPtr, interfaceName, interfaceVersion.c_str(), i);

tambre's user avatar

tambre

4,4844 gold badges45 silver badges55 bronze badges

asked Mar 30, 2016 at 11:28

Joakim Carlsson's user avatar

Joakim CarlssonJoakim Carlsson

1,5205 gold badges19 silver badges41 bronze badges

1

You have to define _CRT_SECURE_NO_WARNINGS before #include <Windows.h>.

Alternatively, use the safe version:

sprintf_s(szDebugString, sizeof(szDebugString), "%s: 0x%x (%s%s%i)",
    ptrName, (DWORD)funcPtr, interfaceName, interfaceVersion.c_str(), i);

answered Mar 30, 2016 at 11:31

trojanfoe's user avatar

trojanfoetrojanfoe

120k21 gold badges210 silver badges240 bronze badges

4

To turn off the warning for an entire project in the Visual Studio IDE:

1- Open the Property Pages dialog for your project.

2- Select the Configuration Properties > C/C++ > Advanced page.

3- Edit the Disable Specific Warnings property to add 4996. Choose OK to apply your changes.

answered Mar 7, 2020 at 15:31

david's user avatar

2

put this define into stdafx.h.

E.g.

#pragma once
#define _CRT_SECURE_NO_WARNINGS

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

answered Dec 1, 2016 at 9:32

Vyacheslav's user avatar

VyacheslavVyacheslav

25.9k18 gold badges110 silver badges191 bronze badges

In my point of view, on a Windows project, it is not a good idea to disable the warning; a better idea is to improve the code. Mute the warning not just keeps this potential code vulnerability unnoticed, but also blinds programmers when introducing other potential code vulnerabilities.

answered Jul 7, 2018 at 5:38

Amit G.'s user avatar

Amit G.Amit G.

2,4562 gold badges21 silver badges29 bronze badges

@[TOC]

повернуть

Visual Studio 2013 Ошибка компиляции [Ошибка C4996: «SPRINTF»: эта функция или переменная могут быть небезопасными.]

20 марта 2017 20:48:13

Зеленый глубокий

Чтение: 6052.Убрать

																				<div class="tags-box space">
							<span class = "Label"> Личная категория: </ span>
															 <a class="tag-link" href="http://blog.csdn.net/der_dream/article/category/6412766" target="_blank"> C ++ Программирование </a>
						</div>
																							</div>
			<div class="operating">
								</div>
		</div>
	</div>
 </ div> (здесь таможенное название каталога)

Компиляция языковых элементов C ++ в VS 2013, если вы используете функцию SPRINTF, вам будет предложено, как если бы вы скомпилировали:

Ошибка 5 Ошибка C4996: «SPRINTF» :. Эта функция или переменная могут быть небезопасными, рассмотрите возможность использования SPRINTF_S вместо этого отключить амортизацию, используйте _crt_secure_no_warnings см. Онлайн справка для деталей f: … c ++ hechen hechen fe.cpp 13 1 ХЕЧЕН

Причина в том, что Visual C ++ 2013 использует более безопасные процедуры библиотеки выполнения. Новые функции CRT Security (это те функции с суффиксами «_S»), см.:

《Усовершенствованная безопасность Версия функций ЭЛТ》

Решение этой проблемы приведено ниже:

Способ 1: Замените исходную старую функцию на новые функции CRT Security.

Способ 2: Щит Это предупреждение, используя следующий метод:

1. В предварительно скомпилированном файле головки stdafx.h (Примечание. Обязательно определите следующий макрос перед любыми файлами, не включающие файл заголовка:

       #define _CRT_SECURE_NO_DEPRECATE

2. Или выписка#param warning(disable:4996)

3. Измените определение предварительного обработки:

Проект -> Свойства -> Свойства конфигурации -> C / C ++ -> Препроцессоры -> Определение препровизора, Добавить:

            _CRT_SECURE_NO_DEPRECATE


Ссылка: «Перегрузка шаблона безопасности》

  • Remove From My Forums
  • Question

  • i have these warnings in program and my program have a problem,i think so that this warning causes these problems

    somebody help me

    Warning    2    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    336    1    Programa 3205
    Warning    3    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.    f:fernando
    luizteste-3205ps3000.c    363    1    Programa 3205
    Warning    4    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    369    1    Programa 3205
    Warning    5    warning C4996: ‘fscanf’: This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    371    1    Programa 3205
    Warning    6    warning C4996: ‘strtok’: This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    374    1    Programa 3205
    Warning    7    warning C4996: ‘strtok’: This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    375    1    Programa 3205
    Warning    8    warning C4244: ‘function’ : conversion from ‘long’ to ‘short’, possible loss of data    f:fernando luizteste-3205ps3000.c    436    1    Programa 3205
    Warning    9    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    718    1    Programa 3205
    Warning    10    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    727    1    Programa 3205
    Warning    11    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    729    1    Programa 3205
    Warning    12    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    754    1    Programa 3205
    Warning    13    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    766    1    Programa 3205
    Warning    14    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    768    1    Programa 3205
    Warning    15    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    792    1    Programa 3205
    Warning    16    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    806    1    Programa 3205
    Warning    17    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    808    1    Programa 3205
    Warning    18    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    830    1    Programa 3205
    Warning    19    warning C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando
    luizteste-3205ps3000.c    842    1    Programa 3205
    Warning    20    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    844    1    Programa 3205
    Warning    21    warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    f:fernando luizteste-3205ps3000.c   
    866    1    Programa 3205
    Warning    22    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.    f:fernando
    luizteste-3205ps3000.c    911    1    Programa 3205
    Warning    23    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.    f:fernando
    luizteste-3205ps3000.c    939    1    Programa 3205

Answers

  • Yes. Those errors are warning only. Microsoft added new secure C Run time library functions for write secure applications. all the secure functions end with _s.  It will validate the destination buffer size. If you want disable those warnings, as the
    warning message explained you can disable all warning. But, your software may face buffer overflow or underflow error. Hackers can easily hack your software. So, if you want build your software in secured way or want handle secure data, you should use secure
    CRT functions.

    You can check my article
    http://www.codeproject.com/KB/security/SecureStringHandling.aspx for more details.

    If you want disable, you can follow the settings.

    Project properties->Configuration Properties->C/C++->Preprocessor->Preprocessor Definitions -> _CRT_SECURE_NO_WARNINGS


    Thanks and Regards Selvam http://www15.brinkster.com/selvamselvam/

    • Marked as answer by

      Wednesday, May 25, 2011 8:19 AM

  • FILE._file have max 512 positions

    _setmaxstdio
    http://msdn.microsoft.com/en-us/library/6e3b887c.aspx

    «C run-time I/O now supports many more open files on Win32
    platforms than in previous versions. Up to 512 files can be
    open simultaneously at the stdio level (that is, opened and
    accessed by means of the fopen, fgetc, fputc, and so forth
    family of functions). The limit of 512 open files at the
    stdio level can be increased to a maximum of 2,048 by
    means of the _setmaxstdio function.»

    — Wayne

    • Marked as answer by
      Rob Pan
      Wednesday, May 25, 2011 8:19 AM

Я работаю над программой сокета UDP в визуальной студии Windows.
Я получаю сообщение об ошибке для оператора sprintf. Как это исправить?
Мой код:

    for (i = 0; i < 30;i++) //take-off
{
    printf("send AT*REF:take offn");
            sprintf(command, "AT*REF=%d,290718208r", seq++);



    rc = sendto(sd, command, strlen(command) + 1, flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
    if (rc<0) {
        printf("%s: can not send datan", argv[0]);
            return(1);
                    }
     }

Ошибки, которые я получаю, следующие:

Error   1 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Error   1 error LNK2019: unresolved external symbol [email protected]
Error   2 error LNK2019: unresolved external symbol [email protected] referenced in function _main 
Error   3 error LNK2019: unresolved external symbol [email protected]
Error   4 error LNK2019: unresolved external symbol [email protected]
Error   5 error LNK2019: unresolved external symbol [email protected]
Error   6 error LNK2019: unresolved external symbol [email protected]
Error   7 error LNK1120: 6 unresolved externals 

09 апр. 2014, в 08:56

Поделиться

Источник

2 ответа

printf и его сестра-функция sprintf считаются небезопасными из-за количества поведения undefined, которое они испускают, если они используются неправильно.

Visual Studio отключает эти функции по умолчанию.

Но, поскольку они являются частью стандартной библиотеки С++, вы можете их использовать. Но Visual Studio позволит вам сделать это, если вы включите строку

#define _CRT_SECURE_NO_WARNINGS

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

В качестве альтернативы включите _CRT_SECURE_NO_WARNINGS в настройки вашего препроцессора проекта (что я и делаю).

(Кстати, Visual Studio выдает очень полезное сообщение об ошибке в этом случае. Попробуйте научиться их интерпретировать.)

Bathsheba
09 апр. 2014, в 08:28

Поделиться

Для большинства ошибок в вашем вопросе вам нужно добавить ws2_32.lib в библиотеку, к которой ссылается проект (в свойстве VS project Linker | Input | Additional Dependencies).

Другие ответы/комментарии касались проблемы sprintf(): либо определяли макрос _CRT_SECURE_NO_WARNINGS, либо использовали версию sprintf(), которую Microsoft считает безопасным, например sprintf_s(). Я хочу, чтобы MSVC имел стандартную версию snprintf(), которая может быть использована (может быть, скоро — они добавляют к инструменту целую цепочку C99).

Michael Burr
09 апр. 2014, в 08:12

Поделиться

Ещё вопросы

  • 0Как удалить элементы и массив по двум атрибутам в AngularJS?
  • 1Поперечная операция не действительна
  • 1Воспроизвести звук, когда объекты сталкиваются
  • 0Обратное геокодирование в BlackBerry 10
  • 0Бесконечная прокрутка перестает работать, как только я добавляю функцию ImagesLoaded в начальное состояние масонства
  • 0Применение таблицы стилей к одному элементу
  • 0Как получить координаты справа от прокручиваемого вида с событиями ионных жестов?
  • 0Я получаю исключение при подключении моего сервера SQL
  • 0Конструктор копирования связанного списка
  • 0Angularjs: проверить, включена ли отладка в декораторе $ log
  • 1ANDROID ACTION_VIEW показывает неправильное изображение из URI
  • 0Получить как значение в строке как столбец?
  • 1В зависимом раскрывающемся списке не отображаются параметры
  • 1Что происходит, если сам процесс Node занят
  • 1Невозможно нарисовать линии в JPanel
  • 1Я импортировал Selenium, и я думал, что он был установлен с Python, я не могу найти, где это идет не так
  • 1WinAPI MoveWindow функция не работает для некоторых окон
  • 0Конвертировать HTML в XML, используя Java
  • 1Версия сборки .NET — какая разница (на основе опыта System.Web.Mvc)
  • 0jQuery: показать несколько элементов одновременно
  • 1Уведомления и AlarmManager — отмена будильника, который я установил
  • 0Использование базы данных MySQL из плагина Artifactory
  • 1mongodb возвращает размер / количество массивов в простом поисковом запросе без использования механизма агрегирования [duplicate]
  • 1Пользовательский Сериализатор Джексона для определенного типа в определенном классе
  • 0Основы стеков
  • 0Выполнять цикл PHP каждые X секунд
  • 0Segfault при использовании std :: string.c_str () в качестве аргумента для другого метода
  • 0Как получить имя файла, который загружен во вложении, используя php
  • 0Переключатель phpbrew не меняет версию PHP
  • 0jquery .html () VS innerHTML ()
  • 0Настроить таблицу MySQL для заказа по уникальному индексу
  • 0Соответствующая строка без определенного шаблона между определенными местами
  • 0$ rootcope часы не работают в течение очень короткого времени
  • 1Python & Nameko — GreenSSLSocket не имеет публичного конструктора. Экземпляры возвращаются SSLContext.wrap_socket ().
  • 0Как читать данные из кеша в с ++
  • 0SOAP возвращает ошибку «значение не может быть недействительным. Параметр имя документа »
  • 1как реагировать на намерения браузера?
  • 0Как включить несколько файлов JS в зависимости от события onload или $ (document) .ready ()?
  • 1интеграция webpack и kafka-узла
  • 0C ++ Выход из цикла после нажатия определенной клавиши
  • 0Как получить Выбранное значение из выпадающего списка в Angularjs?
  • 1Сгруппируйте и примените строку в одной записи ко всей группе
  • 0CSS элементы div, наложенные, когда они не должны быть закрыты
  • 0Избыточные экземпляры статически связанной библиотеки?
  • 0Как сделать div с переменной шириной, чтобы заполнить оставшуюся часть родителя и сделать себя прокручиваемым при необходимости
  • 0PHPSESSID длина по умолчанию
  • 1Записывать и воспроизводить UDP-пакеты с синхронизацией
  • 0IE блокирует JQuery при первой загрузке страницы
  • 0Когда я получу «0.0.0.xx» или «0xxxx» с сервера, исходный код HTML закончится до начала последовательности
  • 1Vue.js добавляет класс при обновлении вычисленного значения

Сообщество Overcoder

Я работаю над программой сокета UDP в Windows Visual Studio.
Я получаю сообщение об ошибке для оператора sprintf. Как это исправить?
Мой код:

    for (i = 0; i < 30;i++) //take-off
{
printf("send AT*REF:take offn");
sprintf(command, "AT*REF=%d,290718208r", seq++);rc = sendto(sd, command, strlen(command) + 1, flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
if (rc<0) {
printf("%s: can not send datan", argv[0]);
return(1);
}
}

Я получаю следующие ошибки:

Error   1 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Error   1 error LNK2019: unresolved external symbol __imp__bind@12
Error   2 error LNK2019: unresolved external symbol __imp__htonl@4 referenced in function _main
Error   3 error LNK2019: unresolved external symbol __imp__htons@4
Error   4 error LNK2019: unresolved external symbol __imp__sendto@24
Error   5 error LNK2019: unresolved external symbol __imp__socket@12
Error   6 error LNK2019: unresolved external symbol __imp__gethostbyname@4
Error   7 error LNK1120: 6 unresolved externals

5

Решение

printf и его сестринская функция sprintf считаются небезопасными из-за количества неопределенное поведение они излучают, если используются неправильно.

Visual Studio по умолчанию отключает эти функции.

Но, поскольку они являются частью стандартной библиотеки C ++, вы Можно используй их. Но Visual Studio позволит вам сделать это, только если вы включите строку

#define _CRT_SECURE_NO_WARNINGS

перед включением соответствующих заголовков стандартной библиотеки.

В качестве альтернативы, включить _CRT_SECURE_NO_WARNINGS в вашем проекте настройки препроцессора (что я и делаю).

(Кстати, Visual Studio в этом случае выдает очень полезное сообщение об ошибке. Постарайтесь научиться их интерпретировать.)

23

Другие решения

Для большинства ошибок в вашем вопросе вам нужно добавить ws2_32.lib в библиотеку, на которую ссылается проект (в проекте VS Linker | Input | Additional Dependencies имущество).

Другие ответы / комментарии адресованы sprintf() проблема: либо определил макрос _CRT_SECURE_NO_WARNINGS или используйте версию sprintf() Microsoft считает это безопасным, например, sprintf_s(), Я бы хотел, чтобы у MSVC была стандартная версия snprintf() это может быть использовано (может быть, скоро — они добавляют довольно много C99 в цепочку инструментов).

3

Понравилась статья? Поделить с друзьями:
  • Error c4996 getch
  • Error c4996 fopen this function or variable may be unsafe
  • Error c4716 должна возвращать значение
  • Error c4703 используется потенциально неинициализированная локальная переменная указатель
  • Error c4700 использована неинициализированная локальная переменная