Historia o C++
#automotive to stan umysłu. Nie pracowałem wcześniej w automotive, szczerze mówiąc nie znam reguł tych autosarów, a do projektu trafiłem dość przypadkiem. Po prostu znam wiele reguł programowania i dobrych praktyk i okazuje się, że nawet daję radę. Automotive miałem za dział w którym naprawdę dba się o jakość kodu, no bo kurde, jednak ktoś kiedyś może umrzeć XD ale co się wydarzyło, czego się nauczyłem:
Robię przegląd kodu na finiszu cyklu wydawniczego (korp. przedreleasowe review). Jest sobie funkcja, jako parametr przyjmuje inta i widzę że ten int jest bezrefleksyjnie, bez żadnego sprawdzania rzutowany na na typ enum class. No i cyk, mamy to, tak się nie robi, z tego co wiem, standard nie opisuje co ma się zadziać gdy enum zawiera wartości 1 i 2, a my chcemy rzutować wartość 3 na ten enum - innymi słowy, używamy wartości spoza zakresu. Z tego co wiem, nazywa się to "undefined behavior" i unika się takich rzeczy, no bo teoretycznie każdy kompilator może dowolnie przetworzyć taką operację i nie ma pewności co z tego wyjdzie.
Poprawiam więc aby było po bożemu, ze sprawdzaniem wartości, odpalam testy i co? Nie przechodzą! Sprawdzam scenariusze testów, a tam na legalu, gość sumuje praktycznie wszystkie wartości tego enuma w zmiennej typu int i woła tą funkcję, co w efekcie jest właśnie jawnym gwałceniem tego, co napisałem xD
Okazuje się, że to nie jedyny przypadek, bo są inne testy, które robą podobną rzecz. Wychodzi na to, że możemy w praktyce pakować do jednej zmiennej co się da, bo każda zmienna enuma to inna flaga, a potem maskujemy ją i patrzymy w tej zmiennej jakie flagi są włączone. No wszystko fajnie, ale enum przecież nie do tego służy xD więc albo scenariusze są wadliwe, albo design. Napisałem więc do autora by spytać, co miał na myśli, a ten na to, że wszystko jest w porządku i tak ma być.
Otóż w automotive jest wzorzec zwany flag enum i dosłownie gwałci się enuma w ten sposób, chociaż moim zdaniem powinno się inaczej rozwiązywać tego typu zagadnienie. Niesamowita sprawa, mózg rozjebany. Poniżej wątek na stackoverflow, który prezentuje takie podejście xD
Jestem teraz ciekaw ile analizatorów kodu rozumie taką konstrukcję i ją przepuszcza. Ale też podejrzewam, że ten "undefined behavior" w takim razie jest martwy, bo co najmniej IAR czy inne kompilatory automotive, jasno wiedzą co z tym zrobić. Dlaczego więc GCC czy Clang miałby nie wiedzieć?
https://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c
#cpp #c #programowanie #programista15k
