Блин, Хабр! Я полчаса писал комментарий на комментарий, перепроверяя каждое слово гуглежом. Нажимаю отправить — позавчерашняя статья убрана в черновики! Фу так делать!
Пишу здесь комментарий ни к селу ни к городу ни о чём.
‑--‑--‑--‑--
Современные embedded языки имеют такие правила типизации, которые позволяют в тестах перебрать все возможные варианты значений или хотя бы категории вариантов (типа как для int: -1,1,0,min_int, max_int).
В Си и других языках той эпохи в любой аргумент (указатель) любой функции может прилететь nullptr, но в большинстве функций это никак не обрабатывается, потому что программист решил, что до сюда nullptr никак не долетит. Но по правилам языка может. Из‑за этого невозможно проверить покрытие тестами всех вариантов,потому что все возможные варианты даже по задумке работать не должны.
Си это не про надёжно. Си это про быстро летает и авось не упадёт.
С++11 пришёл и сел в ту же кучу, сделав допустимым shared_ptr<MyClass> sptr(nullptr);
Его, конечно, можно запретить в своём проекте, но там ещё много чего учесть придётся, в итоге модерновый С++ тоже не тестируемый язык.
Почему я докапываюсь именно до Си? Потому что бортовое ПО всех трёх самолётов, где погибли люди из‑за ошибки в ПО было написано на Си и Ada. В том числе в 2018 году. Потому что всегда ж на них писали.
Есть языки типа Coq, тестируемые полностью. Есть языки типа Rust, тестируемые желудочно достаточно. Но авиация выбрала языки, где три иконки на панели компилятора лишними не будут.