Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет prool ([info]prool)
@ 2014-09-05 21:38:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Программистские досуги
Развлекаясь сборкой разных версий мадов (MUD) я нашел интересный баг (или не баг, а фичу).

Некий код не собирался при помощи gcc 4.4.5 (Debian 6), хотя я помню, в 5 Дебиане я его собирал без проблем. Более подробный анализ показал следующую ситуацию:

Есть массив int flag[3]

flag[0] - это lvalue, это понятно

А вот конструкция вида

(i<0) ? flag[0] : flag[1]

рассматривается старым компилятором (3.*) как lvalue, а новым (4.*) нет

Возникает вопрос, есть ли у gcc 4.4.5 флага, чтобы он вел себя как 3.*, хотя бы в этой ситуации. Если нет, я тупо перепишу макрос на 3 строчки в функцию и все разрулится. Вообще, кто копал коды CircleMUD, это ужасужасужас. Эти упоротые укурки из Дании очень любят макросы, многострочные, длинные и много раз вложенные, хорошо, хоть без рекурсии


(Добавить комментарий)


[info]ketmar
2014-09-06 02:00 (ссылка)
нет флага, потому что это баг был. стандарт такой хуйни не позволяет. то, что стандарт — дерьмо, то это разговор отдельный. однако же баг, его починили, флага нет и не будет.

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

а вообще — смело хуячь функцию, присобачивай к ней static inline и суй в хидер, например. будет всяко лучше макроса, и ни разу не медленней.

(Ответить) (Ветвь дискуссии)


[info]prool
2014-09-07 13:26 (ссылка)
Временно я решил так: собираю код при помощи g++, который такие конструкции позволяет и нормально реализует

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2014-09-07 13:33 (ссылка)
а касты перед malloc не заебался ставить?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]prool
2014-09-07 13:36 (ссылка)
Ничего не ставил, выскочила куча варнингов, но код собрался и заработал

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2014-09-07 13:41 (ссылка)
а должно было сказать нечто типа: «error: invalid conversion from 'void*' to 'char*' [-fpermissive]». а если оно так не сказало, то оригинальные авторы кода ещё более ебанутые, чем я думал, и зачем-то кастуют указатели в сишном коде, что есть признак безмозглости.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]prool
2014-09-07 14:23 (ссылка)
Оно так и сказало и я добавил флаг -fpermissive и error превратился в warning

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2014-09-07 14:26 (ссылка)
а ты, хитрый!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]prool
2014-09-07 14:47 (ссылка)
да, я хитр и коварен

(Ответить) (Уровень выше)


[info]ketmar
2014-09-07 13:34 (ссылка)
кстати, можешь попробовать TCC собрать. TCC, вроде бы, достаточно похуистично относится к букве стандарта.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]prool
2014-09-07 13:40 (ссылка)
Нет, tcc тоже пишет "lvalue expected"

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ketmar
2014-09-07 13:42 (ссылка)
и туда дотянулись, проклятые!

(Ответить) (Уровень выше)