Resolver o Controlo Atinge o Fim do Erro da Função Não-Voidiana em C++

Jinku Hu 12 outubro 2023
  1. Utilizar a declaração return no fim do corpo da função
  2. Utilize as declarações de return no fim de cada caminho de código do corpo da função
Resolver o Controlo Atinge o Fim do Erro da Função Não-Voidiana em C++

Este artigo irá explicar vários métodos de resolução de controlo que chegam ao fim do erro de função não ovóide C++.

Utilizar a declaração return no fim do corpo da função

As funções não ovóides são necessárias para ter um tipo de retorno. Consequentemente, a função precisa de ter uma declaração que devolva o objecto do tipo correspondente. Se determinadas bandeiras do compilador forem passadas, este tipo de erro ou aviso pode ser totalmente suprimido, o que levará a falhas de tempo de execução se a função em questão for chamada no programa.

O seguinte código de exemplo tem a função reverseString definida, que toma uma referência a uma string e retorna o valor da string. Se olharmos para um corpo de função, não há declaração de return. Embora o reverseString não passe quaisquer argumentos para a função chamadora, o compilador apenas exibe a mensagem de aviso, e o programa executável é construído de qualquer forma. Se a função for chamada, então o fluxo de controlo muito provavelmente conduziria a uma falha de segmentação.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

Utilize as declarações de return no fim de cada caminho de código do corpo da função

Outro cenário em que o controlo chega ao fim de uma função não ovóide é quando os blocos condicionais não têm as declarações de return em todos os caminhos. Assim, se a execução na função não ovóide for ramificada e as declarações if não cobrirem todos os caminhos possíveis, então é necessário que haja uma chamada explícita de return no fim do corpo da função.

O exemplo seguinte demonstra a função de manipulação de string com dois caminhos condicionais que passam o valor de retorno para a função de chamada. No entanto, alguns casos não são avaliados para a condição dada, o que implica que o fluxo de controlo pode chegar ao fim do bloco de função e causar erros de tempo de execução.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s, int condition) {
  if (condition == -1) {
    string rev(s.rbegin(), s.rend());
    return s;
  } else if (condition == 0) {
    return s;
  }
}

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

É possível que se veja o aviso abaixo.

Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Function