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 условие true. Для примера выполните следующие 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 создает красную ошибку.

Для других примеров смотрите Допущения о мемсете и мемсете.

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

Одна из возможных коррекций состоит в том, чтобы настроить размер 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