Кресты / Говнокод #27621 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
struct Foo {
};

struct Bar {
    int x[0];
};

https://ideone.com/upuoOg

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

Запостил: bormand bormand, (Updated )

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

    • там была питушня вроде, что пустые классы не могут иметь размер 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
            Ответить
              • А 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
                                    Известное старьё.
                                    Ответить
                                  • >В «Borland C» ещё наверняка много чего не поддерживается.

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


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

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

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

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

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

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

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

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

                      Неужели ты не в курсе?
                      Ответить
                • Ещё, если владеешь 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

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


                                от инвоквирчуал ни файнал, ни прайват не спасают
                                Ответить
      • По стандарту можно ещё int x[] и C99 в настройках. Но кроме массива нужно ещё какое-нибудь поле. Благо оно обычно есть.
        Ответить
  • 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++".
    Ответить
        • Это какая-то шутка?

          Твой линк указывает на коммент, а в нем еще один линк, а в нем еще один.. я блядь пол часа убил
          Ответить
            • Я помню, как мы развлекались, отправляя такие ссылки от гуеста без возможности редактирования.
              Ответить
          • Я видел на сайтах ссылки для ловли ботов. Заходишь в корень сайта, а там в подвале неприметная ссылка на /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 .
              Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8