Мне нужна помощь в моем коде, это дает мне контроль ошибок может достигнуть конца не пустую функцию - PullRequest
0 голосов
/ 16 марта 2019

Я застрял в pset2 на cs50, и, честно говоря, я думаю, что мне чего-то не хватает, я не знаю, смогу ли я продвинуться в курсе, не будучи в состоянии по-настоящему понять некоторые основы. Я пытаюсь сделать это, и затем я думаю, что я сделаю паузу и все еще изучу некоторые основы о c. Мне нужна помощь с этим, а также больше комментариев, за которые я был бы очень признателен.

так в основном вот мой код

#define _XOPEN_SOURCE
#include <cs50.h>
#include <stdio.h>
#include <crypt.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

bool crack(string given_hash);


int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage ./crack hash\n");
        return 1;
    }

    if (!crack(argv[1]))
         return 1;
 }

bool crack(string given_hash)
{    
    string Alphabet = "abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char key[6];
    char salt[3];
    salt[2] = '\0';

    for (int x = 0; x < 2; x++)
    {
        salt[x] = given_hash[x];
    }

    // single-letter keys.
    for (int i = 0; i < 52; i++)
    {
        key[0] = Alphabet[i], key[1] = '\0';
        string new_hash = crypt(key,salt);
        if (strcmp(new_hash, given_hash) == 0)
        {
            printf("you got the key: %s\n",key);
            return 0;
        }
    }

    // for 2-letter keys.
    for (int i = 0; i < 52; i++)
    {
        key[0] = Alphabet[i], key[2] = '\0';
        for (int j = 0; j < 52; j++)
        {
            key[1] = Alphabet[j]; 
        }
        string new_hash = crypt(key,salt);
        if (strcmp(new_hash, given_hash) == 0)
        {
            printf("you got the key: %s\n",key);
            return 0;
        }
    }

    // for 3-letter keys.
    for (int i = 0; i < 52; i++)
    {
        key[0] = Alphabet[i], key[3] = '\0';
        for (int j = 0; j < 52; j++)
        {
            key[1] = Alphabet[j];
            for (int k = 0; k < 52; k++)
            {
                key[2] = Alphabet[k];
            }
        }
        string new_hash = crypt(key,salt);
        if (strcmp(new_hash, given_hash) == 0)
        {
            printf("you got the key: %s\n",key);
            return 0;
        }
    }

    // for 4-letter keys.
    for (int i = 0; i < 52; i++)
    {
        key[0] = Alphabet[i], key[4] = '\0';
        for (int j = 0; j < 52; j++)
        {
            key[1] = Alphabet[j];
            for (int k = 0; k < 52; k++)
            {
                key[2] = Alphabet[k];
                for( int l = 0; l < 52; l++)
                {
                    key[3] = Alphabet[l];
                }
            }
        }
        string new_hash = crypt(key,salt);
        if (strcmp(new_hash, given_hash) == 0)
        {
            printf("you got the key: %s\n",key);
            return 0;
        }
    }

    // for 5-letter keys.
    for (int i = 0; i < 52; i++)
    {
        key[0] = Alphabet[i], key[5] = '\0';
        for (int j = 0; j < 52; j++)
        {
            key[1] = Alphabet[j];
            for (int k = 0; k < 52; k++)
            {
                key[2] = Alphabet[k];
                for(int l = 0; l < 52; l++)
                {
                    key[3] = Alphabet[l];
                    for(int m = 0; m < 52; m++)
                {
                    key[4] = Alphabet[m];
                }
            }
        }
    }
    string new_hash = crypt(key,salt);
    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
  }
}

теперь я не знаю, что я делаю неправильно, я знаю, что эта ошибка связана с тем, что в функции, не являющейся пустотой, нет возврата, но как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы получаете контроль ошибок, который может достигнуть конца не-void функции, поскольку предполагается, что функция crack() возвращает bool, а в конце функции crack() нет оператора return. При компиляции кода компилятор обнаружил, что все операторы возврата функции crack() могут быть достигнуты только , если выполняется какое-либо условие

bool crack(string given_hash)

{    

    ....
    ....

    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
    ....
    ....

    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
    ....
    ....

    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
    ....
    ....

    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
    ....
    ....

    if (strcmp(new_hash, given_hash) == 0)
    {
        printf("you got the key: %s\n",key);
        return 0;
    }
}
      //<================ Return statement missing

}

и существует вероятность того, что управление может дойти до конца функции, если не выполняется ни одно из условий. Вы должны добавить оператор return в конец функции crack() и вернуть значение, указывающее на ошибку. Поскольку во всех случаях вы возвращаете 0 (кажется, это для успеха), вы можете вернуть 1 в конце, чтобы указать на ошибку:

    ....
    ....
    return 1;

}

Обратите внимание, что есть исключение для функции main(), если управление достигает конца функции main(), не встретив оператора возврата, return 0; выполняется.

1 голос
/ 16 марта 2019

Обе функции main и crack имеют путь кода, который, возможно, достигнет конца функции и не вернет значение.

main - Если крэк вернет 1 или true, тогда код достигнет конца main без возврата значения int. Однако для main есть исключение, которое, если вы явно не вернетесь, будет return 0. Поэтому, хотя это не проблема, я бы по-прежнему следил за возвращением всех путей кода.

crack - Если ни один из ваших тестов не найдет совпадающий хэш пароля, то функция достигнет конца и не вернется. Основываясь на логике функции, это никогда не произойдет, но компилятор этого не знает.

Чтобы решить эту проблему, необходимо убедиться, что все пути кода возвращают значение.

...