crypt of decay - ёбаный гоцэцэ [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

ёбаный гоцэцэ [Nov. 5th, 2023|06:40 am]
Previous Entry Add to Memories Tell A Friend Next Entry
«а давайте… давайте… давайте дадим инструменты, но поломаные, но снаружи хорошие, и никому не скажем, что они поломаные, ахахахахаха!» пидорасы. в самом плохом смысле.

вот в гоцэцэ можно брать адреса меточек, а потом на эти адреса делать прямое goto. вроде бы круто, да? ну, извращение, но если надо быструю виртуальную машину с минимальным диспетчером опкодов, а в асм по каким-то причинам нельзя — то вполне вариант, компилируется в три асм-команды. примеров в сети есть.

а теперь мы хотим то же самое, только джампать внутрь функций. а почему нельзя? параметров функции не принимают, локалов не используют. а мне удобно описывать примитивы как отдельные функции, чтобы можно было ядро расширять. и вот тут гоцэцэ начинает считать, что он просто охуеть умный какой.
void *fuck_you_gcc (void) {
  return &&mylabel;
mylabel:
  что-то-там
  goto **IP++;
}

круто, да? ну можно же? а вот хуй. сначала гоцэцэ матерится, что я, де, возвращаю указатель на локальную метку. блядь, да, прикинь: именно это я и хотел сделать! матерится, кстати, ворнингом, не еггогом. ладно. успокаиваем дегенерата.
void *fuck_you_gcc (void) {
  static const fuck_you_gcc_again[1] = {&&mylabel};
  return (void *)fuck_you_gcc_again[0];
mylabel:
  что-то-там
  goto **IP++;
}

на удивление, хвалёный data flow analysis тут каким-то образом умудряется обосраться и ничего не заметить. ворнинг пропал. но… нихуя не работает. потому что хвалёный data flow analysis обосрался. гоцэцэ считает, что метка, и всё, что за ней, не используется — и возвращает вместо адреса метки почему-то адрес входа в функцию. я хуй знает, почему он посчитал, что это «оптимизация, которая не меняет смысл программы». видимо, потому что гладиолус. ладно. обходим.
static volatile int fuck_you_gcc_agan_and_again;
void *fuck_you_gcc (void) {
  static const fuck_you_gcc_again[1] = {&&mylabel};
  if (fuck_you_gcc_agan_and_again == 0) {
mylabel:
    что-то-там
    goto **IP++;
  }
  return (void *)fuck_you_gcc_again[0];
}

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

ладно, всё равно никто даже не пытался. короче, несмотря на то, что IP — глобал, что я его даже пометил volatile — ебаный гоцэцэ решил, что этот гото может прыгнуть исключительно на эту метку, и больше никуда. ведь других меток в функции нет. поэтому он заменил индирект на простое «jmp mylabel». ай, бля, красава, ай, бля, спасибо! это, видимо, снова Охуительная Не Меняющая Смысл Кода Оптимизация. попытки прояснить гоцэцэ при помощи трюков встроеного асма закономерно не работают. ладно. всовываем всем в жопу лом.
static volatile int fuck_you_gcc_agan_and_again;
void *fuck_you_gcc (void) {
  static const fuck_you_gcc_again[2] = {&&mylabel, &&fuck_gcc_developers_with_long_crowbar};
  if (fuck_you_gcc_agan_and_again == 0) {
mylabel:
    что-то-там
    goto **IP++;
  }
fuck_gcc_developers_with_long_crowbar:
  return (void *)fuck_you_gcc_again[0];
}

вы не поверите, но на этом месте гоцэцэ устал со мной бодаться и сгенерировал именно тот код, которого я от него добивался. ура, у нас же теперь АЖ ЦЕЛЫХ ДВЕ МЕТОЧКИ, значит гото нельзя «оптимизировать»! то, что вторая не используется — гоцэцэ, к счастью, не заметил.

да, здесь денегераты со «стандартом» в верхней жопе начнут мне рассказывать, что использование адреса метки вне функции, где она определена — это UB, а потому гоцэцэ имеет право на всё вышеописаное. с этими существами я спорить не буду по причине отсутствия у них мыслительного органа.

если чо, всю эту хуйню гоцэцэ делает даже с -O0. не то чтобы оно было важно, потому что нахера мне быстрая VM при -O0, но отмечу на всякий случай.

p.s.: ответ на вопрос, который никто не задавал: «почему не использовать просто адреса фнукций, там же всё равно нет аргументов и локалов?» потому что при каких-то странных условиях гоцэцэ иногда им зачем-то всё равно приписывает пролог и эпилог. я не очень понял, что является триггером, но. соответственно, `goto` эпилог не делает, и стек улетает в гости к венерианским сисястым шлюхам. (дополнение: это может быть пиздёж с моей стороны, вызваный Тяжёлыми Обстоятельствами. но я всё равно изначально хотел объединять несколько примитивов в один «пакет», и всё равно засунуть их все в одну функцию не выйдет, их там за триста штук, и они всё равно могут джампать наружу из функции.)
Linkmeow!

Comments:
[User Picture]
From:[info]blackdoomer
Date:November 5th, 2023 - 07:43 am
(Link)
мне интересно, за коим хуем гцц вообще учитывает при оптимизации стандартовые UB вне -std=c* режимов.

> потому что при каких-то странных условиях гоцэцэ иногда им зачем-то всё равно приписывает пролог и эпилог. я не очень понял, что является триггером, но. соответственно, `goto` эпилог не делает, и стек улетает в гости к венерианским сисястым шлюхам.

а ты им naked-атрибут проставил? или я туплю и здесь это не помогло бы?
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 03:58 pm
(Link)
>а ты им naked-атрибут проставил? или я туплю и здесь это не помогло бы?
ты не тупить, но гоцэцэ на него под настроение точно так же поебать. и на флаг "-fomit-frame-pointer" тоже. иногда не поебать. а иногда поебать. потому что гоцэцэ умный, а все вокруг дебилы.

>мне интересно, за коим хуем гцц вообще учитывает при оптимизации стандартовые UB
>вне -std=c* режимов.

так это не секрет: benchmark game.
[User Picture]
From:[info]blackdoomer
Date:November 5th, 2023 - 05:02 pm
(Link)
> гоцэцэ на него под настроение точно так же поебать

возможно, что всё проще: оказывается, для x86 его завезли только в GCC 8.
https://stackoverflow.com/questions/8374449/equivalent-for-gccs-naked-attribute
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 04:03 pm
(Link)
а вообще, я хотел сначала иметь возможность объединять кучу примитивов в одной функции, тематически. но пока дрался с гоцэцэ, то всё забыл. да и я ебанусь следить, что он там выкинул а что нет.
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 04:16 pm
(Link)
блин, спросонок подумал. ёбаный «оптимизатор» же вправе заводить локалы, которых я не объявлял. я вот не помню, сделал ли он это, или просто охуел. но факт в том, что вся моя конструкция из говна и палок ОПАСНОСТЕ.

ну да ладно. кагбэ особо вариантов всё равно нет, мне один хуй надо иметь возможность такого разбиения.
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 04:19 pm
(Link)
p.s.: а может я просто в глаза ебался, пока героически поебждал гоцэцэ и всё себе придумал. но бля. это всё равно дело второстепенное.
From:(Anonymous)
Date:November 5th, 2023 - 11:33 am

только -pedantic, только хардкор

(Link)
кто стандарта не блюдет
тот мудак и хуй сосет
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 03:55 pm

Re: только -pedantic, только хардкор

(Link)
лучше
  миллиарды
      хуёв
         отсосать
чем
 ваш
   ебанутый
      стандарт
          соблюдать
From:(Anonymous)
Date:November 5th, 2023 - 04:59 pm

Re: только -pedantic, только хардкор

(Link)
сначала хотя бы пятьсот отсоси
и только тогда критикуй джи си си
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 05:09 pm

Re: только -pedantic, только хардкор

(Link)
не надо
     быть
      негром
         преклонных
               годов
не надо
    сосать
       вагоны
           хуёв
чтобы
   знать
     что в ANSI
           сидят
              пидорасы
и все их
    стандарты
        ебучие
            мимо
              кассы!
[User Picture]
From:[info]blackdoomer
Date:November 7th, 2023 - 09:01 am

Re: только -pedantic, только хардкор

(Link)
s/ANSI/ISO
From:(Anonymous)
Date:November 5th, 2023 - 03:58 pm
(Link)
Родина дала тебе стандарт - читай, блядь! Нет, говно жрёт.
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 03:58 pm
(Link)
моя родина — ссср!
[User Picture]
From:[info]blackdoomer
Date:November 5th, 2023 - 04:55 pm
(Link)
ГОСТ 28397-89
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 04:58 pm
(Link)
а ссср больше нет, поэтому госты всё. бога нет, сталина нет, ленина нет — стало быть, всё позволено!
[User Picture]
From:[info]ketmar
Date:November 5th, 2023 - 05:04 pm
(Link)
p.s.: я до последнего надеялся, что это был гост на навоз или что-то подобное.
From:(Anonymous)
Date:November 5th, 2023 - 05:42 pm
(Link)
"А кто это признал, что вы программист? Кто причислил вас к программистам?"
[User Picture]
From:[info]steinkrauz
Date:November 5th, 2023 - 07:19 pm
(Link)
"На, вот, возьми её скорей" (с)

ГОСТ 26030-83