Разница между all и everything

12 янв 2015 12:30


Иногда в разрабатываемую версию Perl проталкивают решения, от которых хочется поднести ладони к лицу -_\

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

↓↓↓↓↓↓↓↓

Как известно, указав прагму warnings, мы декларируем желание получать от компилятора предупреждения о возможных проблемах в коде. Эти две записи эквивалентны:

use warnings;
use warnings 'all';

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

no warnings;
no warnings 'all';

Существуют также ключ командной строки -w, который добавляет принудительный use warnings вызываемому скрипту, и даже ключ -W, который заставляет игнорировать все no warnings в коде для бескомпромиссного отлова всех предупреждений.

Разумеется, с выходом новых версий Perl регулярно появляются новые предупреждения, и старый работающий код может начать сыпать предупреждениями. Всё это бывает неприятно, но вполне ожидаемо, т.к. мы сами согласились на это, указав use warnings.

Так всё и было, пока не появился коммит от Ævar ea5519d , где была добавлена возможность добавлять предупреждения вне категории all. Соответственно, чтобы добиться эффекта включения не просто всех, а вообще всех-при-всех предупреждений, создана новая категория everything, которая теперь включает all и дополнительную категорию extra:

everything-+
           |
           +- all ---+ ...
           |   
           +- extra -+ ...

Ключи -w и -W по прежнему активируют только all предупреждения.

С одной стороны, это конечно позволит смело добавлять новые виды предупреждений и не бояться, что сломается существующий код. Но с другой стороны появляется большая путаница с терминами all против everything. Кто возьмёт на себя смелость разъяснять разницу между ними всем и каждому? Кроме того инициируется бардак с субкатегориями (что отправлять в all, а что в extra?). Например, есть субкатегория void_unusual в составе extra и void в составе all. Рассмотрим код:

$_ for (1,2);
grep //, (1,2);

Первая строка генерирует предупреждение all::void, а вторая extra::void_unusual, хотя обе указывают на то, что результат теряется в пустом контексте. Обсуждение спорного изменения можно посмотреть здесь .

Теги: perl warnings facepalm

Обновлён: 2015-01-12 13:19


Комментарии (1)

Konstantin

2015-06-18 16:32

На самом деле, такое поведение абсолютно аналогично gcc и clang, в которых -Wall включают не все доступные предупреждения, а только избранные, для всего остального есть -Wextra, а у clang еще и -Weverything.

>что отправлять в all, а что в extra
Логично в extra отправлять предупреждения с большей вероятностью ложных срабатываний, или существенно замедляющие выполнение


Оставить комментарий