Что-то у нас тут клеветы только на Оберон. Пора бы разбавить. Так что теперь про Си будет (нет. не про С++, хотя к нему частично тоже применимо, особенно если разработчиков давно плетьми не драли и они продолжают писать код в стиле Си).
Собственно сама история описана тут:
http://habrahabr.ru/post/198836/Если кратко - из за того, что в Сях есть две вещи:
1) взятие адреса у локальной переменной (&foo)
2) указателю можно присвоить целое число и ничто нигде не руганется
в коде случайно прошла замена вот такого:
void foo(error* err) {
*err = SUCCESS;
}
void bar() {
error err = SUCCESS;
foo(&err);
}
на такое:
void foo(error* err) {
*err = SUCCESS;
}
void bar() {
error* err = SUCCESS;
foo(err);
}
Ну и собственно всё. Ошибочный код замечательно прошел все тесты (то есть тестирование не спасло, ошибка вылезла только через 30 дней после рокового комитта). Врукопашную найти ошибку не вышло - искали 50 часов, не нашли, только примерно локализовали.
Удалось справиться только посредством сторонней тулзы для статического анализа кода (PVS Studio).
Такой путь появления ошибки в Обероне просто не возможен!
То есть чтобы компенсировать кривость языка Сишникам пришлось написать дико сложную тулзу статической проверки кода - вот она сложность порождающая еще бОльшую сложность на ровном месте (и позволяющая, между прочим, заработать на этих самых тулзах, чем народ и занимается)!
Примечательно также, что та контора по результатам (с помощью тулзы ошибку удалось найти и устранить за час) приобретать эту тулзу для анализа кода... отказалась! Ибо у них за все эти 50 часов поиска ошибки заплатил заказчик, так что с точки зрения бизнеса - всё норм. А тулзу покупать пришлось бы из своего кармана.
Вот такой он, современный мейнстрим в embedded разработке.