Удаление указателя за пределами домена
Удаление указателя за пределами домена.[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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.