предупреждение: (343) неявный возврат в конце не пустой функции - PullRequest
1 голос
/ 27 октября 2019

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

  char *ServerResponds()        
    {
        char copy_wifi_data[EUSART_BUFFER_SIZE];                               
        uint16_t i = 0; int tok_count = 0;            

        static char *token;
        token = strtok(copy_wifi_data, ":");               //Converting wifi data to tokens.

        while(token != NULL)
        {  
            if(tok_count == 1)
            {
                return token;
            }

            token = strtok(NULL,":");  
            tok_count++;
        } 
    }

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Функция не возвращает значение через все возможные пути выполнения.

Несмотря на то, что вы можете получить return NULL или return token после цикла while, можно считать плохой практикой иметь несколько точек возврата. из одной функции - это противоречит многим общепринятым стандартам кодирования и в большинстве случаев опрометчиво.

    //Converting wifi data to tokens.
    static char *token  = strtok(copy_wifi_data, ":");               
    while( tok_count == 0; token != NULL )
    {  
        token = strtok(NULL,":");  
        tok_count++;
    }

    return token ; 

При этом неясно, какова цель цикла while или почему token это static. Это семантически так же, как:

    //Converting wifi data to tokens.
    char *token = strtok(copy_wifi_data, ":");               
    if( token != NULL )
    {  
        token = strtok(NULL,":");  
    }

    return token ; 
1 голос
/ 27 октября 2019

Предупреждение возникает из-за отсутствия оператора возврата в случае, если tok_count == 1 ложно.

char *ServerResponds()        
{
    char copy_wifi_data[EUSART_BUFFER_SIZE];                               
    uint16_t i = 0; int tok_count = 0;            

    static char *token;
    token = strtok(copy_wifi_data, ":");               

    while(token != NULL)
    {  
        if(tok_count == 1)
        {
            return token;
        }

        token = strtok(NULL,":");  
        tok_count++;
    } 
    /* <--- there is no return if control flow reaches this point */

}

Вы можете добавить return 0; в конце функции, чтобы решить эту проблему, но выпришлось бы задокументировать это поведение и быть уверенным, что вызывающие стороны готовы обработать нулевое возвращаемое значение.

...