Error c4996 fopen this function or variable may be unsafe

Ошибка "C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead" C++ Решение и ответ на вопрос 1172368

sektor2009

3 / 3 / 2

Регистрация: 15.03.2009

Сообщений: 347

1

11.05.2014, 16:57. Показов 87863. Ответов 8

Метки нет (Все метки)


error 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.
не нравится вот эта строчка

C++
1
2
a=fopen("Pole.txt","r");
    bb=fopen("rezult.txt","w");

читал что надо писать fopen_s() Но тогда не нравится ему что в нутри скобок) не принимает char

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



231 / 231 / 69

Регистрация: 30.09.2012

Сообщений: 545

11.05.2014, 17:19

2

sektor2009, Вам же компилятор сам сказзал, что нужно сделать. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Курсор на имя вашего проекта, жать ПКМ, выбираем свойства — Свойства конфигурации -> C/C++ -> Препроцессор и в определения препроцессора добавляем ;_CRT_SECURE_NO_WARNINGS , после чего ОК и ошибки нет.



4



3 / 3 / 2

Регистрация: 15.03.2009

Сообщений: 347

11.05.2014, 17:44

 [ТС]

3

не помогло (((
что делать??



0



7 / 4 / 14

Регистрация: 05.02.2014

Сообщений: 131

11.05.2014, 17:59

4

sektor2009,
#include <iostream>
#include <fstream>

fstream f;
f.open(filename, ios: out);

Добавлено через 1 минуту
f.close();

где filename — имя файла

лучше всего сделать
char filename[32];
cout <<«Name file n»;
cin >> filename;



0



231 / 231 / 69

Регистрация: 30.09.2012

Сообщений: 545

11.05.2014, 18:03

5

sektor2009, Move to front, алгоритм на C++, error C4996: ‘fopen’: Посмотрите, что пишет Croessmah. Когда ошибка станет варнингом( то есть предупреждением) её можно будет убрать тем, что я писал или же перед всеми инклудами вставить строчку #define _CRT_SECURE_NO_WARNINGS Это снимет предупреждения.



4



degree128

1 / 1 / 0

Регистрация: 03.09.2018

Сообщений: 71

13.10.2018, 14:58

6

Для решения проблемы нужно написать

C++
1
2
FILE *a;
 fopen_s(a,"FIlename","r");



0



AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

25.02.2021, 09:40

7

C++
1
2
3
4
5
6
7
8
9
10
char InFileName[80]; // Имя входного файла
    printf_s("Введите имя входного файла: ");
    cin >> InFileName;
    FILE *InFile;
    fopen_s(InFile, "InFileName", "r"); // Открываем файл для чтения
    if (!InFile) {
        printf_s("Ошибка при открытии файлаn");
        _getch();
        return;
    }

Ошибка (активно) E0167 аргумент типа «FILE *» несовместим с параметром типа «FILE **»



0



Volga_

Эксперт CЭксперт С++

4259 / 2465 / 1334

Регистрация: 14.12.2018

Сообщений: 4,633

Записей в блоге: 1

25.02.2021, 09:52

8

Цитата
Сообщение от AlinDen
Посмотреть сообщение

fopen_s(InFile, «InFileName», «r»); // Открываем файл для чтения
    if (!InFile) {

Надо:

C++
1
2
3
errno_t err = fopen_s(&InFile, InFileName, "r");
    if (err)
    {



0



AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

25.02.2021, 10:22

9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void Menu7()
{
    FILE *InFile;
    char InFileName[80]; // Имя входного файла
    printf_s("Введите имя входного файла: ");
    cin >> InFileName;
    
    errno_t err = fopen_s(&InFile, InFileName, "r"); // Открываем файл для чтения
    if (err) {
        printf_s("Ошибка при открытии файлаn");
        _getch();
        return;
    }
 
    int i, j;
    for (i = 1; i <= N; i++) // Заполняем индексный массив
        ind[i] = i;
 
    int m[N + 1]; // Массив частот символов
    float _p[N + 1]; // Массив для хранения исходных вероятностей
 
    for (i = 1; i <= N; i++) // Обнуляем массив частот символов
        m[i] = 0;
    char _c;
    while (!feof(InFile)) {
        fscanf_s(InFile, "%c", &_c); // Читаем символ из файла
        if (_c != 10 && _c != 13)
            m[GetNo(_c)]++;
    }
    fclose(InFile);
    int s = 0; // Сумма всех частот
    for (i = 1; i <= N; i++)
        s += m[i];
    for (i = 1; i <= N; i++)
        p[i] = (float)m[i] / s;
    SortP(); // Сортируем массив вероятностей
    for (i = 1; i <= N; i++) // Сохраняем исходные вероятности
        _p[i] = p[i];
 
    for (i = 1; i <= N; i++) {
        for (j = 1; j <= N; j++)
            c[i][j] = 0;
        l[i] = 0;
    }
    Huffman(N);
 
    char OutFileName[80];  // Имя выходного файла
    printf_s("Введите имя выходного файла: ");
    cin >> OutFileName;
    FILE *OutFile;
    errno_t er = fopen_s(&OutFile, OutFileName, "w"); // Открываем файл для записи
    if (er) {
        printf_s("Ошибка при создании файлаn");
        _getch();
        return;
    }
 
    errno_t errr = fopen_s(&InFile, "InFileName", "r");
    while (errr) { // Кодируем файл
        fscanf_s(InFile, "%c", &_c); // Читаем символ из файла
        if (_c != 10 && _c != 13) {
            int no = ind[GetNo(_c)];
            for (j = 1; j <= l[no]; j++)
                fprintf(OutFile, "%d", c[no][j]);
        }
        else
            fprintf(OutFile, "%c", _c);
    }
    fclose(InFile);
    fclose(OutFile);
 
    _getch();
    return;
}

Ошибка LNK2019 ссылка на неразрешенный внешний символ WinMain в функции «int __cdecl invoke_main(void)» (?invoke_main@@YAHXZ)



0



Many of Microsoft’s secure functions, including fopen_s(), are part of C11, so they should be portable now. You should realize that the secure functions differ in exception behaviors and sometimes in return values. Additionally you need to be aware that while these functions are standardized, it’s an optional part of the standard (Annex K) that at least glibc (default on Linux) and FreeBSD’s libc don’t implement.

However, I fought this problem for a few years. I posted a larger set of conversion macros here., For your immediate problem, put the following code in an include file, and include it in your source code:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Of course this approach does not implement the expected exception behavior.

Содержание

  1. Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio
  2. Предупреждение компилятора (уровень 3) C4996
  3. Комментарии
  4. Отключение предупреждения
  5. Отключение предупреждения для определенной строки кода
  6. Отключение предупреждения в файле
  7. Отключение предупреждения в сборках командной строки
  8. Отключение предупреждения для проекта в Visual Studio
  9. Отключение предупреждения с помощью макросов препроцессора
  10. Имена функций POSIX
  11. Небезопасные функции библиотеки CRT
  12. Небезопасные функции стандартной библиотеки
  13. Проверенные итераторы включены
  14. Небезопасный код MFC или ATL
  15. Устаревшие функции и переменные CRT
  16. Маршалинг ошибок в коде СРЕДЫ CLR
  17. Пример: определяемая пользователем нерекомендуемая функция
  18. Error 1 error c4996 fopen this function or variable may be unsafe
  19. Все вопросы

Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio

Время чтения: 5 минут

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

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

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт «Проект» в верхнем меню

2. В открывшемся списке щёлкнем по «Свойства название_проекта»

3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

6. Попробуем заново выполнить сборку проекта:

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

Выпускник МГУ им. М.В. Ломоносова

Programforyou — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.

Источник

Предупреждение компилятора (уровень 3) C4996

Код использует функцию, член класса, переменную или определение типа, помеченную как нерекомендуемую. Символы устарели с помощью __declspec(deprecated) модификатора или атрибута C++14 [[deprecated]] . Фактическое предупреждающее сообщение C4996 задается модификатором или атрибутом deprecated объявления.

Это предупреждение всегда является преднамеренным сообщением автора файла заголовка, объявляющего символ. Не используйте устаревший символ без понимания последствий.

Комментарии

Многие функции, функции-члены, шаблоны функций и глобальные переменные в библиотеках Visual Studio устарели. Некоторые функции, такие как POSIX и функции Майкрософт, устарели, так как теперь они имеют другое предпочтительное имя. Некоторые функции библиотеки среды выполнения C устарели, так как они небезопасны и имеют более безопасный вариант. Другие нерекомендуемые, так как они устарели. Сообщения об устаревании обычно включают предполагаемую замену устаревшей функции или глобальной переменной.

Отключение предупреждения

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

Отключение предупреждения для определенной строки кода

Чтобы отключить предупреждение для определенной строки кода, используйте директиву warning pragma. #pragma warning(suppress : 4996)

Отключение предупреждения в файле

Чтобы отключить предупреждение в файле для всего следующего, используйте директиву pragma #pragma warning(disable : 4996) предупреждения.

Отключение предупреждения в сборках командной строки

Чтобы отключить предупреждение глобально в сборках командной строки, используйте параметр командной /wd4996 строки.

Отключение предупреждения для проекта в Visual Studio

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Выберите страницу свойств> конфигурацииC/C++>Advanced.

Измените свойство Disable Specific Warnings для добавления 4996 . Нажмите кнопку «ОК» , чтобы применить изменения.

Отключение предупреждения с помощью макросов препроцессора

Вы также можете использовать макросы препроцессора для отключения определенных классов предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.

Чтобы определить макрос препроцессора в Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Разверните свойства > конфигурации препроцессора C/C++>.

В свойстве «Определения препроцессора» добавьте имя макроса. Нажмите кнопку ОК для сохранения изменений, а затем выполните повторную сборку проекта.

Чтобы определить макрос только в определенных исходных файлах, добавьте строку, #define EXAMPLE_MACRO_NAME например перед любой строкой, включающей файл заголовка.

Ниже приведены некоторые распространенные источники предупреждений и ошибок C4996:

Имена функций POSIX

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Корпорация Майкрософт переименовывает некоторые функции БИБЛИОТЕК POSIX и Microsoft в CRT в соответствии с ограничениями C99 и C++03 для зарезервированных и глобальных имен, определенных реализацией. Не рекомендуется использовать только имена, а не сами функции. В большинстве случаев в имя функции был добавлен символ подчеркивания, чтобы создать соответствующее имя. Компилятор выдает предупреждение об устаревании для исходного имени функции и предлагает предпочтительное имя.

Чтобы устранить эту проблему, мы обычно рекомендуем изменить код, чтобы использовать предлагаемые имена функций. Однако обновленные имена зависят от корпорации Майкрософт. Если вам нужно использовать существующие имена функций по причинам переносимости, эти предупреждения можно отключить. Функции по-прежнему доступны в библиотеке под их исходными именами.

Чтобы отключить предупреждения об устаревании для этих функций, определите макрос _CRT_NONSTDC_NO_WARNINGS препроцессора. Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .

Небезопасные функции библиотеки CRT

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Корпорация Майкрософт не рекомендует использовать некоторые функции стандартной библиотеки CRT и C++, так как доступны более безопасные версии. Большинство устаревших функций позволяют отменить доступ на чтение или запись к буферам. Их неправильное использование может привести к серьезным проблемам безопасности. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию.

Чтобы устранить эту проблему, рекомендуется использовать вместо нее функцию или переменную safe-version . Иногда невозможно, по соображениям переносимости или обратной совместимости. Тщательно убедитесь, что в коде невозможно перезаписать или перечитать буфер. Затем можно отключить предупреждение.

Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .

Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .

Дополнительные сведения об этих устаревших функциях и глобальных функциях см. в разделе «Функции безопасности» в CRT и безопасных библиотеках: стандартная библиотека C++.

Небезопасные функции стандартной библиотеки

‘std:: function_name ::_Unchecked_iterators::_Deprecate’ Call to std:: function_name with parameters that may be unsafe — this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’

В Visual Studio 2015 это предупреждение отображается в отладочных сборках, так как некоторые шаблоны функций стандартной библиотеки C++ не проверяют правильность параметров. Часто это связано с тем, что функции недостаточно информации для проверки границ контейнера. Или, поскольку итераторы могут использоваться неправильно с функцией. Это предупреждение помогает определить эти функции, так как они могут быть источником серьезных дыр в вашей программе. Дополнительные сведения см. в разделе «Проверенные итераторы».

Например, это предупреждение отображается в режиме отладки при передаче указателя std::copy на элемент вместо обычного массива. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека может проверить экстенты массива и выполнить проверку границ.

В C++14 были обновлены несколько стандартных алгоритмов библиотеки с версиями «двойного диапазона». При использовании версий двойного диапазона второй диапазон обеспечивает необходимую проверку границ:

В этом примере показано несколько других способов использования стандартной библиотеки для проверки использования итератора, а также если флажок использования может быть опасным:

Если вы убедились, что код не может иметь ошибку переполнения буфера, вы можете отключить это предупреждение. Чтобы отключить предупреждения для этих функций, определите _SCL_SECURE_NO_WARNINGS .

Проверенные итераторы включены

C4996 также может возникнуть, если вы не используете проверяемый итератор, если _ITERATOR_DEBUG_LEVEL он определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — значение 0. Дополнительные сведения см. в разделе «Проверенные итераторы».

Небезопасный код MFC или ATL

C4996 может возникнуть, если вы используете функции MFC или ATL, которые были нерекомендуемые по соображениям безопасности.

Чтобы устранить эту проблему, настоятельно рекомендуется изменить код для использования обновленных функций.

Сведения о том, как отключить эти предупреждения, см. в разделе _AFX_SECURE_NO_WARNINGS .

Устаревшие функции и переменные CRT

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.

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

Чтобы отключить предупреждения об устаревании для этих элементов, определите _CRT_OBSOLETE_NO_WARNINGS . Дополнительные сведения см. в документации по устаревшей функции или переменной.

Маршалинг ошибок в коде СРЕДЫ CLR

C4996 также может возникать при использовании библиотеки маршалинга CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при marshal_as преобразовании между двумя типами данных, которым требуется marshal_context класс. Эту ошибку также можно получить, если библиотека маршалинга не поддерживает преобразование. Дополнительные сведения о библиотеке маршалинга см. в обзоре маршалинга в C++.

В этом примере возникает ошибка C4996, так как для библиотеки маршалинга требуется контекст для преобразования из a System::String в . const char *

Пример: определяемая пользователем нерекомендуемая функция

Атрибут можно использовать в собственном коде deprecated , чтобы предупреждать вызывающих объектов, если вы больше не рекомендуете использовать определенные функции. В этом примере C4996 создается в двух местах: одна для строки, в которой объявлена нерекомендуемая функция, и одна для строки, в которой используется функция.

Источник

Error 1 error c4996 fopen this function or variable may be unsafe

Не понимаю почему не открывается детальное описание продукта

Пишу скрипты для BAS только на запросах

Как поднять свой VPN на Android?

Нужно решить задачу по программированию на массивы

Метода Крамера С++

помогите решить задачу на C++

Помогите решить задачу на python с codeforces

Generate Additional Engagement Image Masking Service

Join Us Today Ghost Mannequin Effect Service

Its Urban Malaysia Phone Number List Exceeds

橱柜并烤 手机号码 了一个纸杯蛋糕之后

middleware которое будет возвращать ошибку если за последние n секунд было больше k запросов c одного ip адреса

codeignite. Посчитать count имея две таблицы.

Create A Loyalty Program Another Thing Growth Buy Email List Hackers Focus On Is Building Customer Loyalty .

How to Create Your UAE Mobile Number Database Buyer Personas?

Почему не запускается программа? Python + TKINTER

Все вопросы

В компиляторе Visual Studio 2005 C++ я получаю следующее предупреждение, когда мой код использует fopen и такие вызовы.

Как мне это предотвратить?

Похоже, что Microsoft устарело множество вызовов, которые используют буферы для повышения безопасности кода. Однако предлагаемые ими решения не являются портативными. В любом случае, если вы не заинтересованы в использовании защищенной версии их вызовов (например, fopen_s), вам нужно поместить определение _CRT_SECURE_NO_DEPRECATE перед включенными заголовочными файлами. Например:

Директива препроцессора также может быть добавлена в настройки проекта, чтобы применить ее ко всем файлам проекта. Для этого добавьте _CRT_SECURE_NO_DEPRECATE в свойства проекта — > свойства конфигурации -> C/C++ — > препроцессор — > определения препроцессора .

Ну вы могли бы добавить а:

прежде чем использовать fopen, но рассматривали ли вы возможность использования fopen_s, как следует из предупреждения? Он возвращает код ошибки, позволяющий проверить результат вызова функции.

Проблема с простым отключением устаревших предупреждений функций заключается в том, что Microsoft может удалить рассматриваемую функцию в более поздней версии CRT, нарушив ваш код (как указано ниже в комментариях, это не произойдет в данном случае с fopen, потому что это часть стандартов C & C++ ISO).

Это просто дерзость Microsoft. «Deprecated» подразумевает языковую функцию, которая не может быть предусмотрена в будущих версиях стандартного языка / стандартных библиотек, как это предписано комитетом по стандартам. Это не означает или не должно означать: «мы, в одностороннем порядке, не думаем, что вы должны использовать его», независимо от того, насколько обоснован этот совет.

Если ваш код предназначен для другого OS (например, Mac OS X, Linux) , вы можете использовать следующее:

Рассмотрите возможность использования библиотеки переносимости, такой как glib или apache portable runtime . Они, как правило, обеспечивают безопасный, портативный Альтернативы для звонков, как эти. Это тоже хорошо, потому что эти небезопасные вызовы устарели в большинстве современных сред.

Я использую VisualStdio 2008. В этом случае я часто ставлю Preprocessor Definitions

Свойства Меню Project [ProjectName]. Alt+F7

Если щелкнуть это меню или нажать Alt + F7 в окне проекта, вы увидите окно «Property Pages».

Затем смотрите меню слева от окна.

Свойства Конфигурации C/C++ Препроцессор

Затем добавьте _CRT_SECURE_NO_WARNINGS в Preprocessor Definitions .

Если вы хотите, чтобы он был использован на многих платформах, вы можете использовать его в качестве комментария, например:

Многие из защищенных функций Microsoft, включая fopen_s(), являются частью C11, поэтому теперь они должны быть переносимыми. Вы должны понимать,что защищенные функции отличаются поведением исключений и иногда возвращаемыми значениями. Кроме того, вы должны знать, что, хотя эти функции стандартизированы, это необязательная часть стандарта (приложение K), которую по крайней мере glibc (по умолчанию на Linux) и FreeBSD libc не реализуют.

Однако я боролся с этой проблемой в течение нескольких лет. Я разместил здесь больший набор конверсий macros. Для решения вашей непосредственной проблемы поместите следующий код во включаемый файл и включите его в исходный код:

Конечно, этот подход не реализует ожидаемое поведение исключения.

Для тех, кто использует версию Visual Studio 2017, похоже, что определение препроцессора, необходимое для выполнения небезопасных операций, изменилось. Используйте вместо этого:

Тогда он будет компилироваться.

У меня тоже была такая же проблема. Когда я пытаюсь добавить библиотеку opencv

Я получил не предупреждение, а ошибку.

Я также использовал директивы препроцессора, как уже упоминалось. Но это не решило проблему.

Я решил ее следующим образом:

  • Перейдите в свойства — > C/C++ -> предварительно скомпилированные заголовки — > Выберите не использовать предварительно скомпилированные заголовки в предварительно скомпилированном заголовке.

Источник

2 Августа 2017

Время чтения: 5 минут

Visual Studio unsafe error скриншот

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

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

#include "stdafx.h"
#include <stdio.h>

int main() {
	int a, b;

	printf("Enter a: ");
	scanf("%d", &a);

	printf("Enter b: ");
	scanf("%d", &b);

	printf("a: %d, b: %dn", a, b);
	return 0;
}

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт «Проект» в верхнем меню

2. В открывшемся списке щёлкнем по «Свойства название_проекта»

Программа, вводящая два числа и выводящая их

Программа, вводящая два числа и выводящая их

Ошибка компиляции из-за небезопасности функций

Ошибка компиляции из-за небезопасности функций

Проект -> Свойства {навание проекта}

Проект — Свойства {навание проекта}

3. В появившемся окне выберем Свойства конфигурации, C/C++, Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

5. Нажмём ОК

Свойства конфигурации

Свойства конфигурации

Определения препроцессора

Определения препроцессора

OK

Нажимаем OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

Выпускник МГУ им. М.В. Ломоносова

  • Remove From My Forums
  • Question

  • I saw this example to open file:

    int main(){

    FILE * pFile; pFile = fopen("myfile.txt", "w"); if (pFile != NULL) { fputs("fopen example", pFile); fclose(pFile); } return 0;

    }

    But when I run this code was a error:

    Error
    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.

    So I used  ‘fopen_s’ and ran this code:

    int main(){

    FILE * pFile; FILE * stream; pFile = fopen_s(&stream,"myfile.txt", "w"); if (pFile != NULL) { fputs("fopen example", pFile); fclose(pFile); }

    return 0;

    }

     But was a this error:

    Error C2440
    ‘=’: cannot convert from ‘errno_t’ to ‘FILE *’

    What I need to do for corect compile this code?

    • Edited by

      Sunday, July 17, 2016 2:14 PM

Answers

  • The fopen_s function return type is errno_t and you’re trying to assign it to a variable of type FILE *, which is what the compiler is telling you.

    Have a look at the example on the
    fopen_s function documentation page to see how to use it correctly.


    Cheers
    Eddie

    • Proposed as answer by
      RLWA32
      Sunday, July 17, 2016 4:12 PM
    • Marked as answer by
      Hart Wang
      Monday, July 25, 2016 3:06 AM

  • What I need to do for corect compile this code?

    1. Read the documentation for fopen_s.

    2. Curse (or thank Microsoft for easy and intuitive API if you like)

    3. Fix your code

    — pa

    • Proposed as answer by
      RLWA32
      Sunday, July 17, 2016 4:12 PM
    • Marked as answer by
      Hart Wang
      Monday, July 25, 2016 3:06 AM

https://iodocs.com/wp-admin/post.php?post=1238&action=edit&message=1

fopen deprecated warning
On Visual Studio 2015 C++ compiler, I get the following warning when my code uses the fopen and such calls.

foo.cpp(5) : warning C4996: ‘fopen’ was declared deprecated

        c:program filesmicrosoft visual studio 8vcincludestdio.h(234) : see declaration of ‘fopen’

        Message: ‘This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.’

Answer:

Well, you could add a:

#pragma warning (disable : 4996)

Before you are possible to use fopen but become you considered using fopen_s as the warning recommends? It returns an error code permitting you to check the result of the function call.

The problem with just disabling deprecated function warnings is that Microsoft may discard the role in question in a later version of the CRT, breaking your code. Now, this won’t happen in this instance with fopen because it’s part of the C & C++ ISO standards.

System information (version)
  • OpenCV => 3.2.0 rc (Latest version)
  • Operating System / Platform => Windows10 64bit
  • Compiler => Visual Studio 2015 Update3
Detailed description

Source: %OPENCV_PATH%includeopencv2flannlogger.h 67
Error 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.

Steps to reproduce

Build below code with opencv_flann.

#include <Windows.h>
#include <opencv2/opencv.hpp>

void main(int argc, char* argv[])
{
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nCmd)
{
    main(0,NULL);
}
logger.h : Original code.
66: stream = fopen(name,"w");
67: if (stream == NULL) {
68:     stream = stdout;
69: }
logger.h : Fixed code.
66: #if _MSC_VER >= 1500
67:     errno_t error;
68:     error = fopen_s(&stream, name, "w");
69:     if (error != 0) {
70:         stream = stdout;
71:     }
72: #else
73:     stream = fopen(name,"w");
74:     if (stream == NULL) {
75:         stream = stdout;
76:     }
77: #endif
  • Forum
  • Windows Programming
  • Fopen giving error

Fopen giving error

void In(void) //read the image
{
int i, j;
double el;
char buff[255];
stream = fopen(«test.txt», «r»); //skeltonize -> newedg.txt & normal myFile1
for (j = 0; j < ny; j++) //row
for (i = 0; i < nx; i++) //col
{
fscanf(stream, «%lf», &el);
I[i][j] = el;
}
fclose(stream);
}

This is the aspect of the code and this is the error i get:

Error C4996 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead.

Error C4996 ‘fscanf’: This function or variable may be unsafe. Consider using fscanf_s instead.

If you are using Visual Studio you can #define _CRT_SECURE_NO_WARNINGS before your #include files.

Not recommended. It is using a bomb to swat a fly. And doesn’t fix the problems with the functions, you can still have buffer overruns.

OR

Use C11’s fopen_s() and fscanf_s() function that was created to prevent buffer overruns. As suggested in the error messages.

https://en.cppreference.com/w/c/io/fopen
https://en.cppreference.com/w/c/io/fopen

Still not working. Any other solution

Don’t use C code. Write C++ instead. Something like this should do it, assuming I is an array of some sensible type.

1
2
3
4
5
6
7
8
ifstream inputFile("test.txt");
for (j = 0; j < ny; j++) //row
{
  for (i = 0; i < nx; i++) //col
  {
    inputFile >>  I[i][j];
  }
}

Last edited on

You should check if and why fopen fails.

1
2
3
4
5
6
stream = fopen("test.txt", "r"); 
if (stream == NULL)
{
  perror(NULL); // #include <stdio.h>
  return;
}

Topic archived. No new replies allowed.

Понравилась статья? Поделить с друзьями:
  • Error c4430 missing type specifier int assumed note c does not support default int
  • Error c4235 nonstandard extension used asm keyword not supported on this architecture
  • Error c4065e type of input file
  • Error c3867 visual studio
  • Error c3861 strcpy identifier not found