Salut à tou·te·s !
Je suis tombé aujourd'hui sur un warning, m'indiquant (à juste titre du point de vue du compilateur) que ma fonction pourrait ne pas faire de return.
Or il se trouve qu'arriver à la fin n'est algorithmiquement pas possible (à moins que mon objet ne soit dans un état corrompu).
J'ai donc voulu indiquer explicitement au compilateur qu'il était dans l'erreur (par ignorance).
Mais après plusieurs idées à base de [[noreturn]], et moult essais d'implémentation d'un éventuel assert_unreachable(), je suis dans l'impasse. Je me fends donc d'un joker, en retournant une valeur au hasard (bon, pas tant au hasard que cela, mais elle n'a aucun sens).
Ma tentative d'implémentation de assert_unreachable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 auto Parser::get_previous_node() -> decltype(m_results)::iterator { if(m_results.empty()) return end(m_results); int back_level = 0; for(auto it = end(m_results) - 1; it != begin(m_results); --it) { back_level += it->first; if(back_level == 0) return it; if(back_level > 0) return end(m_results); } assert("unreachable" == false); return end(m_results); }
Qui m'indique évidemment par un warning que ma fonction assert_unreachable_do_nothing() retourne quand même. Ce qui personnellement ne me dérangerait pas, mais on en revient au problème initial, comment faire comprendre au compilo que l'undefined behaviour est explicitement le but recherché, on tourne donc en rond.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #pragma once #include <cassert> #include <cstdlib> namespace fys { namespace priv { [[noreturn]] inline void assert_unreachable_do_nothing() {} } #define assert_unreachable() \ (assert(("unreachable", true == false)), \ fys::priv::assert_unreachable_do_nothing()) }
Ici il s'agit d'un itérateur, il est donc possible de "tricher", mais en posant la problématique plus largement, je me demande comment gérer ce cas...
Avez-vous déjà rencontré de tels cas ?
Avez-vous des pistes pour implémenter un assert_unreachable ?
Merci !
Partager