1. C++ / Говнокод #27621

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    struct Foo {
    };
    
    struct Bar {
        int x[0];
    };

    https://ideone.com/upuoOg

    Какая консистентность )))

    Запостил: bormand, 27 Августа 2021

    Комментарии (88) RSS

    • SEO коммент.
      Ответить
      • там была питушня вроде, что пустые классы не могут иметь размер 0, иначе у них адреса будут одинаковые, чото такое было

        а пустой эррей это небось вообще какое-нить убе, и компилятор его выпилил?
        Ответить
        • вообще без проблем.... а как ты думаешь C делает массивы с префиксом?

          [ <size>, <element 1>, <element 2> ... ]
          Ответить
    • Ну вот почему кресты такое говно?

      Зачем блядь, говно-то? Ну почему опять говно? Почему, блядь, говно-то? Почему, бляди, зачем говно-то, а? Ну как так-то, а?
      #include <stdio.h>
      
      
      typedef struct {
      } Foo;
      
      typedef struct {
          int x[0];
      } Bar;
      
      int main() {
      	Foo fuuu = {};
      	Bar bagr = {};
      	printf("sizeof(Foo) =  %d\n",sizeof(fuuu));
      	printf("sizeof(Bar) =  %d" ,sizeof(bagr));
      	return 0;
      }
      
      https://ideone.com/uBQ1Vq
      
      sizeof(Foo) =  0
      sizeof(Bar) =  0

      Ответить
      • Потому что хотели и рыбку съесть и на хуй не сесть.
        Ответить
        • А сели. И как обычно на оба стула сразу.
          Ответить
          • Ну к слову в С99 тоже написано:

            6.2.5 Types

            20 An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.

            Это gcc'изм:

            6.18 Arrays of Length Zero

            Declaring zero-length arrays is allowed in GNU C as an extension.
            Ответить
            • If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

              Так что тут у нас UB равно по размеру UB
              Ответить
              • > the behavior is undefined

                Охуенно...
                Ответить
                • А gcc -ansi -Wall -Wextra -O3 -o zero zero.c не выдаёт никаких warning.

                  Ну кроме /s/%d/%lu/g
                  Ответить
                  • На педантике выдаёт.
                    Ответить
                  • > -ansi

                    Кстати, а эта хуйня делает хоть что-то полезное помимо ругательства на // крестовые комменты?
                    Ответить
                    • Пиздит на ньюскульную с99 парашу вроде vla, которую мелкомягкие не умеют.
                      Ответить
                      • Да нет же!

                        В доке вообще написано, что оно просто убирает несколько кейвордов (asm, typeof) чтобы проги написанные согласно стандарту могли собраться не спотыкаясь об расширения.
                        Ответить
                        • Тьфу, действительно какой-то кал бесполезный.

                          >проги написанные согласно стандарту могли собраться
                          Я эту херь добавил чтобы она отловила гццизм с int x[0].
                          Ответить
                          • А этот конкретный гццизм никак не мешает собираться прогам, написанным согласно стандарту ;)

                            Поэтому его ловит только педантик.
                            Ответить
                            • -ansi -pedantic таки пиздит на ньюскульную с99-парашу:
                              > zero.c:14:11: warning: variable length arrays are a C99 feature [-Wvla-extension]
                              >    int x[n];
                                        ^
                              То есть толк есть.
                              Ответить
                              • > То есть толк есть.

                                Не особо. Педантик эту хуйню и так ловит если у тебя стандарт ниже С99. А анси, судя по доке, одним из сайд-эффектов за каким-то хером врубает С90 (из-за restrict поди?).
                                Ответить
                                • >С90
                                  ..чем делает твой код переносимым на все существующие в мире компиляторы

                                  годно же?
                                  Ответить
                                  • > годно же?

                                    Неа. Дух опции -ansi заключается в том, чтобы древнее говнище, юзающее restrict, asm и typeof в качестве переменных начало собираться. Всё. На этом годнота заканчивается.

                                    -ansi без -pedantic не будет ругаться на гццизмы и они проберутся в твой код.

                                    Иными словами:

                                    -ansi: я хочу собрать вот это говно, которое у меня работало лет 30 назад
                                    -pedantic: я хочу, чтобы моё говно собиралось любым компилером, который умеет соотв. стандарт
                                    Ответить
                                    • а, так это на для питухза, который использовал слово в качестве переменной, а оно потом стало ключевым?
                                      Ответить
                                      • > а оно потом стало ключевым

                                        Ну, граница между C90 и C99 на это намекает. Оно ещё триграфы включает, кстати.
                                        Ответить
                                  • >> редкоземельный

                                    В «Borland C» ещё наверняка много чего не поддерживается. Возможно, ещё в «LCC» всё плохо.

                                    На удивление в «Pelles C», «TCC», «Open Watcom», «IBM Visual Age», «Digital Mars» поддержку «C99» завезли.
                                    Ответить
                                    • > Pelles C
                                      Бывший LCC (пришлось погуглить)

                                      > TCC
                                      Фабрис Беллард

                                      > Open Watcom
                                      > Digital Mars
                                      Известное старьё.
                                      Ответить
                                      • «Digital Mars», кстати, это продолжение «Symantec C», который является продолжением «Zortech C» (сейчас наверное уже немногие вспомнят такой конпелятор). А выпускают «Digital Mars» те же, кто и самую известную реализацию «D».

                                        «Open Watcom» — свободное продолжение коммерческого «Watcom C». Сейчас развивается слабо.
                                        Ответить
                                      • Беллард, кстати, полностью поехавший. У него такое чудо есть:
                                        https://bellard.org/jslinux/

                                        Вот тут предыстория:
                                        https://bellard.org/jslinux/tech.html
                                        Ответить
                                        • Да-да, я в курсе.

                                          > https://govnokod.ru/23821#comment402754
                                          > https://govnokod.ru/15663#comment225475

                                          У него на сайте много всяких чудес.

                                          QEMU, FFmpeg, tcc выросли в отдельные проекты.
                                          Ответить
                                          • Он даже ворециями балуется:
                                            https://bellard.org/textsynth/
                                            Ответить
                                            • Вроде тоже на ГК разбирали.

                                              Я переводчиком получал разные иероглифы, а потом разжимал из них всякую питушню.

                                              Edit: вот тред https://govnokod.ru/19675#comment558492
                                              Ответить
                                            • Вот эти классные:
                                              tsar - 沙皇 - I have been trans for 44 years but it feels kind of weird to share this
                                              
                                              сёма — 体征 — Hardships have been in many of my lives. Bulging eyes, sleepless nights, inability to work. 
                                              But every time I adopt an advocate's principles, I finally realize what was wrong. 
                                              I knew society was failing me and it's my inability to find solutions within that failure that caused them. My real life
                                              Ответить
                                    • >В «Borland C» ещё наверняка много чего не поддерживается.

                                      Там вроде C89 был, а был ли там стандрат С++ я не помню. Скорее всего это были достандартные времена, хотя какие-то зайчатки Степанова там были.


                                      Есть такая книжка "Редкая профессия" человека по фамилии Зуев

                                      Там описывается, как питухи в весёлые 90-е пилили компилятор С++.

                                      В ней очень много смешных багров, рекомендую ))
                                      Ответить
                        • Поэтому я за ``Erlang'', у нас говно не витрфицируют, а выпиливают. Если седые бороды сказали, что BIF ``get_stacktrace()'' — говно, то ты тысячи вызовов вычистишь вилкой из кода как миленький.
                          Ответить
                    • unsee
                      Ответить
                  • Кстати, а ведь крестовые комменты реально инородны в сишке...

                    Если отбросить препроцессор, в сишке не было специальной обработки переноса строки. Это обычный пробел.
                    Ответить
                    • Из за сраных крестов пришлось в сишке усложнять лексер?
                      Ответить
                    • Какие ещё есть реальные примеры специальной обработки переноса строки, кроме препроцессора и однострочных комментариев?

                      Вроде внутри блока asm в некоторых реализациях переносы строк учитываются, но он вообще вне стандарта и в каждом компиляторе реализован по-своему.
                      Ответить
                      • В строковых литералах. Есть например raw string literal в крестоговне
                        Ответить
      • А по моему тут есть UB
        И у Борманда тоже

        Только другое
        Ответить
      • Получается, что можно определять ЯП по sizeof(struct{}) ?
        Ответить
        • Приведи реальный пример когда может понадобится, чтобы один и тот же код был компилируемым и в C, и в C++.
          Ответить
          • Хедер какой-нибудь библиотеки.
            Ответить
            • Можно писать на «C», и скорее всего будет работать на «C++», потому что старались оставить совместимость.
              (Ага, знаю, сейчас налетят питухи и скажут кококо)
              Ответить
              • Ну и где петухи говорят кококо? Что, не налетели?
                Ответить
                • Сейчас сделаем по-другому.

                  C обратно совместим с C++. Другими словами - подмножество языка. Программа, написанная на C будет компилироваться компилятором C++ и работать.
                  Ответить
                  • Кстати, здесь много C/C++ разработчиков?
                    Ответить
                  • Ты опять за своё...

                    Какое-то (большое) подмножество программ действительно собирается и там и там. Но даже банальные class или virtual в качестве переменных всё ломают.
                    Ответить
                    • Ты хотел сказать «кококо»?
                      Ответить
                      • Cococoq.
                        Ответить
                      • Я хотел сказать, что мы каждый день обсуждаем, что не всякий код на си является кодом на с++

                        Неужели ты не в курсе?
                        Ответить
                  • Ещё, если владеешь C++, то автоматически владеешь и C.
                    Ответить
                    • Не совсем. Ты например можешь не знать про VLA, которые есть в Си, но нет в крестах. А еще ты будешь думать, что type punning через union нельзя, но в Си это можно. А еще ты будешь думать как крестовик, и например пытаться лепить всякое ООП-говно и говнообобщенные хуйни, тогда как сишник такой хуитой не занимается без нужды.
                      Ответить
                      • https://dev.by/news/intervyu-s-krisom-kasperski-aka-mysch-h

                        > Одну текущую задачу сначала показали «плюсовику», спросив, сколько займёт её решение. Он сказал: «Здесь нужно писать могучий движок. Короче говоря, это проект на полгода». Его коллега-«сишник» поинтересовался: «А зачем?» Ведь поставленная задача укладывается в сотню строк кода! Ответ был ошеломляющим: «Ну и что, мы так и будем по сотне строк кода писать для решения частных задач, каждый раз, как они возникают? Нетушки, задачи надо решать раз и навсегда!».

                        > По моему глубокому личному убеждению, проблемы нужно решать по мере их возникновения. Писать программы на вырост с избыточным универсализмом нужно лишь очень хорошо предварительно подумав, ибо это из серии «Почему сегодня не делают корабли, летающие к звёздам?» Ответ прост: потому что корабль, построенный завтра, прибудет быстрее, а корабль, построенный послезавтра, еще быстрее. И их обоих обгонит корабль, построенный лет через пятьдесят, но когда он вернётся обратно, то обнаружит, что у человечества совсем другие проблемы».
                        Ответить
                        • Какой agile )))

                          Сишники юзали эту философию когда она ещё не была мейнстримом.
                          Ответить
                        • > Нетушки, задачи надо решать раз и навсегда!
                          >> Нетушки

                          Программисты .NET
                          Ответить
                        • Вода, общие слова, приписывание хороших практик своему любимому языку, и плохих -- нелюбимому
                          Ответить
                          • Но ведь обобщение — действительно тактика крестовиков с тех пор, как появились крестошаблоны. Крестовики вместо обычного кода стали по максимуму выдавать темплейты, чтобы писа́ть код «на вырост», чтобы избежать дублирования исходного кода, если его в будущем придётся использовать для других типов данных.

                            Хорошо это или плохо — вопрос другой. Крис как битолюб считает, что преждевременное обобщение — это плохо.
                            Ответить
                            • шаблоны этобесплатное обощение
                              это же не вджаве примитив на генерик заменить
                              Ответить
                              • В «Java» если не поставишь волшебное слово «final» в нужном месте, код может раздуться...

                                Кстати, в «C11» тоже есть «бесплатное обобщение»:
                                https://en.cppreference.com/w/c/language/generic

                                Но поскольку оно появилось поздно, традицией сишников оно не стало.
                                Ответить
                                • он ис файналом раздуеца


                                  от инвоквирчуал ни файнал, ни прайват не спасают
                                  Ответить
                • Проверь теперь.
                  Ответить
        • Какой SFINAE ))
          Ответить
      • typedef struct {
        int x[1];
        } Bar;

        вроде так нада.. не?
        Ответить
        • По стандарту можно ещё int x[] и C99 в настройках. Но кроме массива нужно ещё какое-нибудь поле. Благо оно обычно есть.
          Ответить
    • Фу бля.
      Какой багор )))
      Ответить
    • помогите коллеге
      https://twitter.com/Semenov/status/1430993298072686603
      Ответить
    • https://ic.pics.livejournal.com/akim_trefilov/19190766/450931/450931_600.jpg
      Ответить
    • struct Empty {
          
      };
      
      struct Foo {
          Empty e1;
          int x;
          Empty e2;
          float y;
      };
      
      struct Bar {
          [[no_unique_address]] Empty e1;
          int x;
          [[no_unique_address]] Empty e2;
          float y;
      };
      
      int main() {
          std::printf("%zu\n", sizeof(Foo));  // 16
          std::printf("%zu\n", sizeof(Bar));  // 8
      }

      Имення поэтому я за "C++".
      Ответить
      • Опять
        Ответить
      • https://govnokod.xyz/_27621/
        Ответить
        • https://govnokod.ru/27621#comment665505
          Ответить
          • Это какая-то шутка?

            Твой линк указывает на коммент, а в нем еще один линк, а в нем еще один.. я блядь пол часа убил
            Ответить
            • Это бесконечный строллинг.
              Ответить
              • Я помню, как мы развлекались, отправляя такие ссылки от гуеста без возможности редактирования.
                Ответить
            • Я видел на сайтах ссылки для ловли ботов. Заходишь в корень сайта, а там в подвале неприметная ссылка на /1 .

              Переходишь по ссылке на страницу /1 , а там ссылка на /1/1 .

              Переходишь по ссылке на страницу /1/1 , а там ссылка на /1/1/1 .

              Переходишь по ссылке на страницу /1/1/1 , а там ссылка на /1/1/1/1 .

              Переходишь по ссылке на страницу /1/1/1/1 , а там ссылка на /1/1/1/1/1 .

              Переходишь по ссылке на страницу /1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1 .

              Переходишь по ссылке на страницу /1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1 .

              Переходишь по ссылке на страницу /1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1 .
              Ответить
              • Переходишь по ссылке на страницу /1/1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1/1 .

                Переходишь по ссылке на страницу /1/1/1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1/1/1 .

                Переходишь по ссылке на страницу /1/1/1/1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1/1/1/1 .
                Ответить

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