Ошибки компилятора Native XDS-x86 Modula-2/Oberon-2

Компилятор XDS хороший, но он ошибается. Иногда просто не может что-то переварить, а иногда и создаёт программу, не соответствующую исходнику. С первым можно как-то мириться, ведь ошибка видна уже в процессе компиляции, и можно попытаться написать по-другому. А во втором случае приходится проявлять особую осторожность: из-за нестабильной природы ошибок здесь не всегда поможет даже тестирование.

За время работы с XDS (с 2007 по 2012 год) я повстречал несколько ошибок. Для всех из них я смог создать проекты минимального размера - такие, чтобы присутствие именно этой конкретной ошибки стало очевидно и надёжно воспроизводилось. Этот набор тестов я и предлагаю вашему вниманию. С помощью этого набора я оцениваю прогресс когда выходит очередная версия XDS. Правда, понятно, что такой метод оценивания не учитывает привнесённые ошибки новых версий, которые ещё только предстоит найти. Да и невозможность воспроизвести ошибку иной раз может не означать, что ошибка исправлена. Может быть, она просто надёжнее спряталась. К сожалению, разработчики XDS не радуют подробной отчётностью о проделанной работе, поэтому и приходится изобретать свои способы оценки.

Кроме того, учёт найденных сбоев просто позволяет следовать принципу "знай свой инструмент", и учит избегать тех или иных "опасных" (в смысле ненадёжности) конструкций, опций и т. п.

Все сбои воспроизводятся в свежеустановленном XDS. Если требуются какие-либо дополнительные опции, то они включены в исходный текст модулей в виде директив компилятора <*…*>. Консольная выдача записана с помощью последней версии XDS, в которой удалось воспроизвести проблему. Если в какой-то версии ошибка не проявляется, об этом указано в комментариях.

Содержание

  1. Выводы
  2. Ошибки компиляции
  3. Ошибки кодогенерации

1. Выводы

В самом деле, почему бы не начать сразу с выводов? Как видно из последующих примеров, директиву PROCINLINE лучше отключить и не включать. Заинлайненые процедуры не дружат с локальными указателями, будь то простые переменные или поля RECORD'ов. Встречаются и более серьёзные проблемы, пропадающие при отключении директивы PROCINLINE.

Все эти найденные ошибки - это не повод сказать "плохой компилятор". Наоборот, компилятор весьма неплох. Просто иной раз вылетает исключение "invalid location" на пустом месте, и не знаешь, что с этим делать и как исправлять. А когда ошибка локализована, и найдена конкретная причина, то появляется определённость. И тогда понимаешь: отдельные мелкие недоработки есть, но их мало, а в остальном-то всё прекрасно работает!

2. Ошибки компиляции

3. Ошибки кодогенерации

Автор

Нашёл ошибки, создал минимальные проекты для их воспроизведения и разместил в данном документе: Александр Ильин. Если вы знаете о каких-то ошибках, не указанных здесь, пожалуйста, пишите, присылайте проекты для воспроизведения. Если не можете создать маленький модуль, то присылайте большой проект, разберёмся!

Сайт создан в системе uCoz