Недостижимый код: ошибка или предупреждение?

Это - вопрос о дизайне языка:

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

Лично я сильно чувствую, что это должна быть ошибка: если программист пишет часть кода, это должно всегда быть с намерением фактического выполнения его в некотором сценарии. Но компилятор C#, например, кажется, не соглашается с этим и просто сообщает о предупреждении.

Примечание: Я понимаю, что хорошее обнаружение мертвого кода является очень трудной проблемой, но это не фокус этого вопроса.

Вот некоторые примеры частей кода, где некоторые операторы явно недостижимы:

return;
foo();

--

throw new Exception();
foo();

--

if (...) {
  return;
} else {
  throw new Exception();
}
foo();
21
задан Ciro Santilli 新疆改造中心法轮功六四事件 16 March 2015 в 10:07
поделиться

10 ответов

Вообще говоря, это должно быть ошибкой.

Однако мне приходит в голову одно исключение:

if (false) {
  doStuffThatITemporarilyDisabled();
}

Некоторые разработчики могут пожаловаться, если ваш компилятор откажется от компиляции для подобного кода.

13
ответ дан 29 November 2019 в 06:09
поделиться

Ошибка означает, что компилятор физически не может обработать ваш код.

Предупреждение означает, что компилятор может работать с вашим кодом, но считает, что то, что вы написали, в некотором роде неверно.

Мне это кажется довольно ясным - это должно быть предупреждением.

Кроме того, как насчет случая, когда я решил сократить метод для целей отладки:

public bool ShowMenu()
{
    return true;
    /* The standard implementation goes here */
}

Я знаю, что это неправильно, но для компилятора попросить меня также прокомментировать этот код было бы просто болью.

31
ответ дан 29 November 2019 в 06:09
поделиться

& std:: последовательность («тест»); запрашивает адрес возвращаемого значения вызова функции (мы проигнорируем как не имеющий значения тот факт, что эта функция является ктором). У него не было адреса, пока вы не назначили его чему-то. Следовательно, это ошибка.

-121--1531937-

Что вы ожидаете? Домашняя страница Tomcat по умолчанию? Если это так, вам нужно настроить Eclipse, чтобы взять контроль над Tomcat.

Дважды щелкните по записи сервера Tomcat на вкладке Серверы . Появится конфигурация сервера. В левом столбце в поле Server Locations (Расположение сервера) выберите Use Tomcat installation (обратите внимание на то, что если он выделен серым цветом, прочитайте начальный текст раздела!;)). Таким образом, Eclipse возьмет на себя полный контроль над Tomcat, таким образом вы также сможете получить доступ к домашней странице Tomcat по умолчанию с менеджером Tomcat при запуске изнутри Eclipse. Я не понимаю, насколько это полезно при разработке с помощью Eclipse.

enter image description here

Номер порта не является проблемой. В противном случае вы бы получили исключение в журнале запуска Tomcat, и браузер будет показывать страницу ошибки «Подключение истекло» для конкретного браузера и, таким образом, не страницу ошибки Tomcat, которую невозможно обслужить, когда Tomcat не работает.

-121--904017-

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

25
ответ дан 29 November 2019 в 06:09
поделиться

Если у вас языковая спецификация:

  • Учитывает мертвый код становится ошибкой
  • Не поддерживает предварительную обработку "на уровне текста" в стиле C
  • Отсутствуют комментарии в блочном стиле, которые могут быть вложены в комментарии в стиле строки

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

4
ответ дан 29 November 2019 в 06:09
поделиться

Я думаю, это должно быть предупреждение по той же причине, что и сказал Роальт. Хороший компилятор также должен исключить этот код из компиляции.

2
ответ дан 29 November 2019 в 06:09
поделиться

http://msdn.microsoft.com/en-us/library/ms763742%28VS.85%29.aspx

Поиск по MSDN: http://social.msdn.microsoft.com/Search/en-US?query=msxml .

-121--4746182-

Кортежи можно использовать в качестве ключей словаря, поскольку они незыблемы, но нельзя использовать списки. Например:

d = {(1, 2): 'a', (3, 8, 1): 'b'}  # Valid.
d = {[1, 2]: 'a', [3, 8, 1]: 'b'}  # Error.
-121--3464956-

Я думаю, что это должно быть предупреждение.

В целом, общим правилом является то, что «вы должны рассматривать предупреждения как ошибки» . Если я непреднамеренно напишу недостижимый код, я увижу его в предупреждениях и исправлю в любом случае.

Однако иногда, как говорит Нил, вы намеренно создаете мертвый код, в целях отладки или по какой-либо причине. Я бы очень, очень ненавидел, если бы составитель не позволил мне это сделать.

8
ответ дан 29 November 2019 в 06:09
поделиться

Думаю, предупреждение уместно. Затем пользователь может решить использовать ваш ДРУГОЙ переключатель, который говорит «обрабатывать все предупреждения как ошибки», когда он выполняет сборку Release. Воодушевить разработчика всегда лучше, чем навязывать ему свой по сути случайный выбор.

8
ответ дан 29 November 2019 в 06:09
поделиться

Я бы предпочел, чтобы (доказуемо) недоступный код выдавал либо предупреждение, либо уведомление (например, предупреждение, только без отрицательной коннотации). В основном потому, что это немного упрощает автоматическую генерацию кода.

3
ответ дан 29 November 2019 в 06:09
поделиться

Хорошая причина иметь этот код - на этапе разработки: вы хотите временно отключить определенный код, но вы все равно хотите, чтобы этот код был проверен на синтаксис.

например:

int i = 2, j = 3;
int result = 0;

// FIXME: Commented out for now because I have to recheck calculation
if (false) {
  result = i*2+j+3+i*j;
}

System.out.println("Result of difficult calculation = "+result);

Если вы поместите список «результат = i * 2 + j + 3 + i j;» просто в / комментариях * / вы почти уверены, что при удалении или переименовании определенных переменных (например, i) вы не получите сообщение об ошибке.

2
ответ дан 29 November 2019 в 06:09
поделиться

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

2
ответ дан 29 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: