Предупреждение C6031
Предупреждение C6031 указывает, что вызывающий объект не проверка возвращаемое значение функции для сбоя. В зависимости от вызываемой функции этот дефект может привести к, казалось бы, случайной программе неправильной работы. Это включает сбои и повреждения данных в условиях ошибки или ситуации с низким ресурсом.
Как правило, небезопасно предположить, что вызовы функций, требующих дисков, сети, памяти или других ресурсов, будут успешными. Вызывающий объект всегда должен проверка возвращаемое значение и обрабатывать случаи ошибок соответствующим образом. Также рекомендуется использовать заметку _Must_inspect_result_ , которая проверка, что значение проверяется полезным способом.
Имя анализа кода: RETVAL_IGNORED_FUNC_COULD_FAIL
Пример
Следующий код создает предупреждение C6031:
#include void f( ) < fopen( "test.c", "r" ); // C4996, C6031 return value ignored // code . >
Чтобы исправить это предупреждение, проверка возвращаемое значение функции, как показано в следующем коде:
#include void f( ) < FILE *stream; if ( (stream = fopen( "test.c", "r" )) == NULL ) return; // code . >
Следующий код использует безопасную функцию fopen_s для исправления этого предупреждения:
#include void f( ) < FILE *stream; errno_t err; if ( (err = fopen_s( &stream, "test.c", "r" )) !=0 ) < // code . >>
Это предупреждение также создается, если вызывающий объект игнорирует возвращаемое значение функции, аннотированной свойством _Check_return_ , как показано в следующем коде.
#include _Check_return_ bool func(); void test_f() < func(); // Warning C6031 >
Чтобы исправить предыдущее предупреждение, проверка возвращаемое значение, как показано в следующем коде:
#include _Check_return_ bool func(); void test_f() < if ( func() ) < // code . >>
В случаях, когда необходимо игнорировать возвращаемое значение функции, назначьте возвращаемое значение std::ignore . Назначение std::ignore явно указывает намерение разработчика и помогает в будущем обслуживании кода.
#include #include #include void f() < std::srand(static_cast(std::time(nullptr))); // set initial seed value to system clock std::ignore = std::rand(); // Discard the first result as the few random results are always small. // . >
Возвращаемое значение пропущено scanf как исправить
Сообщений: 6
Метод Гаусса C++
Написал код, выдает ошибку и предупреждения.
Ошибка C4700 «использована неинициализированная локальная переменная «j»»
Предупреждение C6031 «Возвращаемое значение пропущено: «scanf»»
Предупреждение C4552 «»
#define _CRT_SECURE_NO_WARNINGS #include #include //описание функций ввода-вывода #include //описание математических функций #include //описание функции malloc и free #include using namespace std; int gaussMethod( int m, int n, double *a, double eps ); int main() < int m, n, i, rank; int j; double* a; double eps, det; printf("Введите размер матрицы m,n: "); scanf("%d%d", &m, &n); a = new double[m * n]; printf("Введите элементы матрицы: "); for (i = 0; i < m; ++i) < for (j < 0; j < n; ++j) < scanf("%lf", &(a[i * n + j])); >> printf("Введите точность вычислений eps: "); scanf("%lf", &eps); rank = gaussMethod(m, n, a, eps);//Вызываем метод Гаусса printf("Ступенчатый вид матрицы: \n"); for (i = 0; i < m; ++i) < for (j = 0; j < n; ++j) < printf("%10.3lf", a[i * n + j]); >printf("\n"); > printf("Ранг матрицы: %d\n", rank); if (m == n) < det = 1.0; for (i = 0; i < m; ++i) < det *= a[i * n + i]; >printf("Определитель матрицы = %3lf\n", det); > delete[]a; return 0; int gaussMethod( int m, int n, double* a, double eps); < int i,j,k,l; double r; i = 0; j = 0; while (i < m && j < n) < r = 0.0; for (k = i; k < m; ++k) < if (fabs(a[k * n + j]) >r) < l = k; r = fabs(a[k * n + j]); >if (r ++j; continue; > if (l != i) < for (k = j; k < n; ++k) < r = a[i * n + k]; a[i * n + k] = a[l * n + k]; a[l * n + k] = (-r);//меняем знак строки >> r = a[i * n + j]; assert(fabs(r) > eps); for (k = i + 1; k < m; ++k) < double c = (-a[k * n + j]) / r; a[k * n + j] = 0.0; for (l = j + 1; l < n; ++l) < a[k * n + l] += c * a[i * n + l]; >++i; ++j; > return i; > > > >
Последний раз редактировалось Ars_Kis; 15.04.2023 в 17:33 . Причина: Добавление
Как исправить ошибку «return value ignored:’scanf'» в коде C6031 в Visual Studio
Я совсем новичок в кодировании C (и кодировании в целом), поэтому я практиковался с некоторыми случайными программами. Это предполагается для определения стоимости транзитного билета (Translink Vancouver prices) на основе возраста пользователя и желаемого количества «зон» (сколько далеко они хотят пройти). Я успешно скомпилировал это, но по какой-то причине, которую я не могу понять, функции scanf игнорируются. Как мне это исправить? Пожалуйста, имейте в виду, что я только несколько дней кодировал. Спасибо!
int main(void) < int zones; int age; double price = 0.00; printf("Welcome to TransLink cost calculator!\n\n"); printf("Please enter the desired number of zones (1, 2, or 3) you wish to travel: "); scanf("%d", &zones); if (zones < 1) < printf("Invalid entry\n"); price = 0.00; >else if (zones > 3) < printf("Invalid entry\n"); price = 0.00; >else if (zones == 1) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0.00) < printf("Invalid Aage"); >else if (age < 5) < price = 1.95; >else if (age >= 5) < price = 3.00; >> else if (zones == 2) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0) < printf("Invalid Aage"); >else if (age < 5) < price = 2.95; >else if (age >= 5) < price = 4.25; >> else if (zones == 3) < printf("Please enter your age: "); scanf("%d", &age); if (age < 0) < printf("Invalid Aage"); >else if (age < 5) < price = 3.95; >else if (age >= 5) < price = 4.75; >> printf("The price of your ticket is: $%.2f + tax\n", price); system("PAUSE"); return 0; >
Поделиться Источник 19 сентября 2019 в 05:25
3 ответа
Немного лишнего здесь, чтобы добавить в комментарий.
Я использую версию Visual C, но она никогда не жалуется на возвращаемое значение из scanf , которое не используется. Что она делает, так это жалуется, что scanf небезопасен и устарел, когда его нет.
MS думает, что мне следует использовать собственную «более безопасную» версию scanf_s , которая еще хитрее в использовании и, по-видимому, не безопаснее вовсе — потому что это не похожая на замену, но принимает различные аргументы, поэтому легко ошибиться при использовании.
Одна из последующих проблем заключается в том, что компилятор выдает предупреждение для каждого использования scanf (и некоторых других функций), которое затуманяет другие предупреждения. Я справляюсь с этим, как советуют, добавляя #define перед первым включением заголовка библиотеки.
#define _CRT_SECURE_NO_WARNINGS #include
Есть другие вопросы, о которых MS предупреждает, и я фактически размещаю три #defines в начале каждого файла:
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_DEPRECATE #define _CRT_NONSTDC_NO_DEPRECATE #include
Теперь соответствующие предупреждения легко видно.
Поделиться 19 сентября 2019 в 07:42
Возвращаемое значение
1-3) Количество аргументов получения, успешно присвоенных (которое может быть равным нулю в случае, если произошел сбой совпадения до присвоения первого аргумента получения), или ОШИБКА, если сбой ввода происходит до присвоения первого аргумента получения.
Вы игнорируете это возвращаемое значение.
scanf("%d", &age);
int NofScannedArguments=0; /* Number of arguments which were successfully filled by the most recent call to scanf() */ /* . do above once, at the start of your function */ NofScannedArguments= scanf("%d", &age); /* check the return value to find out whether scanning was successful */ if(NofScannedArguments!=1) /* should be one number */ < exit(EXIT_FAILURE); /* failure, assumptions of program are not met */ >
. чтобы узнать, удалось ли сканирование. Не делать это — плохая идея и стоит предупреждения, которое вы получили.
Если вы хотите более изящно обрабатывать сбои, например, попросить пользователя снова,
используйте цикл и прочтите http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html о возможных подводных камнях, с которыми вы можете столкнуться.
Я не говорю, что вы НЕ должны использовать scanf, статья многое объясняет об использовании scanf, пытаясь убедить вас не использовать.
Поделиться 19 сентября 2019 в 06:05
Использование функций C++ для ввода SO намного проще. Вместо scanf и printf можно использовать cin и cout, как показано ниже:
#include // for cin and cout use int main() < int zones; std::cout > zones; std::cout
Ошибка scanf

Решил вкатится в программирование на C.Сначала всё было нормально, скачал Microsoft Visual Studio, сделал несколько простых программок и все дела.После не длительного периода ещё раз зашёл в Microsoft Visual Studio, что-бы продолжить учиться и вспомнить некоторые вещи.Попробовал создать простую программу со scanf и узрел ошибку : «C6031 Возвращаемое значение пропущено: «scanf». Project1 C:\USERS\CHIPOKU\SOURCE\REPOS\PROJECT1\PROJECT1\SOURCE.C 5″
Попробовал в Sublime Text 3 и всё нормально скомпилировалось и запустилось
1 2 3 4 5 6 7 8
#include int main() { int a; scanf("%d", &a); printf("%d", a); return 0; }