0xd34df00d 22.05.2012 11:15 Azoth_primary

gcc 4.7 — говно. Есть функция, состоящая из одного свитча по енам классу, в котором перечислены все возможные case'ы для значений енамкласса, и для каждого кейса указан return. Так вот, gcc 4.7 все равно ругается, что control reaches end of non-void function.

Recommended by:

@pooq: моча съела говно

@hirthwork: воистину говно

and @gelraen
1. magog 22.05.2012 11:15 Azoth@Work

не юзай замасканую гцц

2. 0xd34df00dmagog /1 22.05.2012 11:15 Azoth_primary

Казалось бы, причем тут замасканность.

3. mva 22.05.2012 11:16 N900

а может просто нехуй считать себя умнее компилятора? :3

4. 0xd34df00dmva /3 22.05.2012 11:16 Azoth_primary

С чего ты взял, что это — умнее компилятора?

5. magog0xd34df00d /2 22.05.2012 11:16 Azoth@Work

при том, что может это баг, который еще не пофиксили

6. kb 22.05.2012 11:17 c8541125

уже доебал этот ваш switch-case.

7. 0xd34df00dmagog /5 22.05.2012 11:17 Azoth_primary

При Стал^WW gcc 4.5-4.6 такого не было!

8. 0xd34df00dkb /6 22.05.2012 11:17 Azoth_primary

А чо?

9. mva0xd34df00d /4 22.05.2012 11:17 N900

с того, что ты хочешь выебнуться, а компилятор считает, что ты нихуя не прав. И ты считаешь виноватым компилятор.

10. kb0xd34df00d /8 22.05.2012 11:17

ну, у анализера было. + то про джаву, то про плюсы, то про множественные ретурны.

11. 0xd34df00dmva /9 22.05.2012 11:17 Azoth_primary

С чего ты взял, что я хочу выебнуться, и с чего ты взял, что компилятор тут прав?

12. k0st1x 22.05.2012 11:21 Work

правильно делает, что ругается

13. 0xd34df00dk0st1x /12 22.05.2012 11:23 Azoth_primary

Нет. enum class же.

14. hirthworkk0st1x /12 22.05.2012 11:23 mcabberE00C080A

аргументы?

15. k0st1xhirthwork /14 22.05.2012 11:27 Work

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

16. 0xd34df00dk0st1x /15 22.05.2012 11:28 Azoth_primary

Для enum class'а значение, не входящее в перечисленные — UB. Ругаться теперь на каждое (потенциальное) UB?

17. magog0xd34df00d /16 22.05.2012 11:28 Azoth@Work

а тебе не кажется, что это охуенно?

18. kbk0st1x /15 22.05.2012 11:28 c8541125

а если тебе ide будет предлагать с моста спрыгнуть, ты и это будешь считать нормальным?

19. 0xd34df00dmagog /17 22.05.2012 11:29 Azoth_primary

Нет, не кажется.

20. magogmagog /17 22.05.2012 11:29 Azoth@Work

если компилятор будет ругаться на все UB — это просто гениальный компилятор

21. 0xd34df00dmagog /20 22.05.2012 11:30 Azoth_primary

На UB ругаться — это ок. Другое дело (которое здесь и есть) — ругаться на все места, где UB может проявиться.
Например, на любое обращение к элементам класса внутри членов класса. А хуле, можно повыебываться так, что this будет равен 0, все, UB. Давайте ругаться!

22. k0st1xkb /18 22.05.2012 11:30 Work

обычно ide не просто ругается, а объясняет, почему, даже ссылку на доку показывает. ежели пишите без ide (или хотя бы без статического анализа), то это прескорбно — многих дельных советов лишаешься

23. 0xd34df00dk0st1x /22 22.05.2012 11:30 Azoth_primary

Скажи, ты ведь не на плюсах пишешь, да?

24. k0st1x0xd34df00d /23 22.05.2012 11:30 Work

нет, но общаюсь с людьми, которые юзают статический анализ для C++ проектов

25. hirthworkmagog /20 22.05.2012 11:31 mcabberE00C080A

а то что я уже провалидировал этот UB снаружи — ничего? т.е. предлагается написать код, который не будет ничего делать (default в switch), ради такой паранойи компилятора? а ничего что это приведёт к выполнению лишних инструкций при обработке? с каких пор в плюсах стало нужно платить за то что ты не используешь?

26. magogk0st1x /24 22.05.2012 11:31 Azoth@Work

вот скажи — какое отнощение имеет ide к выводу компилятора?

27. 0xd34df00dk0st1x /24 22.05.2012 11:31 Azoth_primary

А что они юзают, а? static-analyzer из шланга — такое дерьмо, что пиздец. Ну, по крайней мере, в плане набора проверок.

28. kbmagog /26 22.05.2012 11:31

или к статическому анализатору

29. hirthworkk0st1x /24 22.05.2012 11:32 mcabberE00C080A

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

30. magoghirthwork /25 22.05.2012 11:32 Azoth@Work

а какие инструкции он выполнять будет, если у тебя нормальный свич? Он даже не дойдет до default же

31. kbhirthwork /29 22.05.2012 11:32

тоньше надо быть

32. magogkb /31 22.05.2012 11:33 Azoth@Work

>hirthwork
> тоньше
ггг

33. hirthworkmagog /30 22.05.2012 11:33 mcabberE00C080A

не представляю, как можно сделать обработку default не вводя дополнительные инструкции до перехода к таблице jump'ов

34. hirthworkkb /31 22.05.2012 11:34 mcabberE00C080A

охуеть, почему ты ему не сказал, что умнее надо быть?

35. k0st1x0xd34df00d /27 22.05.2012 11:34 Work

те люди юзают вот такое дерьмо http://www.viva64.com/

36. 0xd34df00dk0st1x /35 22.05.2012 11:34 Azoth_primary

Слишком непрыщаво.

37. 0xd34df00d0xd34df00d /36 22.05.2012 11:35 Azoth_primary

Хотя я подумываю поставить на свою игромашину и штудию и погонять там это.

38. k0st1xmagog /26 22.05.2012 11:35 Work

да, наверно ide с компилятором — на столько разные вещи, что они не парсят код, не стоят AST.....

39. kbhirthwork /34 22.05.2012 11:35

в прошлый раз он мне IDE посоветовал использовать. скажу умнее быть — так вообще посоветует завтракать выжатыми кошачьими мордами. не хочу.

40. k0st1xkb /28 22.05.2012 11:36 Work

я привык к тому, что ide включает в себя аналайзер. как у вас — хз, наверно, стоит соболезновать

41. magogk0st1x /40 22.05.2012 11:36 Azoth@Work

охуеть. Тоесть ты не представляешь себе программирования без IDE?

42. k0st1x0xd34df00d /36 22.05.2012 11:39 Work

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

43. 0xd34df00dk0st1x /42 22.05.2012 11:39 Azoth_primary

/37

44. k0st1xmagog /41 22.05.2012 11:42 Work

я представляю себе, как работать без ide. и я знаю, сколько косяков можно допустить без него.

45. 0xd34df00dk0st1x /44 22.05.2012 11:42 Azoth_primary

Жабка какая-нибудь, небось

46. magogk0st1x /44 22.05.2012 11:43 Azoth@Work

расскажи, плз, от каких косяков тебя защитила IDE

47. k0st1xmagog /46 22.05.2012 11:44 Work

рефакторинг общего кода на 6 проектов

48. k0st1xmagog /46 22.05.2012 11:47 Work

здесь не только в косяках дело. банально, запуск и отладка тестов. да и вообще умный watch-window (способный делать evaluate выражениям, а не только просмотр локальных переменных) моё всё. детальная схема десятков параллельных потов и их стеки.

49. kbhirthwork /33 22.05.2012 11:56

объясни, пожалуйста, что-то я не понял. вот взял я, значит, два файла 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'ов, так что, по идее, никаких накладных расходов.

50. hirthworkkb /49 22.05.2012 12:05 mcabberE00C080A

c -O3 выхлоп различается в одной иструкции. в случае с default это movl, а в случае без него — xorl, который шибко быстрее

51. ulidtko 22.05.2012 13:39

было уже

52. 0xd34df00dulidtko /51 22.05.2012 13:39 Azoth_primary

Што.

53. kbhirthwork /50 22.05.2012 14:00

да, этот выхлоп с -O3 я тоже увидел сразу, и здесь ты прав по поводу того, что вариант без default быстрее. но я так и не понял изначальной твоей формулировки про "не могу представить", что конкретно имелось в виду.

p.s.: ну и этот выхлоп из O3 я даже не пытался понять, но вообще интересно, надо будет на досуге разобраться.

54. DJm00n 22.05.2012 15:41

default: new Exeption("Trololo")
или вроде того. все, проблемы нет.

55. 0xd34df00dDJm00n /54 22.05.2012 15:42 Azoth_primary

Костыль.

56. DJm00n0xd34df00d /55 22.05.2012 15:43 Vacuum-IM

а если твой энум расширен в другом модуле и попал сюда, што тогда? как должна вести себя программа?

57. 0xd34df00dDJm00n /56 22.05.2012 15:44 Azoth_primary

Это UB. Точно такое же, как если бы я сделал f (static_cast<EnumClass> (100));

58. DJm00n0xd34df00d /57 22.05.2012 15:53 Vacuum-IM

имхо default должон быть. http://devlicio.us/blogs/derik_whittaker...

59. 0xd34df00dDJm00n /58 22.05.2012 15:54 Azoth_primary

enum ≠ enum class

60. DJm00n0xd34df00d /59 22.05.2012 15:54 Vacuum-IM

поясни подробнее.

61. 0xd34df00dDJm00n /60 22.05.2012 15:57 Azoth_primary

Кастовать левые значения к enum class (да и вообще кастовать к enum class, если мне не изменяет память) — UB.

62. DJm00n0xd34df00d /61 22.05.2012 16:01 Vacuum-IM

switch должен возвращать значение (если он единственный оператор в методе) при любы значениях.
это все равно что ты написал
{
if(ololo="1")
return;
else if(ololo="2")
return;
else if(ololo=....)
return;
}
такое не соберется без
return в конце метода или
else return;

63. 0xd34df00dDJm00n /62 22.05.2012 16:02 Azoth_primary

Не совсем. При любых допустимых значениях. Неравенство переменной типа enum class ни одному элементу enum class — UB.

64. kbDJm00n /62 22.05.2012 16:04 c8541125

как это. я думал, что если switch не найдёт правила для обработки — он дальше себе спокойно пойдёт.

65. 0xd34df00dkb /64 22.05.2012 16:04 Azoth_primary

Ну да, он-то пойдет, а из функции что вернется?

66. kb0xd34df00d /65 22.05.2012 16:06 c8541125

ну (мне лично) понятно, что компилятор обязан свалиться на этапе компиляции, да. я думал вопрос в том, какого хуя он предупреждает, если в switch есть обработка всех вариантов из enum.

67. 0xd34df00dkb /66 22.05.2012 16:07 Azoth_primary

Из просто enum — ок. Из enum class не должен предупреждать.
И нет, компилятор не валится на этапе компиляции (только, разве что, с -Werror). Он вполне сожрет и std::string foo () {}

68. ulidtko0xd34df00d /52 22.05.2012 16:07 уважением

я постил раньше 100%, enum class здесь ни при чём http://stackoverflow.com/questions/63766...

69. kb0xd34df00d /65 22.05.2012 16:07 c8541125

то есть не undefined behaviour, как ты пишешь, а compile error, т.к. мне что-то подсказывает, что в стандарте должно быть прописано "компилятор не должен позволять создавать функции, не возвращающие значение, которое в описании функции"

70. ulidtkoulidtko /68 22.05.2012 16:09

там же объясняют, почему вставлять default: throw new Exception("Trololo") — это плохо и, generally, DON'T.

71. 0xd34df00dkb /69 22.05.2012 16:11 Azoth_primary

Но не прописано.

72. 0xd34df00dulidtko /68 22.05.2012 16:12 Azoth_primary

Проблема в том, что gcc 4.5 ведет себя на коде с enum class'ами именно так, как ожидается. Не знаю насчет 4.6, впрочем.

73. ulidtkoDJm00n /56 22.05.2012 16:14 уважением

она должна не собраться, очевидно же. Чтобы ты пошёл и пофиксил свой switch.

74. 0xd34df00dulidtko /73 22.05.2012 16:14 Azoth_primary

А если это в рантайме?

75. ulidtko0xd34df00d /72 22.05.2012 16:16

давай выкатывай пример уже

76. ulidtko0xd34df00d /74 22.05.2012 16:17

что в рантайме? кодогенерация свитчей на лету? :C

77. 0xd34df00dulidtko /75 22.05.2012 16:19 Azoth_primary

enum class EnumClass { Foo, Bar };
bool DoFoo (EnumClass var)
{
switch (var)
{
case EnumClass::Foo:
case EnumClass::Bar:
return true;
}
}

78. 0xd34df00dulidtko /76 22.05.2012 16:19 Azoth_primary

Один модуль дергает другой, епт. Другой скомпилен с более старой версией хедеров и не знает о новом значении енума.
Это UB, да, но случай, когда конпелятор не ругнется на каст.

79. ulidtko0xd34df00d /77 22.05.2012 16:22 уважением

в GCC 4.6
test.cpp:10:1: warning: control reaches end of non-void function [-Wreturn-type]

Мне тут вдруг подумалось: а варнинги ведь не гарантируют отсутствия false positive-ов?

80. ulidtko0xd34df00d /78 22.05.2012 16:23 уважением

> скомпилен с более старой версией хедеров
> скомпилен с более старой версией хедеров
> скомпилен с более старой версией хедеров

81. 0xd34df00dulidtko /79 22.05.2012 16:23 Azoth_primary

Конечно не гарантируют.
Попробуй с гцц 4.5 еще теперь.

82. 0xd34df00dulidtko /80 22.05.2012 16:23 Azoth_primary

И што?

83. ulidtko0xd34df00d /81 22.05.2012 16:24 уважением

хм, а в 4.5 нет. Мб и регрессия.

84. 0xd34df00dulidtko /83 22.05.2012 16:25 Azoth_primary

Вооо. Вот я и думаю, открывать буг или нет.

85. ulidtko0xd34df00d /84 22.05.2012 16:26 уважением

открывай, нехай триэйджат, хуле

86. magogulidtko /85 22.05.2012 17:56 Azoth

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.
Походу никто не читал ссылку улитки. Имхо все четко и правильно расписано почему и зачем

87. 0xd34df00dmagog /86 22.05.2012 17:57 Azoth_primary

Походу, ты не читал тред дальше ссылки улидтки. Сравни поведение gcc 4.5 и gcc 4.{6,7} на приведенном мной тесткейсе.

88. magog0xd34df00d /87 22.05.2012 17:58 Azoth

то, что в новой версии что-то сломали — ничего удивительного. Отправил баг и забыл.

89. hirthwork0xd34df00d /78 22.05.2012 18:07 mcabber7A55EF25

пиздец

90. 0xd34df00dhirthwork /89 22.05.2012 18:08 Azoth_primary

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

91. hirthwork0xd34df00d /63 22.05.2012 18:13 mcabber7A55EF25

ок, допустим. левое значение в 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 выдавать ошибку компиляции, но это всё равно пиздец

92. 0xd34df00dhirthwork /91 22.05.2012 18:14 Azoth_primary

Научи определять такое UB в компил-тайме. Что не «может возникнуть», а «полюбас возникнет».

93. hirthwork0xd34df00d /92 22.05.2012 18:15 mcabber7A55EF25

см. там выше про Halting Problem

94. 0xd34df00dhirthwork /93 22.05.2012 18:17 Azoth_primary

Вопрос в поведении по дефолту, когда UB возможно, но неопределимо. См. выше про пример с this.

95. ulidtko0xd34df00d /87 22.05.2012 20:31 уважением

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

Ещё ты можешь перестать ныть и лососнуть сорца.

96. kb0xd34df00d /90 22.05.2012 20:55

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

97. kb0xd34df00d /94 22.05.2012 21:01

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

98. 0xd34df00dulidtko /95 22.05.2012 22:13 Azoth_primary

-Wreturn-type — слишком общий ворнинг для отключения.

99. 0xd34df00dkb /96 22.05.2012 22:14 Azoth_primary

Если у тебя два модуля, один ты пересобрал, а ты — нет.

100. ulidtko0xd34df00d /98 22.05.2012 22:14 уважением

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

101. kb0xd34df00d /99 23.05.2012 08:19

Ну, к сожалению, я далёк от этого. Но вот ситуация "один файл обновил, другой — нет" звучит нереально.

Do you really want to delete ?