0xd34df00d
22.05.2012 11:15 Azoth_primary
gcc 4.7 — говно. Есть функция, состоящая из одного свитча по енам классу, в котором перечислены все возможные case'ы для значений енамкласса, и для каждого кейса указан return. Так вот, gcc 4.7 все равно ругается, что control reaches end of non-void function.
не юзай замасканую гцц
Казалось бы, причем тут замасканность.
а может просто нехуй считать себя умнее компилятора? :3
С чего ты взял, что это — умнее компилятора?
при том, что может это баг, который еще не пофиксили
уже доебал этот ваш switch-case.
При Стал^WW gcc 4.5-4.6 такого не было!
А чо?
с того, что ты хочешь выебнуться, а компилятор считает, что ты нихуя не прав. И ты считаешь виноватым компилятор.
ну, у анализера было. + то про джаву, то про плюсы, то про множественные ретурны.
С чего ты взял, что я хочу выебнуться, и с чего ты взял, что компилятор тут прав?
правильно делает, что ругается
Нет. enum class же.
аргументы?
я привык, что любая ide ругается на это. к этому пришли все норм кодеры.
это логично, что можно предположить, что в значении enum'а пришло значение, не входящее в перечисленные
Для enum class'а значение, не входящее в перечисленные — UB. Ругаться теперь на каждое (потенциальное) UB?
а тебе не кажется, что это охуенно?
а если тебе ide будет предлагать с моста спрыгнуть, ты и это будешь считать нормальным?
Нет, не кажется.
если компилятор будет ругаться на все UB — это просто гениальный компилятор
На UB ругаться — это ок. Другое дело (которое здесь и есть) — ругаться на все места, где UB может проявиться.
Например, на любое обращение к элементам класса внутри членов класса. А хуле, можно повыебываться так, что this будет равен 0, все, UB. Давайте ругаться!
обычно ide не просто ругается, а объясняет, почему, даже ссылку на доку показывает. ежели пишите без ide (или хотя бы без статического анализа), то это прескорбно — многих дельных советов лишаешься
Скажи, ты ведь не на плюсах пишешь, да?
нет, но общаюсь с людьми, которые юзают статический анализ для C++ проектов
а то что я уже провалидировал этот UB снаружи — ничего? т.е. предлагается написать код, который не будет ничего делать (default в switch), ради такой паранойи компилятора? а ничего что это приведёт к выполнению лишних инструкций при обработке? с каких пор в плюсах стало нужно платить за то что ты не используешь?
вот скажи — какое отнощение имеет ide к выводу компилятора?
А что они юзают, а? static-analyzer из шланга — такое дерьмо, что пиздец. Ну, по крайней мере, в плане набора проверок.
или к статическому анализатору
бля, а я может общаюсь с людьми, которые рассказывают как ты классно у них хуй сосёшь. что с того?
а какие инструкции он выполнять будет, если у тебя нормальный свич? Он даже не дойдет до default же
тоньше надо быть
>hirthwork
> тоньше
ггг
не представляю, как можно сделать обработку default не вводя дополнительные инструкции до перехода к таблице jump'ов
охуеть, почему ты ему не сказал, что умнее надо быть?
те люди юзают вот такое дерьмо http://www.viva64.com/
Слишком непрыщаво.
Хотя я подумываю поставить на свою игромашину и штудию и погонять там это.
да, наверно ide с компилятором — на столько разные вещи, что они не парсят код, не стоят AST.....
в прошлый раз он мне IDE посоветовал использовать. скажу умнее быть — так вообще посоветует завтракать выжатыми кошачьими мордами. не хочу.
я привык к тому, что ide включает в себя аналайзер. как у вас — хз, наверно, стоит соболезновать
охуеть. Тоесть ты не представляешь себе программирования без IDE?
кстати, viva64 периодически появляется на хабре с постами, как они проанализировали опенсорс проекты и что интересного там было найдено.
еще, как то видел разраба это viva64 PVS, он сказал, что работают над поддержкой clang компилера.
да, и у них есть беплатная версия, правда все версии у них только для win-платформы
/37
я представляю себе, как работать без ide. и я знаю, сколько косяков можно допустить без него.
Жабка какая-нибудь, небось
расскажи, плз, от каких косяков тебя защитила IDE
рефакторинг общего кода на 6 проектов
здесь не только в косяках дело. банально, запуск и отладка тестов. да и вообще умный watch-window (способный делать evaluate выражениям, а не только просмотр локальных переменных) моё всё. детальная схема десятков параллельных потов и их стеки.
объясни, пожалуйста, что-то я не понял. вот взял я, значит, два файла http://paste.ubuntu.com/1000676/
собрал вот так (ну, можно еще посмотреть разные -O3, наверное):
g++ -S -O0 -o switch.asm switch.cpp
g++ -S -O0 -o switch_nodefault.asm switch_nodefault.cpp
открыл текстовым редактором и вижу, что добавилась только в конце обработка default'ов, так что, по идее, никаких накладных расходов.
c -O3 выхлоп различается в одной иструкции. в случае с default это movl, а в случае без него — xorl, который шибко быстрее
было уже
Што.
да, этот выхлоп с -O3 я тоже увидел сразу, и здесь ты прав по поводу того, что вариант без default быстрее. но я так и не понял изначальной твоей формулировки про "не могу представить", что конкретно имелось в виду.
p.s.: ну и этот выхлоп из O3 я даже не пытался понять, но вообще интересно, надо будет на досуге разобраться.
default: new Exeption("Trololo")
или вроде того. все, проблемы нет.
Костыль.
а если твой энум расширен в другом модуле и попал сюда, што тогда? как должна вести себя программа?
Это UB. Точно такое же, как если бы я сделал f (static_cast<EnumClass> (100));
имхо default должон быть. http://devlicio.us/blogs/derik_whittaker...
enum ≠ enum class
поясни подробнее.
Кастовать левые значения к enum class (да и вообще кастовать к enum class, если мне не изменяет память) — UB.
switch должен возвращать значение (если он единственный оператор в методе) при любы значениях.
это все равно что ты написал
{
if(ololo="1")
return;
else if(ololo="2")
return;
else if(ololo=....)
return;
}
такое не соберется без
return в конце метода или
else return;
Не совсем. При любых допустимых значениях. Неравенство переменной типа enum class ни одному элементу enum class — UB.
как это. я думал, что если switch не найдёт правила для обработки — он дальше себе спокойно пойдёт.
Ну да, он-то пойдет, а из функции что вернется?
ну (мне лично) понятно, что компилятор обязан свалиться на этапе компиляции, да. я думал вопрос в том, какого хуя он предупреждает, если в switch есть обработка всех вариантов из enum.
Из просто enum — ок. Из enum class не должен предупреждать.
И нет, компилятор не валится на этапе компиляции (только, разве что, с -Werror). Он вполне сожрет и std::string foo () {}
я постил раньше 100%, enum class здесь ни при чём http://stackoverflow.com/questions/63766...
то есть не undefined behaviour, как ты пишешь, а compile error, т.к. мне что-то подсказывает, что в стандарте должно быть прописано "компилятор не должен позволять создавать функции, не возвращающие значение, которое в описании функции"
там же объясняют, почему вставлять default: throw new Exception("Trololo") — это плохо и, generally, DON'T.
Но не прописано.
Проблема в том, что gcc 4.5 ведет себя на коде с enum class'ами именно так, как ожидается. Не знаю насчет 4.6, впрочем.
она должна не собраться, очевидно же. Чтобы ты пошёл и пофиксил свой switch.
А если это в рантайме?
давай выкатывай пример уже
что в рантайме? кодогенерация свитчей на лету? :C
enum class EnumClass { Foo, Bar };
bool DoFoo (EnumClass var)
{
switch (var)
{
case EnumClass::Foo:
case EnumClass::Bar:
return true;
}
}
Один модуль дергает другой, епт. Другой скомпилен с более старой версией хедеров и не знает о новом значении енума.
Это UB, да, но случай, когда конпелятор не ругнется на каст.
в GCC 4.6
test.cpp:10:1: warning: control reaches end of non-void function [-Wreturn-type]
Мне тут вдруг подумалось: а варнинги ведь не гарантируют отсутствия false positive-ов?
> скомпилен с более старой версией хедеров
> скомпилен с более старой версией хедеров
> скомпилен с более старой версией хедеров
Конечно не гарантируют.
Попробуй с гцц 4.5 еще теперь.
И што?
хм, а в 4.5 нет. Мб и регрессия.
Вооо. Вот я и думаю, открывать буг или нет.
открывай, нехай триэйджат, хуле
In general the compiler isn't smart enough to deduce whether you've covered every possible path that control could actually take through the switch statement. To be that smart it would have to be able to deduce all of the possible states the program can reach before entering the switch, which leads straight to the Halting Problem.
Походу никто не читал ссылку улитки. Имхо все четко и правильно расписано почему и зачем
Походу, ты не читал тред дальше ссылки улидтки. Сравни поведение gcc 4.5 и gcc 4.{6,7} на приведенном мной тесткейсе.
то, что в новой версии что-то сломали — ничего удивительного. Отправил баг и забыл.
пиздец
Не пиздец, а вариант, когда без единого ворнинга и явного каста получишь UB.
Впрочем, отсутствие версионирования — пиздец.
ок, допустим. левое значение в enum class — UB. при этом UB в случае switch без default может возникнуть ещё один UB. смотрим ISO 14882:2003 §1.3.12 «permissible undefined behavior ranges from ignoring ... to terminating a translation» т.е. компилятору реально разрешено на switch без default выдавать ошибку компиляции, но это всё равно пиздец
Научи определять такое UB в компил-тайме. Что не «может возникнуть», а «полюбас возникнет».
см. там выше про Halting Problem
Вопрос в поведении по дефолту, когда UB возможно, но неопределимо. См. выше про пример с this.
ты в своей категоричности неправ. Магог дело цитирует, запилить полноценный анализ может быть весьма проблематично; а выдрачивать мелкие регрессии в и без того кривой и костылеватой евристике хуй кто возьмётся.
Зато можешь попробовать попросить опцию, отключающую эту евристику по проверке свитчей.
Ещё ты можешь перестать ныть и лососнуть сорца.
откуда вообще вы все берётесь? одни в джаве скомпилированные модули (или как они там) подменяют, другие в плюсах хедер-файлы. как такое вообще вероятно сделать? разве что кого-то увольнять будут и тот со злости.
короче плюсы говно и нужно все switch'и заменить на алгебраические типы, чтоб компилятор делал то, чего все от него в этом треде хотят.
-Wreturn-type — слишком общий ворнинг для отключения.
Если у тебя два модуля, один ты пересобрал, а ты — нет.
я же говорю: можешь попросить более специфичный ворнинг, именно для этой евристики в свитчах
Ну, к сожалению, я далёк от этого. Но вот ситуация "один файл обновил, другой — нет" звучит нереально.