Ссылка деинициализировала память
Неинициализированный указатель происходит, когда указатель не присвоен, адрес прежде разыменовывает.
Если указатель явным образом не присвоен адрес, он указывает на непредсказуемое местоположение.
Фиксация зависит от первопричины дефекта. Например, вы присвоили адрес указателю, но присвоение недостижимо.
Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Смотрите примеры мер ниже. Это - хорошая практика, чтобы инициализировать указатель на NULL при объявлении указателя.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
#include <stdlib.h>
int* assign_pointer(int* prev)
{
int j = 42;
int* pi;
if (prev == NULL)
{
pi = (int*)malloc(sizeof(int));
if (pi == NULL) return NULL;
}
*pi = j;
/* Defect: Writing to uninitialized pointer */
return pi;
}
Если prev
не является NULL
, указатель, pi
не присвоен адрес. Однако pi
разыменовывается на каждом выполнении пути, независимо от того, является ли prev
NULL
или нет.
Одно возможное исправление должно присвоить адрес pi
, когда prev
не является NULL
.
#include <stdlib.h> int* assign_pointer(int* prev) { int j = 42; int* pi; if (prev == NULL) { pi = (int*)malloc(sizeof(int)); if (pi == NULL) return NULL; } /* Fix: Initialize pi in branches of if statement */ else pi = prev; *pi = j; return pi; }
Указатель на не инициализированное значение, преобразованное в указатель const, происходит, когда указатель на константу (const int*
, const char*
, и т.д.) присвоен адрес, который еще не содержит значение.
Указатель на константу хранит значение, которое не должно быть изменено позже в программе. Если вы присваиваете адрес неинициализированной переменной к указателю, он теперь указывает на адрес со значениями мусора для остатка от программы.
Инициализируйте переменную прежде, чем присвоить ее адрес указателю на константу.
#include<stdio.h>
void Display_Parity()
{
int num,parity;
const int* num_ptr = #
/* Defect: Address &num does not store a value */
printf("Enter a number\n:");
scanf("%d",&num);
parity=((*num_ptr)%2);
if(parity==0)
printf("The number is even.");
else
printf("The number is odd.");
}
num_ptr
объявляется как указатель на константу. Однако переменная num
не содержит значение, когда num_ptr
присвоен адрес &num
.
Одно возможное исправление должно получить значение num
от пользователя, прежде чем &num
будет присвоен num_ptr
.
#include<stdio.h> void Display_Parity() { int num,parity; const int* num_ptr; printf("Enter a number\n:"); scanf("%d",&num); /* Fix: Assign &num to pointer after it receives a value */ num_ptr=# parity=((*num_ptr)%2); if(parity==0) printf("The number is even."); else printf("The number is odd."); }
Оператор scanf
хранит значение в &num
. Если значение хранится, законно присвоить &num
num_ptr
.
Неинициализированная переменная происходит, когда переменная не инициализируется, прежде чем ее значение читается.
Если переменная явным образом не инициализируется, значение переменных непредсказуемо. Вы не можете полагаться на переменную, имеющую определенное значение.
Фиксация зависит от первопричины дефекта. Например, вы присвоили значение переменной, но присвоение недостижимо, или вы присвоили значение переменной в одном из двух ответвлений условного оператора. Зафиксируйте недостижимый код или недостающее присвоение.
Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Смотрите примеры мер ниже. Это - хорошая практика, чтобы инициализировать переменную в объявлении.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
int get_sensor_value(void)
{
extern int getsensor(void);
int command;
int val;
command = getsensor();
if (command == 2)
{
val = getsensor();
}
return val;
/* Defect: val does not have a value if command is not 2 */
}
Если command
не 2, переменная val
является неприсвоенной. В этом случае возвращаемое значение функционального get_sensor_value
является неопределенным.
Одно возможное исправление должно инициализировать val
во время объявления так, чтобы инициализация не была обойдена на некоторых путях к выполнению.
int get_sensor_value(void) { extern int getsensor(void); int command; /* Fix: Initialize val */ int val=0; command = getsensor(); if (command == 2) { val = getsensor(); } return val; }
val
присвоен начальное значение 0. Когда command
не равен 2, функциональный get_sensor_value
возвращает это значение.
Разрешимость: неразрешимый |
[1] Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.