Возможно, это не совсем тот ответ, который вы искали, но довольно много лет назад я работал над проектом, где части системы были написаны на более высоком уровне языка, где было легко создавать государственные машины в процессах. Этот язык создал C-код, который затем был скомпилирован. Компилятор, который мы использовали для этого проекта, был gcc (версия около 2.95 - не цитируйте меня на этом, но до версии 3.0 наверняка). Мы столкнулись с несколькими ошибками генерации кода, но это из-за моей памяти больше связано с использованием не очень популярного процессора [выявление того, какой процессор может выявить что-то, что я не должен был делать с проектом, поэтому я предпочел бы не сказать, что это было, даже если это было очень давно].
Коллега, близкая мне, изучала одну из таких ошибок генерации кода, которая находилась в функции около 200 тыс. Строк, причем вся функция представляет собой большой оператор switch-statement, причем каждый случай в заявлении коммутатора составляет около 50-1000 каждый из них (с несколькими слоями подзаголовков в нем).
Из-за моей памяти, код был сбой, поскольку он вызвал недопустимую операцию или сохранил что-то в регистре, уже занятом для чего-то другого, поэтому, как только вы нажмете нужный бит кода, он будет терпеть неудачу из-за незаконной памяти доступ - и это не имело никакого отношения к длинному размеру кода, потому что мой коллега в конце концов смог его довести до 30 строк кода (после того, как многие из них «разрезают это и видят, все ли пошло не так») , и через несколько дней у нас появилась новая версия компилятора с исправлением. Приятно знать, что ваши многотысячные доллары для оплаты контракта на компилятор стоит иметь по крайней мере иногда ...
Мое замечание состоит в том, что современные компиляторы допускают много большого кода. Существуют также минимальные ограничения, которые «совместимый компилятор должен поддерживать как минимум». Например, я верю (из памяти еще раз), что компилятор должен поддерживать 127 уровней вложенных операторов (т. Е. Комбинацию из 127, если, переключатель, while и do-while) внутри функции. И из обсуждения где-то (откуда и происходит «компилятор должен поддерживать 127 уровней вложенных операторов»), мы обнаружили, что MSVC и GCC поддерживают намного больше (достаточно, чтобы мы отказались от поиска ...)
Или просто использовать LLVM. Или, если вы мазохист (как я), напишите простой парсер, который генерирует C, когда он ходит по (возможно, неявному) дереву разбора. – 2013-05-08 19:05:17
Не знаете, что вы намерены использовать с «краевыми случаями», но списки известных ошибок обычно легко доступны, если вы их ищете (например, http://gcc.gnu.org/bugzilla/query.cgi) – Svalorzen
LLVM - это возможность. Он теряет некоторые из больших преимуществ C (например, легкость отладки вывода глазным яблоком), сохраняя при этом других (например, существующий репертуар низкоуровневых оптимизаций). В любом случае возникает один и тот же вопрос: есть ли способ заранее узнать, какие ошибки вы могли бы отключить с кодом LLVM, в отличие от всего, что было бы от рукописного C? – rwallace