Удаление указателя за пределами домена
Удаление указателя за пределами домена.[1]
Эта проверка проверяет на наличие следующих проблем:
Небезопасная арифметика указателя.
Недопустимое использование стандартной стандартной программы памяти библиотеки.
Пустой указатель.
Арифметическая операция с указателем NULL.
Недопустимое использование стандартной стандартной программы строк библиотек.
Проблема возникает, когда указатель, полученный из арифметики на операнде указателя, не обращается к элементу того же массива, что и этот операнд указателя.
Polyspace® помечает это правило во время анализа как:
Bug Finder - Array
access out-of-bounds
и Pointer
access out-of-bounds
Code Prover - и
Bug Finder и Code Prover проверяют это правило по-разному и могут показывать различные результаты для этого правила. В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции Verification level (-to)
(Polyspace Code Prover). Смотрите раздел «Проверка на нарушения стандартов кодирования».
Использование недопустимого индекса массива может привести к ошибочному поведению программы. Производные от выполнения индексы массива особенно проблематичны, потому что их невозможно легко проверить путем ручного обзора или статического анализа.
Стандарт C определяет создание указателя на указатель за пределами массива. Правило разрешает использование стандарта C. Удаление указателя на указатель за пределами конца массива вызывает неопределенное поведение и является несовместимым.
Недопустимое использование стандартной стандартной программы памяти библиотеки происходит при вызове функции библиотеки памяти с недопустимыми аргументами. Для образца, memcpy
копирование функции в массив, который не может включать количество скопированных байтов.
Использование функции библиотеки памяти с недопустимыми аргументами может привести к таким проблемам, как переполнение буфера.
Исправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.
См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
#include <string.h>
#include <stdio.h>
char* Copy_First_Six_Letters(void)
{
char str1[10],str2[5];
printf("Enter string:\n");
scanf("%s",str1);
memcpy(str2,str1,6);
/* Defect: Arguments of memcpy invalid: str2 has size < 6 */
return str2;
}
Размер строкового str2
5, но шесть символов строки str1
копируются в str2
использование memcpy
функция.
Одна из возможных коррекций состоит в том, чтобы настроить размер str2
так, чтобы в нем размещались символы, скопированные со memcpy
функция.
#include <string.h> #include <stdio.h> char* Copy_First_Six_Letters(void) { /* Fix: Declare str2 with size 6 */ char str1[10],str2[6]; printf("Enter string:\n"); scanf("%s",str1); memcpy(str2,str1,6); return str2; }
Нулевой указатель возникает, когда вы используете указатель со значением NULL
как если бы это указывало на допустимое место памяти.
Снятие нуля с указателя является неопределенным поведением. В большинстве реализаций dereference может привести к аварийному завершению работы вашей программы.
Проверьте указатель на NULL
до ссоры.
Если проблема возникает, несмотря на более раннюю проверку на NULL
, искать промежуточные события между проверкой и последующим разыменованием. Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.
См. примеры исправлений ниже.
#include <stdlib.h>
int FindMax(int *arr, int Size)
{
int* p=NULL;
*p=arr[0];
/* Defect: Null pointer dereference */
for(int i=0;i<Size;i++)
{
if(arr[i] > (*p))
*p=arr[i];
}
return *p;
}
Указатель p
инициализируется значением NULL
. Однако, когда значение arr[0]
записывается в *p
, p
принято, что указывает на допустимое место памяти.
Одной из возможных коррекций является инициализация p
с допустимым адресом памяти перед dereference.
#include <stdlib.h> int FindMax(int *arr, int Size) { /* Fix: Assign address to null pointer */ int* p=&arr[0]; for(int i=0;i<Size;i++) { if(arr[i] > (*p)) *p=arr[i]; } return *p; }
Арифметическая операция с NULL-указателем происходит, когда арифметическая операция включает указатель, значение которого NULL
.
Выполнение арифметики указателя на пустом указателе и разыменование результирующего указателя является неопределенным поведением. В большинстве реализаций dereference может привести к аварийному завершению работы вашей программы.
Проверьте указатель на NULL
перед арифметическими операциями над указателем.
Если проблема возникает, несмотря на более раннюю проверку на NULL
, искать промежуточные события между проверкой и последующим разыменованием. Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.
См. примеры исправлений ниже.
#include<stdlib.h>
int Check_Next_Value(int *loc, int val)
{
int *ptr = loc, found = 0;
if (ptr==NULL)
{
ptr++;
/* Defect: NULL pointer shifted */
if (*ptr==val) found=1;
}
return(found);
}
Когда ptr
является NULL
указатель, код вводит if
тело оператора. Поэтому a NULL
указатель сдвигается в операторе ptr++
.
Одной из возможных коррекций является выполнение арифметической операции при ptr
не NULL
.
#include<stdlib.h> int Check_Next_Value(int *loc, int val) { int *ptr = loc, found = 0; /* Fix: Perform operation when ptr is not NULL */ if (ptr!=NULL) { ptr++; if (*ptr==val) found=1; } return(found); }
Недопустимое использование стандартной стандартной программы создания строк в библиотеке происходит при вызове функции библиотеки строк с недопустимыми аргументами.
Риск зависит от типа недопустимых аргументов. Например, использование strcpy
функция с исходным аргументом, большим, чем конечный аргумент, может привести к переполнению буфера.
Исправление зависит от стандартной функции библиотеки, участвующей в дефекте. В некоторых случаях можно ограничить аргументы функции перед вызовом функции. Для образца, если strcpy
функция:
char * strcpy(char * destination, const char* source);
strcpy
. В некоторых случаях можно использовать альтернативную функцию, чтобы избежать ошибки. Для образца вместо strcpy
, можно использовать strncpy
для управления количеством скопированных байтов.См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
#include <string.h>
#include <stdio.h>
char* Copy_String(void)
{
char *res;
char gbuffer[5],text[20]="ABCDEFGHIJKL";
res=strcpy(gbuffer,text);
/* Error: Size of text is less than gbuffer */
return(res);
}
Строка text
больше в размере, чем gbuffer
. Поэтому функция strcpy
невозможно скопировать text
в gbuffer
.
Одной из возможных коррекций является объявление строки назначения gbuffer
с размером, равным или большим, чем исходная строка text
.
#include <string.h> #include <stdio.h> char* Copy_String(void) { char *res; /*Fix: gbuffer has equal or larger size than text */ char gbuffer[20],text[20]="ABCDEFGHIJKL"; res=strcpy(gbuffer,text); return(res); }
Решимость: Undecidable |
[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.