System operacyjny: Debian 9

Kompilator: gcc 8.2.0 (zainstalowany z repozytorium buster (testowego))

Wiem, że używanie rzeczy z gałęzi testowej Debiana jest niebezpieczne, ale testowanie Debiana jest zazwyczaj stabilne, a gcc 8.2 zostało wydane jako stabilne, więc nie powinno zawierać wielu błędów.

W tej funkcji:

int user_tui        (const char *title, const char *subtitle)
{
    int action;
//  action  = USER_IFACE_ACT_FOO;

    show_help();
    user_tui_show_log(title, subtitle);
    action  = usr_input();

    return  action;
}

Zgłasza następujący błąd (-Wall -Werror, a także -O3 -march=native):

/.../modules//user//src//user_tui.c: In function ‘user_tui’:
/.../modules//user//src//user_tui.c:91:9: error: ‘action’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  return action;
         ^~~~~~
cc1: all warnings being treated as errors

Kiedy odkomentuję inicjalizację, błąd nadal występuje. Myślę, że nie powinno to być nawet potrzebne, ponieważ nie ma żadnego warunkowego ani niczego, co mogłoby zablokować przypisanie action = usr_input();.

Czy to fałszywe ostrzeżenie, czy jest to uzasadnione?

Powiedziałbym, że to błąd w gcc; nie można tego nawet uznać za fałszywe.

1
alx 22 listopad 2018, 16:36

1 odpowiedź

Najlepsza odpowiedź

Dziękuję @MaximEgorushkin za informację, że powinienem zajrzeć do środka usr_input().

Błąd znajduje się w usr_input(), a nie w user_tui().

Ma bardzo długi przełącznik z wieloma przełącznikami w środku, a w jednym z nich zapomniałem wpisu default:.

A więc lekcja: zajrzyj rekursywnie do funkcji, aby zobaczyć, czy są naprawdę zainicjalizowane.

Myślę, że gcc powinno nas o tym poinformować!

1
alx 22 listopad 2018, 17:01