Является ли эта программа нуль-безопасной? - PullRequest
0 голосов
/ 14 января 2019

Это программа для печати простых чисел между двумя числами а и б (нулевой сейф или нет)?

если нет, как добавить нулевую безопасную функцию, чтобы сделать это (NULL SAFE)

Я попытался проверить, равны ли argv [1] или argv [2] 0 но это не так, как это должно работать

есть идеи для этого?

//check if a or b or both are negative numbers
int check_negative(int *x, int *y){

    if(*x<0 || *y<0)
    {
        printf("Error : One or Both arguments are Negative\n");
        return 1;
    }
}

//check if n is a prime number
int isprime(int n)
{
    int i, status = 1;

    for(i=2; i <= n/2; ++i)
    {
        if (n%i == 0)
        {
            status = 0;
            break;
        }
    }
    return status;
}

int main(int argc, char* argv[] )
{

    if(argc==1)
    {
        printf("Error : No arguments were passed\n");
        return 0 ;
    }

    int a=atoi(argv[1]),b=atoi(argv[2]),n,status;

    if(check_negative(&a,&b)==1)
    {
        return 0;
    }

    printf("Prime numbers between %d and %d are: \n", a, b);

    for(n=a+1; n<b; ++n)
    {
       status = isprime(n);

       if(status == 1)
           printf("%d  ",n);
    }
    return 0;
}

1 Ответ

0 голосов
/ 14 января 2019

Является ли эта программа нуль-безопасной?

номер


Сбой ниже, когда argc < 3 (например, 2,1,0), когда он вызывает atoi() с NULL или неизвестно. @ Ian Abbott

int a=atoi(argv[1]),b=atoi(argv[2]),n,status;

Вместо этого измените предыдущий тест только с 1 на следующий. Обратите внимание, что argc == 0 возможно на некоторых платформах и при определенных вызовах функций.

// if(argc==1)
if(argc < 3)

Как автономная функция, check_negative() не проверяет, передан ли аргумент null указатель перед разыменованием. Добавить чеки

int check_negative(int *x, int *y){
  if (x == NULL || y == NULL) return 0;  /// or handle in some way

В сторону:

isprime(Any_int_less_than_2) ошибочно возвращается 1.

for(i=2; i <= n/2; ++i) очень медленно для больших n. Предложить ускорение for(i=2; i <= n/i; ++i). Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...