Отсутствие регистра по умолчанию в команде switch - может ли это быть ошибкой во время выполнения? - PullRequest
1 голос
/ 25 марта 2020

У меня есть аргумент с моим лектором курса компиляции:

В тесте, который был частью этого курса, некоторые вопросы касались сегментов кода идентификации и классификации, написанных в C. Каждый из этих вопросов должен указывать, на какой стадии будет раскрываться ошибка:

a. Лексический анализ

b. Syntheti c анализ

c. Семанти c анализ

д. Время работы (при определенных условиях)

e. Это не ошибка.

Один из вопросов в этом стиле был следующим:

Команда переключения, в которой нет компонента по умолчанию. Например:

switch (key){
case 1: .........
case 2: ......... 
case 3:.......... 
}

Теперь, в официальном тестовом решении, в вышеприведенном случае верным был только параметр e . Тем не менее, я утверждаю, что вариант d не обязательно может быть отклонен сразу, и что это также верно. В качестве аргумента я показал (после теста) двум преподавателям следующие два примера:

1) enter image description here

(от: https://cwe.mitre.org/data/definitions/478.html)

2) enter image description here

(от: Должны ли операторы switch всегда содержать предложение по умолчанию? )

Однако он еще не убежден, что в этом случае рассматривается вариант ошибки времени выполнения. Он сказал, что из-за вопросов, упомянутых выше, это только для команд или фрагментов, которые показаны непосредственно в вопросах, и потому что код не имеет намерения кода, поэтому в этом случае они фактически спрашивают, является ли эта структура сама по себе недействительна, поэтому вам здесь отказано в ошибке времени выполнения (лично я не вижу здесь никакого противоречия ...).

Я был бы рад, если бы вы поделились своим мнением по этому вопросу.

1 Ответ

2 голосов
/ 25 марта 2020

Ваш лектор правильный.

Отсутствие регистра по умолчанию в коммутаторе является абсолютно допустимым кодом и напрямую не приведет к возникновению каких-либо проблем. Вполне может быть, именно то, что задумал программист, и делать правильные вещи.

Конечно, всегда можно добавить некоторый код, который вызовет проблемы, но это проблема с этим добавленным кодом, а не с самим коммутатором. Правила стиля кода, такие как «всегда добавлять регистр по умолчанию», могут защищать от определенных типов ошибок в программировании, но их несоблюдение не приводит к автоматическому возникновению этих ошибок - «просто» требует большей осторожности.

С точки зрения стиля кода обычно лучше явно указать намеренное игнорирование определенных случаев или добавить некоторый обработчик по умолчанию для защиты от неожиданных значений, но это не означает, что пропуск такого обработчика всегда некорректен сам по себе.

(Обратите внимание, что второй по популярности ответ на вопрос в вопросе, который вы связали с собой, приводит аргумент за исключение случаев по умолчанию, которые не приносят ничего полезного, с целью уменьшения беспорядка - I не полностью согласен с этим, но это вопрос стиля)

...