Invalid use of standard library routine

Стандартная библиотечная функция вызвана недействительными аргументами

Описание

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

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

Примеры

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

#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);, Polyspace рассматривает тот myVal содержит значения меньше чем 1,0.

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

Чтобы узнать больше о спецификациях этой проверки на стандартные программы с плавающей точкой, смотрите Недопустимое Использование Стандартных Стандартных программ Плавающей точки Библиотеки.

#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 функция. Поэтому Invalid use of standard library routine проверяет вызов 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. Invalid use of standard library routine проверяет вызов 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