Как SPIM обрабатывает неправильные типы при чтении из консоли?

Я создаю симулятор MIPS и наткнулся на точку, которая, как мне кажется, имеет несколько решений. SPIM имитирует чтение из консоли с помощью операций системного вызова. Раньше я использовал SPIM, но в настоящее время не имею к нему доступа. Как он справляется с некорректными типами при чтении из консоли? Например, если вы выполняете системный вызов для read_int и вводите «asdf», а затем нажимаете клавишу ввода, что произойдет? Что должно произойти? Ссылки SPIM предполагают, что он считывает целое число из строки и игнорирует все после целого числа, что является просто совпадением регулярного выражения для первой последовательности цифр. Что произойдет, если сначала будут нецифровые числа, затем цифры, а затем еще больше нецифр? А если вообще без цифр?

Я не хочу воссоздавать SPIM и решил, что получу рекомендации от сообщества о том, как они хотели бы, чтобы симулятор MIPS работал при неправильном типе ввода.

Некоторые возможные входные данные для размышления:
1234 (правильно)
a1234 (что это должно делать?)
a1234b (что это должно делать?)
ab (что это должно делать? )
(что должно делать простое нажатие Enter?)

Спасибо!


person Unilat    schedule 29.05.2014    source источник


Ответы (1)


Чтобы ответить на этот вопрос, я проверил spim исходный код. Он был не таким большим, поэтому было довольно легко найти системный вызов. .c, в котором говорится, что READ_INT_SYSCALL реализовано с использованием atol.

Документацию по atol можно найти в Интернете или в руководстве по вашей системе, но для полноты:

Описание

Функция atoi() преобразует начальную часть строки, на которую указывает nptr, в int. Поведение такое же, как

strtol(nptr, NULL, 10); за исключением того, что atoi() не обнаруживает ошибок.

Функции atol() и atoll() ведут себя так же, как atoi(), за исключением того, что они преобразуют начальную часть строки в возвращаемый тип long или long long. atoq() — устаревшее название для atoll().

Возвращаемое значение

Преобразованное значение.

Я понимаю, что на самом деле это не отвечает на ваш вопрос, потому что оказывается, что поведение atoi более или менее неопределенно. Вы можете ознакомиться со стандартом POSIX здесь, где говорится, что "Если значение не может быть представлено, поведение не определено" или см. это ТАК ответьте.

person Konrad Lindenbach    schedule 29.05.2014