exponenta event banner

Недопустимое использование стандартной библиотечной подпрограммы

Функция стандартной библиотеки вызывается с недопустимыми аргументами

Описание

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

Проверка работает по-разному для подпрограмм памяти, подпрограмм с плавающей запятой или строковых подпрограмм, поскольку их аргументы могут быть недопустимыми по-разному. Дополнительные сведения о каждом типе процедур см. в следующих примерах.

Примеры

развернуть все

#include <assert.h>
#include <math.h>

#define LARGE_EXP 710

enum operation {
    ASIN,
    ACOS,
    TAN,
    SQRT,
    LOG,
    EXP,
};

enum operation getOperation(void);
double getVal(void);

void main() {
    enum operation myOperation = getOperation();
    double myVal=getVal(), res;
    switch(myOperation) {
    case ASIN:
        assert( myVal <- 1.0 || myVal > 1.0);
        res = asin(myVal);
        break;
    case ACOS:
        assert( myVal < -1.0 || myVal > 1.0);
        res = acos(myVal);
        break;
    case SQRT:
        assert( myVal < 0.0);
        res = sqrt(myVal);
        break;
    case LOG:
        assert(myVal <= 0.0);
        res = log(myVal);
        break;
    case EXP:
        assert(myVal > LARGE_EXP);
        res = exp(myVal);
        break;
    }
}

В этом примере, следуя каждому assert заявление, Polyspace ® считает, чтоmyVal содержит только те значения, которые делают assert условие истинно. Например, после assert(myVal < 1.0);, Полиспейс считает, что myVal содержит значения менее 1,0.

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

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

#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);
  return str2;
}

int main(void) {
  (void*)Copy_First_Six_Letters();
  return 0;
}

В этом примере размер строки str2 5, но 6 символов строки str1 копируются в str2 с использованием memcpy функция. Следовательно, проверка недопустимости использования стандартной библиотеки при вызове memcpy приводит к появлению красной ошибки.

Другие примеры см. в разделе Допущения относительно memset и memcpy.

Исправление - вызов функции с допустимыми аргументами

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

#include <string.h>
#include <stdio.h>

char* Copy_First_Six_Letters(void) {
  char str1[10],str2[6];
  printf("Enter string:\n");
  scanf("%s",str1);
  memcpy(str2,str1,6);
  return str2;
}

int main(void) {
  (void*)Copy_First_Six_Letters();
  return 0;
}
#include <stdio.h>
#include <string.h>

char* Copy_String(void)
{
  char *res;
  char gbuffer[5],text[20]="ABCDEFGHIJKL";
  res=strcpy(gbuffer,text);
  return(res);
}

int main(void) {
  (void*)Copy_String();
}

В этом примере строка text больше по размеру, чем gbuffer. Поэтому при копировании text в gbuffer. Недопустимое использование стандартной проверки подпрограммы библиотеки при вызове strcpy приводит к появлению красной ошибки.

Исправление - вызов функции с допустимыми аргументами

Одной из возможных корректировок является объявление строки назначения gbuffer с размером, равным или большим, чем исходная строка text.

#include <stdio.h>
#include <string.h>

char* Copy_String(void)
{
  char *res;
  char gbuffer[20],text[20]="ABCDEFGHIJKL";
  res=strcpy(gbuffer,text);
  return(res);
}

int main(void) {
  (void*)Copy_String();
}

Проверить информацию

Группа: Другое
Язык: C | C++
Акроним: STD_LIB