6

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

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // https://godbolt.org/z/PPAWM0
    #include <embed>
    #include <cstdint>
    
    constexpr std::uint64_t val_64_const = 0xcbf29ce484222325u;
    constexpr std::uint64_t prime_64_const = 0x100000001b3u;
    
    inline constexpr std::uint64_t
    hash_64_fnv1a_const(const char* const ptr, std::size_t ptr_size, const std::uint64_t value = val_64_const) noexcept {
    	return (ptr_size == 1) 
    		? value : 
    		hash_64_fnv1a_const(&ptr[1],
    			ptr_size - 1, 
    			(value ^ static_cast<std::uint64_t>(static_cast<char>(*ptr))) * prime_64_const);
    }
    
    int main () {
    	constexpr std::span<const char> art_data  = std::embed("/dev/urandom", 32);
    	constexpr std::uint64_t actual = hash_64_fnv1a_const(art_data.data(), art_data.size());
    
    	return static_cast<int>(actual);
    }

    Очередная дрисня http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1040r0.html в крестоговне, теперь можно через std::embed прочитать какое-то говно и даже в constexpr с ним что-то делать, например считать хеш-сумму. Можно constexpr-компилятор сделать, который бы читал код через std::embed и через constexpr хуиту его обрабатывал и компилировал. Скажите им еще про миксины из D

    j123123, 10 Ноября 2019

    Комментарии (95)
  2. Си / Говнокод #26006

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    // https://gcc.gnu.org/onlinedocs/cpp/Directives-Within-Macro-Arguments.html
    
    // Occasionally it is convenient to use preprocessor directives within the arguments
    // of a macro. The C and C++ standards declare that behavior in these cases is
    // undefined. GNU CPP processes arbitrary directives within macro arguments in
    // exactly the same way as it would have processed the directive were the
    // function-like macro invocation not present. 
    
    // If, within a macro invocation, that macro is redefined, then the new definition
    // takes effect in time for argument pre-expansion, but the original definition is
    // still used for argument replacement. Here is a pathological example:
    
    #define f(x) x x
    f (1
    #undef f
    #define f 2
    f)
    
    // which expands to
    
    // 1 2 1 2

    Ну и хуйня.

    j123123, 31 Октября 2019

    Комментарии (6)
  3. Куча / Говнокод #25999

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    https://habr.com/ru/post/472970/
    
    Критика протокола и оргподходов Telegram. Часть 1, техническая: опыт написания клиента с нуля
    
    в Full самая наркомания, с точки зрения сетевика: длина,
    sequence number, причем НЕ ТОТ, что в основном MTProto,
    тело, CRC32. Да, всё это поверх TCP. Который предоставляет
    нам надежный транспорт в виде последовательного потока байт,
    никакие последовательности не нужны, тем более контрольные
    суммы. Окей, мне сейчас возразят, что в TCP 16-битная
    контрольная сумма, так что искажение данных случается.
    Отлично, только у нас вообще-то криптографический протокол
    с хэшами длиннее 16 байт, все эти ошибки — и даже
    более — будут отловлены на несовпадении SHA уровнем выше.
    Никакого смысла в CRC32 поверх этого — НЕТ.

    Ебать дебилы

    j123123, 27 Октября 2019

    Комментарии (231)
  4. Си / Говнокод #25997

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // https://godbolt.org/z/dMT7v3
    
    unsigned div_eq(unsigned a, unsigned b)
    {
      ALWAYS_TRUE(a == b);
      return a/b;
    }
    
    unsigned div(unsigned a, unsigned b)
    {
      return a/b;
    }
    
    
    int test_array(unsigned char a[10])
    {
      for (int i = 1; i < 10; i++)
      {
        ALWAYS_TRUE(a[i-1] <= a[i]);
      }
      return a[0] <= a[2];
    }

    Refinement type
    Можно этой хуйней ассерты позаменять попробовать, и компилятор возможно что-то сможет за счет этого соптимизировать

    j123123, 26 Октября 2019

    Комментарии (6)
  5. C++ / Говнокод #25982

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    #include <cstdio>
    
    class tag;
    
    template<class>
    struct type { friend constexpr auto get(type); };
    
    template<class TKey, class TValue>
    struct set { friend constexpr auto get(TKey) { return TValue{}; } };
    
    void foo() {            // never called
      if constexpr(false) { // never true
        if (false) {        // never true
            constexpr auto call = [](auto value) { std::printf("called %d", value); };
            void(set<type<tag>, decltype(call)>{});
        }
      }
    }
    
    int main() {
      get(type<tag>{})(42); // prints called 42
    }

    https://twitter.com/krisjusiak/status/1186363017329594368
    Какой C++20 )))

    j123123, 21 Октября 2019

    Комментарии (68)
  6. Си / Говнокод #25929

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    // https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/
    // The C code I used for those original MCU tests looked something like this:
    
    volatile int16_t in[25];
    volatile int16_t out[25];
    const int16_t a0 = 16384;
    const int16_t a1 = -32768;
    const int16_t a2 = 16384;
    const int16_t b1 = -25576;
    const int16_t b2 = 10508;
    int16_t z1, z2;
    int16_t outTemp;
    int16_t inTemp;
    void main()
    {
      while(1) {
        _pa = 2;
        for(i=0;i<25;i++)
        {
          inTemp = in[i];
          outTemp = inTemp * a0 + z1;
          z1 = inTemp * a1 + z2 - b1 * outTemp;
          z2 = inTemp * a2 - b2 * outTemp;
          out[i] = outTemp;
        }
        _pa = 0;
      }
    }
    
    // The Padauk code looks like this:
    
    WORD in[11];
    WORD out[11];
    WORD z1, z2;
    WORD pOut, pIn; // these are pointers, but aren't typed as such
    int i;
    void  FPPA0 (void)
    {
      .ADJUST_IC  SYSCLK=IHRC/2    //  SYSCLK=IHRC/2
      PAC.6 = 1; // make PA6 an output
      while(1) {
        PA.6 = 1;
        pOut = out;
        pIn = in;
        i = 0;
        do {
          *pOut = (*pIn << 14) + z1;
          z1 = -(*pIn << 15) + z2
            + (*pOut << 14)
            + (*pOut << 13)
            + (*pOut << 9)
            + (*pOut << 8)
            + (*pOut << 7)
            + (*pOut << 6)
            + (*pOut << 5)
            + (*pOut << 3);
          z2 = (*pIn << 14)
            - (*pOut << 13)
            - (*pOut << 11)
            - (*pOut << 8)
            - (*pOut << 3)
            - (*pOut << 2);
          i++;
          pOut++;
          pIn++;
        } while(i < 11);
        PA.6 = 0;
      }
    }

    > As for the filter function itself, you’ll see that all the multiplies have been replaced with shift-adds. The Padauk part does not recognize the * operator for multiplication; trying to use it to multiply two variables together results in a syntax error. No, I’m not joking.

    j123123, 11 Октября 2019

    Комментарии (58)
  7. C++ / Говнокод #25901

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    // https://habr.com/ru/company/jugru/blog/469465/
    // Инициализация в современном C++ 
    // ...
    //Есть примеры ещё более странного поведения этого синтаксиса:
    
    std::string s(48, 'a'); // "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    std::string s{48, 'a'}; // "0a"

    > В первой строке создаётся строка из 48 символов «а», а во второй строка «0а». Это происходит потому, что конструктор string принимает на вход initializer_list из символов. 48 является целочисленным значением, поэтому оно преобразуется в символ. В ASCII число 48 — код символа «0». Это очень странно, потому что есть конструктор, принимающий именно такие аргументы, int и char. Но вместо вызова этого конструктора происходит совершенно неочевидное преобразование. В итоге получается код, который чаще всего ведёт себя не так, как мы ожидаем.

    КАК? Как можно было столько хуйни наворотить для такой простой вещи, как инициализация переменной? Чем они вообще думают?

    Не перестаю удивляться долбоебизму крестостандартизаторов

    j123123, 05 Октября 2019

    Комментарии (22)
  8. Си / Говнокод #25899

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    #include <ncurses.h>
    
    #if defined(_WIN32) || defined(_WIN64) 
        #include <windows.h>
        #define msleep(msec) Sleep(msec)
    #else
        #include <unistd.h>
        #define msleep(msec) usleep(msec*1000)
    #endif
    
    int main()
    {
        initscr();
    
        char str[100];
        addstr("Enter string: ");
        getstr(str); //Считваем строку
        curs_set(0); //"Убиваем" курсор, чтобы не мешался
        while ( true )
        {
        //Перемещаем х-координату как можно дальше вправо, и будем уменьшать её, пока она != 0
            for ( unsigned x = getmaxx(stdscr); x; x-- ) 
            {
                clear();
                mvaddstr(getmaxy(stdscr) / 2, x, str);
                refresh();
                msleep(200);
            }
        }
    
        endwin();
        return 0;
    }

    https://code-live.ru/post/ncurses-input-output/#getstr-
    Сколько хуйни вы можете найти в этом примере?

    j123123, 04 Октября 2019

    Комментарии (96)
  9. Assembler / Говнокод #25867

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    #include <stdbool.h>
    
    bool impl(bool a, bool b) // ->
    {
        return (!a || b);
    }
    
    bool always_true(bool a, bool b)
    {
        return (impl(a,b) == impl(b,a)) == (a == b); // ( (a -> b) = (b -> a) ) = (a = b) tautology
    }
    
    /*
    GCC не хочет мне тавтологию оптимизировать!
    https://godbolt.org/z/kgFMpR
    always_true:
            movl    %esi, %eax
            xorl    %edi, %eax
            cmpb    %dil, %sil
            sete    %dl
            xorl    %edx, %eax
            ret
    Но Clang может
    https://godbolt.org/z/YcOat-
    always_true:                            # @always_true
            movb    $1, %al
            retq
    */

    ГОВНО!

    j123123, 24 Сентября 2019

    Комментарии (46)
  10. C++ / Говнокод #25855

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    // https://www.opennet.ru/opennews/art.shtml?num=51508
    // Microsoft открыл код стандартной библиотеки С++, поставляемой в Visual Studio 
    
    // https://github.com/microsoft/STL/blob/7f65140761947af4ed7f9dfc11adee8c86c9e4c2/stl/inc/unordered_map#L712
    
    #if _HAS_CXX17
    template <class _Iter, class _Hasher = hash<_Guide_key_t<_Iter>>, class _Keyeq = equal_to<_Guide_key_t<_Iter>>,
        class _Alloc = allocator<_Guide_pair_t<_Iter>>,
        enable_if_t<
            conjunction_v<_Is_iterator<_Iter>, _Is_hasher<_Hasher>, negation<_Is_allocator<_Keyeq>>, _Is_allocator<_Alloc>>,
            int> = 0>
    unordered_map(_Iter, _Iter, _Guide_size_type_t<_Alloc> = 0, _Hasher = _Hasher(), _Keyeq = _Keyeq(), _Alloc = _Alloc())
        ->unordered_map<_Guide_key_t<_Iter>, _Guide_val_t<_Iter>, _Hasher, _Keyeq, _Alloc>;
    
    template <class _Kty, class _Ty, class _Hasher = hash<_Kty>, class _Keyeq = equal_to<_Kty>,
        class _Alloc = allocator<pair<const _Kty, _Ty>>,
        enable_if_t<conjunction_v<_Is_hasher<_Hasher>, negation<_Is_allocator<_Keyeq>>, _Is_allocator<_Alloc>>, int> = 0>
    unordered_map(initializer_list<pair<_Kty, _Ty>>, _Guide_size_type_t<_Alloc> = 0, _Hasher = _Hasher(), _Keyeq = _Keyeq(),
        _Alloc = _Alloc())
        ->unordered_map<_Kty, _Ty, _Hasher, _Keyeq, _Alloc>;
    
    template <class _Iter, class _Alloc, enable_if_t<conjunction_v<_Is_iterator<_Iter>, _Is_allocator<_Alloc>>, int> = 0>
    unordered_map(_Iter, _Iter, _Alloc)
        ->unordered_map<_Guide_key_t<_Iter>, _Guide_val_t<_Iter>, hash<_Guide_key_t<_Iter>>, equal_to<_Guide_key_t<_Iter>>,
            _Alloc>;
    
    template <class _Iter, class _Alloc, enable_if_t<conjunction_v<_Is_iterator<_Iter>, _Is_allocator<_Alloc>>, int> = 0>
    unordered_map(_Iter, _Iter, _Guide_size_type_t<_Alloc>, _Alloc)
        ->unordered_map<_Guide_key_t<_Iter>, _Guide_val_t<_Iter>, hash<_Guide_key_t<_Iter>>, equal_to<_Guide_key_t<_Iter>>,
            _Alloc>;
    
    template <class _Iter, class _Hasher, class _Alloc,
        enable_if_t<conjunction_v<_Is_iterator<_Iter>, _Is_hasher<_Hasher>, _Is_allocator<_Alloc>>, int> = 0>
    unordered_map(_Iter, _Iter, _Guide_size_type_t<_Alloc>, _Hasher, _Alloc)
        ->unordered_map<_Guide_key_t<_Iter>, _Guide_val_t<_Iter>, _Hasher, equal_to<_Guide_key_t<_Iter>>, _Alloc>;
    
    template <class _Kty, class _Ty, class _Alloc, enable_if_t<_Is_allocator<_Alloc>::value, int> = 0>
    unordered_map(initializer_list<pair<_Kty, _Ty>>, _Alloc)->unordered_map<_Kty, _Ty, hash<_Kty>, equal_to<_Kty>, _Alloc>;
    
    template <class _Kty, class _Ty, class _Alloc, enable_if_t<_Is_allocator<_Alloc>::value, int> = 0>
    unordered_map(initializer_list<pair<_Kty, _Ty>>, _Guide_size_type_t<_Alloc>, _Alloc)
        ->unordered_map<_Kty, _Ty, hash<_Kty>, equal_to<_Kty>, _Alloc>;
    
    template <class _Kty, class _Ty, class _Hasher, class _Alloc,
        enable_if_t<conjunction_v<_Is_hasher<_Hasher>, _Is_allocator<_Alloc>>, int> = 0>
    unordered_map(initializer_list<pair<_Kty, _Ty>>, _Guide_size_type_t<_Alloc>, _Hasher, _Alloc)
        ->unordered_map<_Kty, _Ty, _Hasher, equal_to<_Kty>, _Alloc>;
    #endif // _HAS_CXX17

    Ну и хуйня! Впрочем, разве могло быть иначе?

    j123123, 18 Сентября 2019

    Комментарии (174)
  1. C++ / Говнокод #25842

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    // https://habr.com/ru/post/466985/
    
    // о каррировании в крестоговне
    
    // По сути это каррирующее говно просто складывает куда-то хуйню, а потом целиком ее в функцию призывает.
    // Ну т.е. на Си можно написать дрисню вида
    
    int shit(int a, int b, int c, int d)
    {
      return a*(b+c*d);
    }
    
    // И вот каррирование такой дрисни это как если б я сделал структуру
    struct shit_arguments
    {
       int a;
       int b;
       int c;
       int d;
    };
    
    // И потом бы с конца заполнял это говно
    struct shit_arguments;
    shit_arguments.d = 13;
    shit_arguments.c = 666;
    shit_arguments.b = 1488;
    shit_arguments.a = 42;
    // и при полном заполнении этого говна просто б вызвал функцию
    // подставив туда накопившееся говно
    int somecrap = shit(shit_arguments.a, shit_arguments.b, shit_arguments.c, shit_arguments.d);
    
    // именно так эта крестовая дрисня и работает, она не может произвести частичное вычисление
    // не может сделать функцию с частично вычисленной дрисней в ней на основе частично переданной хуйни
    
    // если я например в функцию shit захочу частично подставить аргументы b,c,d как 1,2,3 то у меня не получится функции вида
    int shit_b1_c2_d3(int a)
    {
      return a*(7); // 1+2*3 = 7
    }
    // Нихуя подобного не будет. А если нихуя подобного нет, нахуй это бесполезное дерьмо вообще надо?
    // В крестах никак нельзя на основе каких-то готовых функций сгенерить
    // видоизмененные функции с частично сделанными вычислениями
    // Никакой нормальной рефлексии нет, просто какие-то тупые кривые костыли к сишечке налепили
    // И это программисты?

    j123123, 15 Сентября 2019

    Комментарии (69)
  2. Куча / Говнокод #25841

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    (set-logic LIA)
    ;(set-option :produce-proofs true)
    
    (define-fun-rec add_via_add1 ((a Int) (b Int)) Int
      (ite (= b 0) a                                ; if (b == 0) return a 
        (ite (< b 0) (- (add_via_add1 (- a) (- b))) ; if (b < 0) return add_via_add(-a,-b)
          (+ (add_via_add1 a (- b 1)) 1)            ; return add_via_add(a, b-1) + 1;
        )
      )
    )
    
    
    (assert
      (not (forall ((a Int) (b Int))
        (= (add_via_add1 a b) (+ a b))
      ))
    )
    
    (check-sat)
    (get-model)
    (exit)

    Хуйня, которую SMT солверы Z3 и CVC4 доказать не могут. Надо переходить на Coq, Metamath, LEAN, Mizar или еще какую-то такую хуйню

    j123123, 15 Сентября 2019

    Комментарии (9)
  3. Си / Говнокод #25602

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // вообще, есть одна говнистая особенность сишки:
    // нельзя вернуть из функции массив хуйпойми какой длины, выделив память чисто на стеке
    // Вот например:
    
    char *a_ret (size_t len)
    {
      char *ret = alloca(len);
      memset(ret, 'a', len);
      return ret; // так нельзя
    }
    
    // т.е. надо делать как-нибудь вот так
    char *a_ret (size_t len)
    {
      char *ret = malloc(len);
      if (ret == NULL)
      {
        exit(ENOMEM);
      }
      memset(ret, 'a', len);
      return ret;
    }

    Но это ж на самом-то деле говно какое-то. Дергать аллокаторы какие-то, ради каких-то мелких кусков байтиков.
    Почему не сделать хуйни, чтоб вызываемая функция как бы приосталавливалась и просила ту функцию, которая ее вызывает, чтоб она вот такой-то alloca() сделала нужного размера в своем стекфрейме, а потом туда вот та вызванная функция байтики уже вхерачивала? Ну т.е. можно сделать отдельный свой стек для локальных переменных тех функций, которые должны уметь такую хуйню делать (т.е. просить вызвавшую их функцию "а сделай ка там себе alloca(123) и дай мне указатель, а я в него насру")
    Вообще хуйня какая-то, сишка слишком сильно сковывает всякой своей хуйней, соглашениями вызовов, всякими ABI там. То ли дело ассемблер!

    j123123, 15 Мая 2019

    Комментарии (90)
  4. Куча / Говнокод #25578

    +1

    1. 1
    2. 2
    3. 3
    https://tass.ru/nacionalnye-proekty/6391295
    
    Томские ученые разработали первое в России программное обеспечение, независимое от Windows

    ШОК! Томские ученые открыли способ создавать программное обеспечение, независимое от Windows. Нужно всего лишь…

    j123123, 30 Апреля 2019

    Комментарии (44)
  5. C++ / Говнокод #25577

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    // https://github.com/QWalk/mainline/blob/b12ea3652226caef23c2f5fc7b168746c89096f2/src/system/Pseudopotential_so.cpp#L36
    
    doublevar legendre_so(doublevar x, int n)
    {
      switch(n)
      {
      case 0:
        return 1;
      case 1:
        return x;
      case 2:
        return .5*(3*x*x-1);
      case 3:
        return .5*(5*x*x*x - 3*x);
      case 4:
        return 0.125*(35*x*x*x*x -30*x*x +3);
      case 5:
        return 0.125*(63*x*x*x*x*x - 70*x*x*x + 15*x);
      default:
        error("Do not have legendre polynomial of order ", n);
        return 0; //shouldn't get here, but gets rid of a compiler message
      }
    }

    Вот нет чтоб через шаблоноговно нагенерировать эти свои многочлены Лагранжа.

    https://en.wikipedia.org/wiki/Legendre_polynomials#Rodrigues'_formula_and_other_explicit_formulas

    Интересно, сколько строк шаблоноговна на это придется потратить?
    И вообще, надо чтоб гомоиконность!

    j123123, 29 Апреля 2019

    Комментарии (32)
  6. C++ / Говнокод #25564

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    #include <iostream>
    #include <string>
    #include <string_view>
    
    int main() {
      std::string s = "Hellooooooooooooooo ";
      std::string_view sv = s + "World\n";
      std::cout << sv;
    }

    https://alexgaynor.net/2019/apr/21/modern-c++-wont-save-us/
    What's happening here is that s + "World\n" allocates a new std::string, and then is converted to a std::string_view. At this point the temporary std::string is freed, but sv still points at the memory that used to be owned by it. Any future use of sv is a use-after-free vulnerability. Oops! C++ lacks the facilities for the compiler to be aware that sv captures a reference to something where the reference lives longer than the referent. The same issue impacts std::span, also an extremely modern C++ type.

    j123123, 24 Апреля 2019

    Комментарии (83)
  7. C++ / Говнокод #25562

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    // https://github.com/WebKit/webkit/blob/e0e7e8f907f4c01c723374e8230a63d46e89e6a0/Source/WebCore/platform/graphics/filters/FEComposite.cpp#L98
    
    static unsigned char clampByte(int c)
    {
        unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
        unsigned uc = static_cast<unsigned>(c);
        return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
    }

    j123123, 22 Апреля 2019

    Комментарии (23)
  8. C++ / Говнокод #25558

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    https://habr.com/ru/article/448466/
    
    */
    А последние пару лет набирает популярность boost.hana. Это boost.fusion,
    но с constexpr'ом и лямбдами. Автор hana, Луис Дионе (Louis Dionne),
    используя на полную мощь все возможности новых стандартов, в некотором
    смысле очеловечил метапрограммирование. С помощью hana всяческие
    манипуляции с типами, их кортежами, отображениями, а также компайл- и
    рантайм-работа с ними обрели практически человеческое лицо и читаемый
    вид. Ну, с поправкой на синтаксис C++, разумеется. Вот, например, как выглядит
    универсальный сериализатор структур, написанный с помощью hana:
    */
    
    // 1. Give introspection capabilities to 'Person'
    struct Person {
      BOOST_HANA_DEFINE_STRUCT(Person,
        (std::string, name),
        (int, age)
      );
    };
    // 2. Write a generic serializer (bear with std::ostream for the example)
    auto serialize = [](std::ostream& os, auto const& object) {
      hana::for_each(hana::members(object), [&](auto member) {
        os << member << std::endl;
      });
    };
    // 3. Use it
    Person john{"John", 30};
    serialize(std::cout, john);
    
    /*
    Ну да, структуры приходится описывать особым образом. А кому сейчас легко?
    И тут хочется также отметить библиотеку tinyrefl за авторством Manu Sánchez
    (Мануэля Санчеса). Довольно неплохая попытка принести в мир C++-разработки
    статическую рефлексию без расширения компилятора. Для своей работы библиотека
    требует стороннюю утилиту (cppast), но зато предоставляет довольно удобный доступ
    к информации о структурах, которую можно использовать в процессе разработки
    программы. Преимущество этой библиотеки (по сравнению с другими) в том, что для
    работы с ней не надо использовать «птичий язык», а элементы структур (как и сами
    структуры) можно произвольным образом атрибутировать прямо в исходном коде:
    */
    
    struct [[serializable]] Person {
        std::string name;
        int age;
    };
    template<typename Class>
    auto serialize(std::ostream& os, Class&& object) -> std::enable_if_t<
            tinyrefl::has_metadata<std::decay_t<Class>>() &&
            tinyrefl::has_attribute<std::decay_t<Class>>("interesting"),
        std::ostream&>
    {
        tinyrefl::visit_member_variables(object, [&os](const auto& /* name */, const auto& var) {
            os << var << std::endl;
        });
        return equal;
    }
    
    /*
    Таких примеров можно привести ещё много (или найти на гитхабе или гитлабе).
    Объединяет все эти библиотеки и инструменты одна особенность: значительно
    облегчая жизнь своим пользователям, они имеют такую реализацию, что остаётся
    лишь предполагать, какое количество страданий испытали их разработчики. Достаточно
    заглянуть в реализацию, увидеть забор из ifdef'ов и угловых скобок — и всё понятно.
    Нередко эти реализации делаются на грани возможностей компиляторов. workaround'ы
    банальных ошибок (или особенностей реализации языка конкретной версии конкретного
    компилятора с конкретными флагами) здорово раздувают их код. Желание поддерживать
    несколько стандартов сразу заставляет придумывать зубодробильные конструкции.
    Безусловно, простая попытка реализовать что-нибудь подобное здорово поднимает уровень
    владения языком (иногда — и самооценку). Но в какой-то момент, после многочасовой возни
    с очередной ошибкой, или непроходящим тестом, или крэшем компилятора руки опускаются,
    хочется плюнуть и бросить, ибо силы бороться иссякают.
    */

    Именно поэтому я за гомоиконность

    j123123, 21 Апреля 2019

    Комментарии (50)
  9. Си / Говнокод #25539

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    
    int main(void)
    {
      uint32_t a = 24804541;
      for(size_t i = 0; i < 5; i++)
      {
        for(size_t j = 0; j < 5; j++)
        {
          putchar( "01"[(a >> (i*5 + j)) & 1]);
        }
        putchar('\n');
      }
      return EXIT_SUCCESS;
    }

    https://ru.wikipedia.org/wiki/Параграф_86а_Уголовного_кодекса_Германии

    > В 1998 году суд Франкфурта-на-Майне своим решением запретил распространение компьютерных игр, в которых содержится какая-либо нацистская символика — прецедентом стала игра Wolfenstein 3D. Немецкие локализаторы вынуждены были заменять в играх нацистскую символику на другие символы, не попадающие под нарушение параграфа 86а Уголовного кодекса Германии.

    Предлагаю запретить число 24804541.

    j123123, 13 Апреля 2019

    Комментарии (37)
  10. Си / Говнокод #25526

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    #include <stdio.h>
    #include <stdlib.h>
    
    void myfree(void *ptr)
    {
      printf("%p\n", *(void **)ptr);
      free(*(void **)ptr);
      printf("freed!\n");
    }
    
    int main(void) {
      char *x __attribute__ (( cleanup (myfree)  )) = malloc(1);
      printf("%p\n", x);
      return 0;
    }

    https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html

    cleanup (cleanup_function)

    The cleanup attribute runs a function when the variable goes out of scope. This attribute can only be applied to auto function scope variables; it may not be applied to parameters or variables with static storage duration. The function must take one parameter, a pointer to a type compatible with the variable. The return value of the function (if any) is ignored.

    If -fexceptions is enabled, then cleanup_function is run during the stack unwinding that happens during the processing of the exception. Note that the cleanup attribute does not allow the exception to be caught, only to perform an action. It is undefined what happens if cleanup_function does not return normally.

    j123123, 09 Апреля 2019

    Комментарии (28)

 

  1. Assembler / Говнокод #25491

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    Решил я значит от нехуй делать нарисовать свой пиксельный шрифт
    (кому интересно - вот промежуточный результат https://i.imgur.com/2vIJoio.png)
    и решил посмотреть, какие там вообще бывают под GNU/Linux редакторы для
    шрифтов, и какие вообще шрифты бывают
    Так вот, нашел я вот такую хрень http://mensis.sourceforge.net/overview.html
    Вижу, что там какой-то ассемблер http://mensis.sourceforge.net/ttfcv-all.png или
    байткод ебаный. Погуглил по этим говноинструкциям со скриншота:
    Оказывается в TTF шрифтах есть встроенный тьюринг-полный ЯП, используемый
    для всяких там подсказок, типа "куда дорисовать пиксель вот при таком-то условии"
    и прочая подобная херота
    А еще в шиндошс (до Windows 10) этот шрифтоговнобайткод интерпретировался в
    пространстве ядра (ну тупыыые..) и разумеется таким образом удалось винду хакнуть
    https://security.stackexchange.com/a/91395 (разве могло быть иначе?)
    
    про шрифтоговнобайткод можно почитать например тут
    https://docs.microsoft.com/en-us/typography/opentype/spec/tt_instructions
    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#instructions
    
    На кой вообще хер делать тьюринг-полный язык для отрисовки глифов? Ну и раз вы его уже
    делаете, то заебошьте там что-нибудь на основе LLVM байткода, чтоб JIT, или вообще все глифы
    сразу компилировать в натив, или даже (чего мелочиться) под GPU. Типа мы хотим
    нарисовать какую-то букву с размером 10 - вызываем функцию
    drawA(10, bufptr, x, y); - рисуется десятого размера буква в буфер. И никаких непонятных
    говнобайткодов. Четко и дерзко!

    j123123, 01 Апреля 2019

    Комментарии (30)
  2. C++ / Говнокод #25466

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    #include <inttypes.h>
    
    auto a(auto b) __attribute__ ((noinline));
    
    auto a(auto b)
    {
        return b*1.5;
    }
    
    double test1(double in)
    {
      return a(in);
    }
    
    uint64_t test2(uint64_t in)
    {
      return a(in);
    }
    
    
    /*
    https://godbolt.org/z/6ZQAnv
    
    auto a<double>(double):
            mulsd   xmm0, QWORD PTR .LC0[rip]
            ret
    test1(double):
            jmp     auto a<double>(double)
    auto a<unsigned long>(unsigned long):
            test    rdi, rdi
            js      .L5
            pxor    xmm0, xmm0
            cvtsi2sd        xmm0, rdi
            mulsd   xmm0, QWORD PTR .LC0[rip] # хули ты мне плавучего питуха в xmm0 возвращаешь?
            ret
    .L5:
            mov     rax, rdi
            and     edi, 1
            pxor    xmm0, xmm0
            shr     rax
            or      rax, rdi
            cvtsi2sd        xmm0, rax
            addsd   xmm0, xmm0
            mulsd   xmm0, QWORD PTR .LC0[rip]
            ret
    test2(unsigned long):
            sub     rsp, 8
            call    auto a<unsigned long>(unsigned long)
            movsd   xmm1, QWORD PTR .LC1[rip]
            comisd  xmm0, xmm1
            jnb     .L8
            cvttsd2si       rax, xmm0 # ну нахуй тут надо double в uint64_t конвертить
            add     rsp, 8 # почему это не делается в auto a<unsigned long>(unsigned long)
            ret
    .L8:
            subsd   xmm0, xmm1
            add     rsp, 8
            cvttsd2si       rax, xmm0
            btc     rax, 63
            ret
    .LC0:
            .long   0
            .long   1073217536
    .LC1:
            .long   0
            .long   1138753536
    
    */

    концепты-хуепты

    j123123, 23 Марта 2019

    Комментарии (28)
  3. Си / Говнокод #25456

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    /*
    https://habr.com/ru/company/jugru/blog/444212/
    
    Александр: Я не думаю, что существует какое-то одно «правильное» определение ФП,
    но если говорить лично обо мне, то ФП — это нечто с функциональной композицией и
    функциями первого класса.
    
    Иван: Я согласен, но добавил бы ещё функции высшего порядка — те, которые могут
    принимать другие функции в качестве аргументов и возвращать как результат.
    
    Cергей: Ссылка на функцию в Си — считается?
    
    Иван: Нет, Си не является функциональным языком программирования :-)
    
    Сергей: Расскажи, почему?
    
    Иван: Потому что нельзя из комбинации указателей на функции создать новую функцию,
    можно только указывать на уже существующие. Конечно, если в ход не пошли какие-то
    ассемблерные хаки.
    */
    
    
    #include <stdio.h>
    #include <inttypes.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <errno.h>
    
    #define FUNC(a, ...) typeof( a (*) (__VA_ARGS__) )
    
    uint64_t mul2(uint64_t a)
    {
      return a*2;
    }
    
    uint64_t add2(uint64_t a)
    {
      return a+2;
    }
    
    uint64_t chaincaller(uint64_t a, typeof(uint64_t (*)(uint64_t)) *chain)
    {
      while(*chain != NULL)
      {
        a = (*chain)(a);
        chain++;
      }
      return a;
    }
    
    FUNC(uint64_t, uint64_t) *combine_fn (FUNC(uint64_t, uint64_t) a, FUNC(uint64_t, uint64_t) b)
    {
      FUNC(uint64_t, uint64_t) *funchain = (FUNC(uint64_t, uint64_t) *)malloc(sizeof( FUNC(uint64_t, uint64_t) [3]) );
      if (funchain == NULL)
      {
        exit(ENOMEM);
      }
      funchain[0] = a;
      funchain[1] = b;
      funchain[2] = NULL;
      return funchain;
    }
    
    
    int main(void)
    {
      FUNC(uint64_t, uint64_t) *func_chain = combine_fn(mul2,add2);
      uint64_t a = 15;
      uint64_t b = chaincaller(a, func_chain);
      printf("%" PRIu64 " * 2 + 2 = %" PRIu64 "\n", a,b);
      free(func_chain);
      return 0;
    }

    Ассемблерные хуяки.
    https://wandbox.org/permlink/gdRggB77GQOiNzyJ
    Он так говорит, будто б в крестоговно впилили какой-то недоJIT, который честно может сгенерить одну функцию из двух.

    j123123, 19 Марта 2019

    Комментарии (47)
  4. Си / Говнокод #25449

    0

    1. 1
    #define BSWAP16(x) ( (uint16_t)(((uint32_t)x)*(1 | 1 << 16) >> 8) )

    j123123, 15 Марта 2019

    Комментарии (141)
  5. JavaScript / Говнокод #25446

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    // http://pacipfs2.antizapret.prostovpn.org/proxy-ssl.js
    
    function FindProxyForURL(url, host) {
      if (d_ipaddr.length < 10) return "DIRECT"; // list is broken
    
      if (!az_initialized) {
        var prev_ipval = 0;
        for (var i = 0; i < d_ipaddr.length; i++) {
         d_ipaddr[i] = parseInt(d_ipaddr[i], 36) + prev_ipval;
         prev_ipval = d_ipaddr[i];
        }
        for (var i = 0; i < special.length; i++) {
         special[i][1] = nmfc(special[i][1]);
        }
        az_initialized = 1;
      }
    
      var shost;
      if (/\.(ru|co|cu|com|info|net|org|gov|edu|int|mil|biz|pp|ne|msk|spb|nnov|od|in|ho|cc|dn|i|tut|v|dp|sl|ddns|dyndns|livejournal|herokuapp|azurewebsites|cloudfront|ucoz|3dn|nov|linode|amazonaws|sl-reverse|kiev)\.[^.]+$/.test(host))
        shost = host.replace(/(.+)\.([^.]+\.[^.]+\.[^.]+$)/, "$2");
      else
        shost = host.replace(/(.+)\.([^.]+\.[^.]+$)/, "$2");
      // Script optimization, see https://bugs.chromium.org/p/chromium/issues/detail?id=678022
      for (var k in dn) {
        var r = new RegExp('\\.'+k+'$');
        if (r.test(shost)) {shost = shost.replace(r, dn[k]); break;}
      }
      var curarr;
      if (/^[a-d]/.test(shost)) curarr = d_ad;
      else if (/^[e-h]/.test(shost)) curarr = d_eh;
      else if (/^[i-l]/.test(shost)) curarr = d_il;
      else if (/^[m-p]/.test(shost)) curarr = d_mp;
      else if (/^[q-t]/.test(shost)) curarr = d_qt;
      else if (/^[u-z]/.test(shost)) curarr = d_uz;
      else curarr = d_other;
    
      var oip = dnsResolve(host);
      var iphex = "";
      if (oip) {
       iphex = oip.toString().split(".");
       iphex = parseInt(iphex[3]) + parseInt(iphex[2])*256 + parseInt(iphex[1])*65536 + parseInt(iphex[0])*16777216;
      }
      var yip = 0;
      if (iphex) {
       for (var i = 0; i < d_ipaddr.length; i++) {
        if (iphex === d_ipaddr[i]) {yip = 1; break;}
       }
      }
      for (var i = 0; i < curarr.length; i++) {
        if (yip === 1 || shost === curarr[i]) {
          return "HTTPS proxy.antizapret.prostovpn.org:3143; PROXY proxy.antizapret.prostovpn.org:3128; DIRECT";
        }
      }
      for (var i = 0; i < special.length; i++) {
        if (isInNet(oip, special[i][0], special[i][1])) {return "PROXY CCAHIHA.antizapret.prostovpn.org:3128; DIRECT;";}
      }
    
      return "DIRECT";
    }

    CCAHIHA

    j123123, 13 Марта 2019

    Комментарии (11)
  6. Си / Говнокод #25440

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    // https://patents.google.com/patent/US20160357533A1/en
    // Generating code in statically typed programming languages for dynamically typed array-based language 
    /*
    Example 2
    
    The cell array is classified as heterogeneous and translated into a C structure. Source code includes the following array, which is classified as belonging to a heterogeneous class.
    	
    x = {‘add’, d1, ‘multiply’, d2, ‘add’, 1, ‘add’, 1};
    ...
    function y = process (x)
     ...
     y = 0;
     for i = 1:2:numel(x)
      if ~strcmp(x{i}, ‘add’)
       y = y + x{i+ 1};
      elseif ~strcmp(x{i}, ‘multiply’)
       y = y * x{i+1};
      end
     end
    end
    
    C code generated in the STPL contains a C structure type that is used for the variable “x”:
    */
    typedef struct {
        char f1[3];
        double f2;
        char f3[8];
        double f4;
        char f5[3];
        double f6;
        char f7[3];
        double f8;
      } cell_0;
    static double process(const cell_0 x)
    {
      ...
    }

    Сраные софтерные патенты. Блядь, вдумайтесь в эту хуйню. Вам дан динамически-типизированный язык, вот типа есть такой "массив" в котором элементы могут быть произвольной поеботой, например строками, флоатами. Как нам это оттранслировать? Да запросто, вот допустим есть такое говно: x = {‘add’, d1, ‘multiply’, d2, ‘add’, 1, ‘add’, 1}; - хуйнуть структуру надо
    typedef struct {
      char f1[3]; // тут сука 3 буквы потому что слово "add" из трех букв
      double f2;
      char f3[8]; // тут сука 8 букв потому что слово "multiply" из 8 букв
      double f4;
      char f5[3]; // тут сука 3 буквы потому что слово "add" из трех букв
      double f6;
      char f7[3]; // тут сука 3 буквы потому что слово "add" из трех букв
      double f8;
    } cell_0;

    А нахуй? Ну т.е. вот потом там будет сгенерен в сишке код, который будет через memcmp проверять этот char f1[3] что там "add", и потом будет еще код, который проверит что char f3[8] это "multiply", да? Ну т.е. у вас структура специализирована под конкретную поебень x = {‘add’, d1, ‘multiply’, d2, ‘add’, 1, ‘add’, 1}; и там блядь и так понятно, что вот там будет add, там будет multiply, и что вот такое количество элементов, это ясно из самого определения структуры, нахуй это говно вообще? И это говно еще запатентовали

    j123123, 10 Марта 2019

    Комментарии (16)
  7. C++ / Говнокод #25438

    −1

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    // Microsoft открыла код Калькулятора Windows
    
    // https://github.com/Microsoft/calculator/blob/057401f5f2b4bb1ea143da02c773ac18d1bb9a2e/src/CalcViewModel/Common/CalculatorButtonUser.h#L8
    
    namespace CalculatorApp
    {
        namespace CM = CalculationManager;
    
        public enum class NumbersAndOperatorsEnum
        {
            Zero = (int) CM::Command::Command0,
            One = (int) CM::Command::Command1,
            Two = (int) CM::Command::Command2,
            Three = (int) CM::Command::Command3,
            Four = (int) CM::Command::Command4,
            Five = (int) CM::Command::Command5,
            Six = (int) CM::Command::Command6,
            Seven = (int) CM::Command::Command7,
            Eight = (int) CM::Command::Command8,
            Nine = (int) CM::Command::Command9,
            Add = (int) CM::Command::CommandADD,
            Subtract = (int) CM::Command::CommandSUB,
            Multiply = (int) CM::Command::CommandMUL,
            Divide = (int) CM::Command::CommandDIV,
            Invert = (int) CM::Command::CommandREC,
            Equals = (int) CM::Command::CommandEQU,
            Decimal = (int) CM::Command::CommandPNT,
            Sqrt = (int) CM::Command::CommandSQRT,
            Percent = (int) CM::Command::CommandPERCENT,
            Negate = (int) CM::Command::CommandSIGN,
            Backspace = (int) CM::Command::CommandBACK,
            ClearEntry = (int) CM::Command::CommandCENTR,
            Clear = (int) CM::Command::CommandCLEAR,
            Degree = (int) CM::Command::CommandDEG,
            Radians = (int) CM::Command::CommandRAD,
            Grads = (int) CM::Command::CommandGRAD,
            Degrees = (int) CM::Command::CommandDegrees,
            OpenParenthesis = (int) CM::Command::CommandOPENP,
            CloseParenthesis = (int) CM::Command::CommandCLOSEP,
            Pi = (int) CM::Command::CommandPI,
            Sin = (int) CM::Command::CommandSIN,
            Cos = (int) CM::Command::CommandCOS,
            Tan = (int) CM::Command::CommandTAN,
            Factorial = (int) CM::Command::CommandFAC,
            XPower2 = (int) CM::Command::CommandSQR,
            Mod = (int) CM::Command::CommandMOD,
            FToE = (int) CM::Command::CommandFE,
            LogBaseE = (int) CM::Command::CommandLN,
            InvSin = (int) CM::Command::CommandASIN,
            InvCos = (int) CM::Command::CommandACOS,
            InvTan = (int) CM::Command::CommandATAN,
            LogBase10 = (int) CM::Command::CommandLOG,
            XPowerY = (int) CM::Command::CommandPWR,
            YRootX = (int) CM::Command::CommandROOT,
            TenPowerX = (int) CM::Command::CommandPOW10,
            EPowerX = (int) CM::Command::CommandPOWE,
            Exp = (int) CM::Command::CommandEXP,
            IsScientificMode = (int) CM::Command::ModeScientific,
            IsStandardMode = (int) CM::Command::ModeBasic,
            None = (int) CM::Command::CommandNULL,
            IsProgrammerMode = (int) CM::Command::ModeProgrammer,
            DecButton = (int) CM::Command::CommandDec,
            OctButton = (int) CM::Command::CommandOct,
            HexButton = (int) CM::Command::CommandHex,
            BinButton = (int) CM::Command::CommandBin,
            And = (int) CM::Command::CommandAnd,
            Ror = (int) CM::Command::CommandROR,
            Rol = (int) CM::Command::CommandROL,
            Or = (int) CM::Command::CommandOR,
            Lsh = (int) CM::Command::CommandLSHF,
            Rsh = (int) CM::Command::CommandRSHF,
            Xor = (int) CM::Command::CommandXor,
            Not = (int) CM::Command::CommandNot,
            A = (int) CM::Command::CommandA,
            B = (int) CM::Command::CommandB,
            C = (int) CM::Command::CommandC,
            D = (int) CM::Command::CommandD,
            E = (int) CM::Command::CommandE,
            F = (int) CM::Command::CommandF,
            Memory, // This is the memory button. Doesn't have a direct mapping to the CalcEngine.        
            Sinh = (int) CM::Command::CommandSINH,
            Cosh = (int) CM::Command::CommandCOSH,
            Tanh = (int) CM::Command::CommandTANH,
            InvSinh = (int) CM::Command::CommandASINH,
            InvCosh = (int) CM::Command::CommandACOSH,
            InvTanh = (int) CM::Command::CommandATANH,
            Qword = (int) CM::Command::CommandQword,
            Dword = (int) CM::Command::CommandDword,
            Word = (int) CM::Command::CommandWord,
            Byte = (int) CM::Command::CommandByte,
            Cube = (int) CM::Command::CommandCUB,
            DMS = (int) CM::Command::CommandDMS,
    
            BINSTART = (int) CM::Command::CommandBINEDITSTART,
            BINPOS0 = (int) CM::Command::CommandBINPOS0,
            BINPOS1 = (int) CM::Command::CommandBINPOS1,
            BINPOS2 = (int) CM::Command::CommandBINPOS2,
            BINPOS3 = (int) CM::Command::CommandBINPOS3,
            BINPOS4 = (int) CM::Command::CommandBINPOS4,
            BINPOS5 = (int) CM::Command::CommandBINPOS5,

    Интересно, а эту херню кодогенерировали? Или это всё ручной труд?

    j123123, 09 Марта 2019

    Комментарии (30)
  8. Си / Говнокод #25426

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    // https://github.com/stedolan/jq/blob/3ea0199e031e98e92670a25e4323bd711005b5db/src/jv.h#L157
    
    #define JV_OBJECT_1(k1) (jv_object_set(jv_object(),(k1),jv_null()))
    #define JV_OBJECT_2(k1,v1) (jv_object_set(jv_object(),(k1),(v1)))
    #define JV_OBJECT_3(k1,v1,k2) (jv_object_set(JV_OBJECT_2((k1),(v1)),(k2),jv_null()))
    #define JV_OBJECT_4(k1,v1,k2,v2) (jv_object_set(JV_OBJECT_2((k1),(v1)),(k2),(v2)))
    #define JV_OBJECT_5(k1,v1,k2,v2,k3) (jv_object_set(JV_OBJECT_4((k1),(v1),(k2),(v2)),(k3),jv_null()))
    #define JV_OBJECT_6(k1,v1,k2,v2,k3,v3) (jv_object_set(JV_OBJECT_4((k1),(v1),(k2),(v2)),(k3),(v3)))
    #define JV_OBJECT_7(k1,v1,k2,v2,k3,v3,k4) (jv_object_set(JV_OBJECT_6((k1),(v1),(k2),(v2),(k3),(v3)),(k4),jv_null()))
    #define JV_OBJECT_8(k1,v1,k2,v2,k3,v3,k4,v4) (jv_object_set(JV_OBJECT_6((k1),(v1),(k2),(v2),(k3),(v3)),(k4),(v4)))
    #define JV_OBJECT_9(k1,v1,k2,v2,k3,v3,k4,v4,k5) \
        (jv_object_set(JV_OBJECT_8((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4)),(k5),jv_null()))
    #define JV_OBJECT_10(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5) \
        (jv_object_set(JV_OBJECT_8((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4)),(k5),(v5)))
    #define JV_OBJECT_11(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6) \
        (jv_object_set(JV_OBJECT_10((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5)),(k6),jv_null()))
    #define JV_OBJECT_12(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6) \
        (jv_object_set(JV_OBJECT_10((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5)),(k6),(v6)))
    #define JV_OBJECT_13(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7) \
        (jv_object_set(JV_OBJECT_12((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6)),(k7),jv_null()))
    #define JV_OBJECT_14(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7) \
        (jv_object_set(JV_OBJECT_12((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6)),(k7),(v7)))
    #define JV_OBJECT_15(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8) \
        (jv_object_set(JV_OBJECT_14((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7)),(k8),jv_null()))
    #define JV_OBJECT_16(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8) \
        (jv_object_set(JV_OBJECT_14((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7)),(k8),(v8)))
    #define JV_OBJECT_17(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8,k9) \
        (jv_object_set(JV_OBJECT_16((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7),(k8),(v8)),(k9),jv_null()))
    #define JV_OBJECT_18(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8,k9,v9) \
        (jv_object_set(JV_OBJECT_16((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7),(k8),(v8)),(k9),(v9)))
    #define JV_OBJECT_IDX(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,NAME,...) NAME
    #define JV_OBJECT(...) \
      JV_OBJECT_IDX(__VA_ARGS__, \
                    JV_OBJECT_18, JV_OBJECT_17, JV_OBJECT_16, JV_OBJECT_15, \
                    JV_OBJECT_14, JV_OBJECT_13, JV_OBJECT_12, JV_OBJECT_11, \
                    JV_OBJECT_10, JV_OBJECT_9, JV_OBJECT_8, JV_OBJECT_7,    \
                    JV_OBJECT_6, JV_OBJECT_5, JV_OBJECT_4, JV_OBJECT_3,     \
                    JV_OBJECT_2, JV_OBJECT_1)(__VA_ARGS__)

    Какой макробагор!

    j123123, 05 Марта 2019

    Комментарии (18)
  9. C++ / Говнокод #25401

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    constexpr void foo(int &a, const int b)
    {
      a = b * 2;
    }
    
    constexpr void foo2(int *a, const int b)
    {
      *a = b * 2;
    }
    
    constexpr int shit = []() constexpr {int a = 0; foo(a, 666); return a;}();
    
    constexpr int shit2 = []() constexpr {int a = 0; foo2(&a, 666); return a;}();

    Итак, время обсирать крестоговно. Вот есть там такая фича - можно по ссылке и указателю хуйню через constexpr присваивать. Только вот эта тупая херня под названием лямбда, она обязательно требует инициализации некоторого говна, передаваемого куда-то там, если она объявлена как constexpr. На кой хрен мне что-то инициализировать, если это говно я в constexpr не читаю, а только присваиваю? И сделайте там какие-нибудь write-only переменные, которые через ссылку или указатель пробрасывать можно, ну чисто чтоб поржать

    j123123, 23 Февраля 2019

    Комментарии (36)
  10. Си / Говнокод #25399

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    // https://github.com/ghc/ghc/blob/e204431e5a5e2fd16da52b04bda2798f16c51344/rts/Interpreter.c#L1184
    
            case bci_PUSH8: {
                int off = BCO_NEXT;
                Sp_subB(1);
                *(StgWord8*)Sp = *(StgWord8*)(Sp_plusB(off+1));
                goto nextInsn;
            }
    
            case bci_PUSH16: {
                int off = BCO_NEXT;
                Sp_subB(2);
                *(StgWord16*)Sp = *(StgWord16*)(Sp_plusB(off+2));
                goto nextInsn;
            }
    
            case bci_PUSH32: {
                int off = BCO_NEXT;
                Sp_subB(4);
                *(StgWord32*)Sp = *(StgWord32*)(Sp_plusB(off+4));
                goto nextInsn;
            }
    
            case bci_PUSH8_W: {
                int off = BCO_NEXT;
                *(StgWord*)(Sp_minusW(1)) = *(StgWord8*)(Sp_plusB(off));
                Sp_subW(1);
                goto nextInsn;
            }
    
            case bci_PUSH16_W: {
                int off = BCO_NEXT;
                *(StgWord*)(Sp_minusW(1)) = *(StgWord16*)(Sp_plusB(off));
                Sp_subW(1);
                goto nextInsn;
            }
    
            case bci_PUSH32_W: {
                int off = BCO_NEXT;
                *(StgWord*)(Sp_minusW(1)) = *(StgWord32*)(Sp_plusB(off));
                Sp_subW(1);
                goto nextInsn;
            }

    https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Interpreter

    > The linker lives in rts/Linker.c and is responsible for handling runtime loading of code into a Haskell process. This is something of a big blob of unpleasant code, and see DynamicGhcPrograms for information about efforts to reduce our dependence on this linker.

    Итак, тут у нас стековая машина из хачкеля, которая вродекак отвечает за динамическую загрузку какого-то говна.

    j123123, 22 Февраля 2019

    Комментарии (101)
     
     
    1. Си / Говнокод #25397

      0

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      31. 31
      32. 32
      33. 33
      34. 34
      35. 35
      // https://github.com/alpertron/calculators/blob/15607feafb0ddb1c075bb326dc6ea2224a4c50bb/siqs.c#L3720
      
                  switch (NumberLengthA)
                  {
                  case 7:
                    dRem = (double)*(piDividend + 6) * (double)rowPrimeTrialDivisionData->exp6 +
                      (double)*(piDividend + 5) * (double)rowPrimeTrialDivisionData->exp5 +
                      (double)*(piDividend + 4) * (double)rowPrimeTrialDivisionData->exp4 +
                      (double)*(piDividend + 3) * (double)rowPrimeTrialDivisionData->exp3 +
                      (double)*(piDividend + 2) * (double)rowPrimeTrialDivisionData->exp2 +
                      (double)*(piDividend + 1) * (double)rowPrimeTrialDivisionData->exp1;
                    break;
                  case 6:
                    dRem = (double)*(piDividend + 5) * (double)rowPrimeTrialDivisionData->exp5 +
                      (double)*(piDividend + 4) * (double)rowPrimeTrialDivisionData->exp4 +
                      (double)*(piDividend + 3) * (double)rowPrimeTrialDivisionData->exp3 +
                      (double)*(piDividend + 2) * (double)rowPrimeTrialDivisionData->exp2 +
                      (double)*(piDividend + 1) * (double)rowPrimeTrialDivisionData->exp1;
                    break;
                  case 5:
                    dRem = (double)*(piDividend + 4) * (double)rowPrimeTrialDivisionData->exp4 +
                      (double)*(piDividend + 3) * (double)rowPrimeTrialDivisionData->exp3 +
                      (double)*(piDividend + 2) * (double)rowPrimeTrialDivisionData->exp2 +
                      (double)*(piDividend + 1) * (double)rowPrimeTrialDivisionData->exp1;
                    break;
                  case 4:
                    dRem = (double)*(piDividend + 3) * (double)rowPrimeTrialDivisionData->exp3 +
                      (double)*(piDividend + 2) * (double)rowPrimeTrialDivisionData->exp2 +
                      (double)*(piDividend + 1) * (double)rowPrimeTrialDivisionData->exp1;
                    break;
                  default:
                    dRem = (double)*(piDividend + 2) * (double)rowPrimeTrialDivisionData->exp2 +
                      (double)*(piDividend + 1) * (double)rowPrimeTrialDivisionData->exp1;
                    break;
                  }

      Generic two integer variable equation solver
      This calculator can solve equations of the form a⁢x² + b⁢x⁢y + c⁢y² + dx + ey + f = 0 where the unknowns x and y are integer numbers.

      j123123, 22 Февраля 2019

      Комментарии (6)
    2. C++ / Говнокод #25395

      +1

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      31. 31
      32. 32
      33. 33
      34. 34
      35. 35
      36. 36
      37. 37
      38. 38
      39. 39
      40. 40
      41. 41
      42. 42
      43. 43
      // https://github.com/CVC4/CVC4/blob/14b9dbaa0c9e8dce52d1a28595dc1cc80756abed/src/expr/pickler.cpp
      
      
      static Block mkBlockBody4Chars(char a, char b, char c, char d) {
        Block newBody;
        newBody.d_body.d_data = (a << 24) | (b << 16) | (c << 8) | d;
        return newBody;
      }
      
      static char getCharBlockBody(BlockBody body, int i) {
        Assert(0 <= i && i <= 3);
      
        switch(i) {
        case 0: return (body.d_data & 0xff000000) >> 24;
        case 1: return (body.d_data & 0x00ff0000) >> 16;
        case 2: return (body.d_data & 0x0000ff00) >> 8;
        case 3: return (body.d_data & 0x000000ff);
        default:
          Unreachable();
        }
        return '\0';
      }
      
      // ...
      
      void PicklerPrivate::toCaseString(Kind k, const std::string& s) {
        d_current << mkConstantHeader(k, s.size());
      
        unsigned size = s.size();
        unsigned i;
        for(i = 0; i + 4 <= size; i += 4) {
          d_current << mkBlockBody4Chars(s[i + 0], s[i + 1],s[i + 2], s[i + 3]);
        }
        switch(size % 4) {
        case 0: break;
        case 1: d_current << mkBlockBody4Chars(s[i + 0], '\0','\0', '\0'); break;
        case 2: d_current << mkBlockBody4Chars(s[i + 0], s[i + 1], '\0', '\0'); break;
        case 3: d_current << mkBlockBody4Chars(s[i + 0], s[i + 1],s[i + 2], '\0'); break;
        default:
          Unreachable();
        }
      
      }

      Очередное переизобретение какой-то байтоебской поеботы типа ntohl(). И вообще, тут UB.

      j123123, 21 Февраля 2019

      Комментарии (94)
    3. Java / Говнокод #25392

      +3

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      31. 31
      32. 32
      33. 33
      34. 34
      35. 35
      36. 36
      37. 37
      38. 38
      39. 39
      40. 40
      41. 41
      42. 42
      43. 43
      44. 44
      45. 45
      46. 46
      47. 47
      48. 48
      49. 49
      50. 50
      51. 51
      52. 52
      53. 53
      54. 54
      55. 55
      56. 56
      57. 57
      58. 58
      59. 59
      60. 60
      61. 61
      62. 62
      63. 63
      64. 64
      65. 65
      66. 66
      67. 67
      68. 68
      69. 69
      70. 70
      71. 71
      72. 72
      73. 73
      74. 74
      75. 75
      76. 76
      /*
       * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
       * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       *
       * This code is free software; you can redistribute it and/or modify it
       * under the terms of the GNU General Public License version 2 only, as
       * published by the Free Software Foundation.
       *
       * This code is distributed in the hope that it will be useful, but WITHOUT
       * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       * version 2 for more details (a copy is included in the LICENSE file that
       * accompanied this code).
       *
       * You should have received a copy of the GNU General Public License version
       * 2 along with this work; if not, write to the Free Software Foundation,
       * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       *
       * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       * or visit www.oracle.com if you need additional information or have any
       * questions.
       */
      
      /* @test
         @bug 4890726
         @summary Check the correctness of KOI8_U by comparing to KOI8_R
       */
      
      import java.util.*;
      import static java.lang.Character.UnicodeBlock;
      
      public class UkrainianIsNotRussian {
          private static String decode(byte[] bytes, String encoding) throws Throwable {
              String s = new String(bytes, encoding);
              equal(s.length(), 1);
              check(Arrays.equals(s.getBytes(encoding), bytes));
              return s;
          }
      
          private static void realMain(String[] args) throws Throwable {
              final byte[] bytes = new byte[1];
              int differences = 0;
              for (int i = 0; i < 0xff; i++) {
                  bytes[0] = (byte) i;
                  final String r = decode(bytes, "KOI8_R");
                  final String u = decode(bytes, "KOI8_U");
                  if (! r.equals(u)) {
                      differences++;
                      final char rc = r.charAt(0);
                      final char uc = u.charAt(0);
                      final UnicodeBlock rcb = UnicodeBlock.of(rc);
                      final UnicodeBlock ucb = UnicodeBlock.of(uc);
                      System.out.printf("%02x => %04x %s, %04x %s%n",
                                        i, (int) rc, rcb, (int) uc, ucb);
                      check(rcb == UnicodeBlock.BOX_DRAWING &&
                            ucb == UnicodeBlock.CYRILLIC);
                  }
              }
              equal(differences, 8);
          }
      
          //--------------------- Infrastructure ---------------------------
          static volatile int passed = 0, failed = 0;
          static void pass() {passed++;}
          static void fail() {failed++; Thread.dumpStack();}
          static void fail(String msg) {System.out.println(msg); fail();}
          static void unexpected(Throwable t) {failed++; t.printStackTrace();}
          static void check(boolean cond) {if (cond) pass(); else fail();}
          static void equal(Object x, Object y) {
              if (x == null ? y == null : x.equals(y)) pass();
              else fail(x + " not equal to " + y);}
          public static void main(String[] args) throws Throwable {
              try {realMain(args);} catch (Throwable t) {unexpected(t);}
              System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
              if (failed > 0) throw new AssertionError("Some tests failed");}
      }

      https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/test/jdk/sun/nio/cs/UkrainianIsNotRussian.java

      j123123, 21 Февраля 2019

      Комментарии (159)
    4. C++ / Говнокод #25381

      +1

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      // https://habr.com/ru/post/440388/
      // Интервалы: грядущая эволюция C++ 
      
      // Давайте теперь рассмотрим следующую задачу: имеется вектор, необходимо удалить
      // из него все повторяющиеся элементы. В рамках текущего стандарта мы решали бы её так:
      
      std::vector<T> vec=...;
      std::sort( vec.begin(), vec.end() );
      vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
      
      
      // При этом мы указываем имя вектора аж 6 раз! Однако, используя концепцию интервалов
      // (объединив итераторы на начало и конец вектора в один объект), можно написать в разы проще, указав искомый вектор лишь единожды:
      
      tc::unique_inplace( tc::sort(vec) );
      
      //... Че, серьезно? Я так тоже могу:
      // Однако, используя сишный препроцессор™, можно написать в разы проще, указав искомый вектор лишь единожды:
      
      #define DELETE_DUPS(x) do{ std::sort( x.begin(), x.end() ); x.erase( x::unique( x.begin(), x.end() ), x.end() );}while(0)
      
      DELETE_DUPS(vec);

      Тоже мне революция.

      j123123, 15 Февраля 2019

      Комментарии (26)
    5. Си / Говнокод #25375

      0

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      // https://git.zx2c4.com/BruteZip/tree/read.c?id=e4e9c17b99e0d108136b8a07632b1ebaa7d09d28#n26
      
      int main(int argc, char *argv[])
      {
      	union {
      		long int l;
      		char c[sizeof(long int)];
      	} u;
      	u.l = 1;
      	if (u.c[sizeof(long int) - 1] == 1) {
      		printf("This program only runs on little endian archs, because I'm lazy. Sorry.\n");
      		return -2;
      	}

      Хуйня какая-то. Ведь sizeof(long int) может быть равен sizeof(char).

      Но над такой питушней обычно никто не задумывается

      j123123, 13 Февраля 2019

      Комментарии (223)
    6. Си / Говнокод #25372

      −1

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      31. 31
      32. 32
      33. 33
      34. 34
      35. 35
      36. 36
      37. 37
      38. 38
      39. 39
      40. 40
      41. 41
      42. 42
      43. 43
      // http://p99.gforge.inria.fr/p99-html/group__flexible.html
      
      //C99 allows a flexible array member to be defined as the last member of a struct,
      // namely an array of undetermined length.
      //P99_DECLARE_STRUCT(package_head);
      
      struct package_head {
        char name[20];
        size_t len;
        uint64_t data[];
      };
      
      // Such a struct can then be allocated on the heap with a suitable size such 
      // that the field data has as many elements as fit in the allocated space from
      // the start of data onward. Usually one would allocate such struct with
      
      package_head *a = malloc(sizeof(package_head) + 10 * sizeof(uint64_t));
      package_head *b = malloc(sizeof(*b) + 12 * sizeof(b->data[0]));
      
      // This has several disadvantages. Firstly, the syntax is clumsy. We have to
      // use a relatively complicated expression that uses two elements of the specification of a or b.
      
      // Secondly, it wastes space. Due to packing of the struct the offset of data "inside"
      //  the struct may be less than sizeof(package_head). In most cases the real size
      // of the object that we want to construct is
      
      offsetof(package_head, data) + N * sizeof(uint64_t)
      
      // so we are wasting
      
      sizeof(package_head) - offsetof(package_head, data)
      
      // bytes.
      
      // The above formula for the exact size is only valid for larger values of N. We must
      // also ensure that we allocate at least sizeof(package_head) bytes. So the complete
      // formula looks something like
      
      #define P99_FSIZEOF(T, F, N) P99_MAXOF(sizeof(T), offsetof(T, F) + P99_SIZEOF(T, F[0]) * N)
      
      // which is probably not something that you want to write on a daily basis.
      
      // We provide several interfaces to allocate struct with flexible members

      Херню написали какую-то. Забыли самое главное : нельзя так в лоб аллоцировать память под структуры. Потому что выравнивание может не то быть.
      Надо использовать http://man7.org/linux/man-pages/man3/aligned_alloc.3.html

      j123123, 12 Февраля 2019

      Комментарии (25)
    7. C++ / Говнокод #25359

      +5

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      // https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
      
      // The Curiously Recurring Template Pattern (CRTP)
      template<class T>
      class Base
      {
          // methods within Base can use template to access members of Derived
      };
      class Derived : public Base<Derived>
      {
          // ...
      };

      > The Microsoft Implementation of CRTP in Active Template Library (ATL) was independently discovered, also in 1995 by Jan Falkin who accidentally derived a base class from a derived class. Christian Beaumont, first saw Jan's code and initially thought it couldn't possibly compile in the Microsoft compiler available at the time. Following this revelation that it did indeed work, Christian based the entire ATL and Windows Template Library (WTL) design on this mistake.

      А какая ошибка по-вашему положена в основу всего дизайна языка C++?

      j123123, 06 Февраля 2019

      Комментарии (119)
    8. Си / Говнокод #25349

      −1

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      #include <stdio.h>
      #include <stdlib.h>
      #include <inttypes.h>
      
      int main(void)
      {
        char a[8], b[8];
        char *a_ptr = a+8;
        char *b_ptr = b;
        printf("a_ptr = %p, b_ptr = %p\n", a_ptr, b_ptr);
        if (a_ptr != b_ptr)
        {
          printf("a_ptr != b_ptr\n");
        }
        else
        {
          printf("a_ptr == b_ptr\n");
        }
        
        
        if ((uintptr_t)a_ptr != (uintptr_t)b_ptr)
        {
          printf("(uintptr_t)a_ptr != (uintptr_t)b_ptr\n");
        }
        else
        {
          printf("(uintptr_t)a_ptr == (uintptr_t)b_ptr\n");
        }
        return EXIT_SUCCESS;
      }

      Что по-вашему тут происходит?

      j123123, 02 Февраля 2019

      Комментарии (39)
    9. C++ / Говнокод #25343

      −1

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      12. 12
      13. 13
      14. 14
      15. 15
      16. 16
      17. 17
      18. 18
      19. 19
      20. 20
      21. 21
      22. 22
      23. 23
      24. 24
      25. 25
      26. 26
      27. 27
      28. 28
      29. 29
      30. 30
      31. 31
      32. 32
      33. 33
      34. 34
      35. 35
      36. 36
      37. 37
      38. 38
      // https://habr.com/ru/company/jugru/blog/438260/
      
      template<Semiregular T>
      struct maybe_view : view_interface<maybe_view<T>> {
        maybe_view() = default;
        maybe_view(T t) : data_(std::move(t)) {
        }
        T const *begin() const noexcept {
          return data_ ? &*data_ : nullptr;
        }
        T const *end() const noexcept {
          return data_ ? &*data_ + 1 : nullptr;
        }
      private:
        optional<T> data_{};
      };
      inline constexpr auto for_each =
        []<Range R,
           Iterator I = iterator_t<R>,
           IndirectUnaryInvocable<I> Fun>(R&& r, Fun fun)
              requires Range<indirect_result_t<Fun, I>> {
            return std::forward<R>(r)
              | view::transform(std::move(fun))
              | view::join;
        };
      inline constexpr auto yield_if =
        []<Semiregular T>(bool b, T x) {
          return b ? maybe_view{std::move(x)}
                   : maybe_view<T>{};
        };
      
      /*
      > Быть может, что для кого-то это язык родной, но для меня всё
      это ощущается как если бы кто-то решил, что Perl излишне читабельный,
      а Brainfuck — излишне нечитабельный, поэтому давайте целиться между
      ними. Я программировал в основном на C++ все последние 20 лет. Может
      быть, я слишком тупой, чтобы во всём этом разобраться, отлично.
      */

      Какой багор)))

      j123123, 31 Января 2019

      Комментарии (11)
    10. Куча / Говнокод #25340

      0

      1. 1
      https://i.imgur.com/7uRLULs.mp4

      Аппаратная нейросеть в мозгах петуха совершила ошибку классификации.

      j123123, 30 Января 2019

      Комментарии (47)
       
       
       
      1. Си / Говнокод #25334

        +2

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        void add_SSE(uint8_t a[static 7], uint8_t b[static 7], uint8_t out[static 7])
        {
          uint64_t a_64 = 0;
          uint64_t b_64 = 0;
          for (size_t i = 0; i < 7; i++) // можно наанроллить
          {
            a_64 |= (uint64_t)a[i] << (i*9);
            b_64 |= (uint64_t)b[i] << (i*9);
          }
          
          uint64_t c_64 = a_64 + b_64;
          
          for (size_t i = 0; i < 7; i++) // можно наанроллить
          {
            out[i] = (uint64_t)c_64 >> (i*9);
          }
        }

        SSE

        j123123, 28 Января 2019

        Комментарии (32)
      2. Java / Говнокод #25332

        +3

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        // https://github.com/TigerVNC/tigervnc/blob/8c6c584377feba0e3b99eecb3ef33b28cee318cb/java/com/jcraft/jsch/Buffer.java#L65-L85
        
          public void putInt(int val) {
            tmp[0]=(byte)(val >>> 24);
            tmp[1]=(byte)(val >>> 16);
            tmp[2]=(byte)(val >>> 8);
            tmp[3]=(byte)(val);
            System.arraycopy(tmp, 0, buffer, index, 4);
            index+=4;
          }
          public void putLong(long val) {
            tmp[0]=(byte)(val >>> 56);
            tmp[1]=(byte)(val >>> 48);
            tmp[2]=(byte)(val >>> 40);
            tmp[3]=(byte)(val >>> 32);
            System.arraycopy(tmp, 0, buffer, index, 4);
            tmp[0]=(byte)(val >>> 24);
            tmp[1]=(byte)(val >>> 16);
            tmp[2]=(byte)(val >>> 8);
            tmp[3]=(byte)(val);
            System.arraycopy(tmp, 0, buffer, index+4, 4);
            index+=8;
          }

        Жабовское байтоебство (судя по всему это такой ntohl) из реализации VNC.
        Вот интересно, в жабке-то unsigned типов нет нихера, но почему-то сделали unsigned двоичный сдвиг (>>>), который работает для этих встроенных signed типов как если б это были unsigned. А как насчет unsigned умножения и деления (сложение и вычитание - то один хер, без разницы, если у нас two's complement)?

        j123123, 28 Января 2019

        Комментарии (58)
      3. C++ / Говнокод #25327

        +2

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        6. 6
        7. 7
        https://www.opennet.ru/opennews/art.shtml?num=50026
        
        После двух лет разработки компания The Qt Company представила
        компактный встроенный http-сервер для Qt, доступный для
        разработчиков приложений в виде класса QHttpServer. Сервер
        пока развивается как экспериментальный проект Qt Labs, но
        запланирован для включения в основной состав Qt 6.

        Вот жеж этим [censored] делать нехер. Вы уже в Qt встроили жабаскрипт ( https://doc.qt.io/qt-5/topics-scripting.html ), и даже встроили браузер, но вам этого мало, вы еще и вебсервер встроили. Встройте еще туда и PHP, чтоб вообще всё возможное говно в себя вобрать

        j123123, 26 Января 2019

        Комментарии (34)
      4. C# / Говнокод #25320

        +4

        1. 1
        2. 2
        Yandere Simulator
        https://f0ck.me/b/09d3f680.mp4

        j123123, 22 Января 2019

        Комментарии (14)
      5. C++ / Говнокод #25319

        +2

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        // https://www.tutorialspoint.com/Read-a-character-from-standard-input-without-waiting-for-a-newline-in-Cplusplus
        
        
        
        // A portable solution doesn't exist for doing this. On windows, you can use the getch() function from the conio(Console I/O) library to get characters pressed. For example,
        
        #include<iostream>
        #include<conio.h>
        using namespace std;
        int main() {
            char c;
            while(1){ // infinite loop
                c = getch();
                cout << c;
            }
        }
        
        // This will output whatever character you input to the terminal. Note that this will only work on windows as the conio library exists only on windows. On UNIX, you can achieve this by entering in system raw mode. For example,
        
        #include<iostream>
        #include<stdio.h>
        int main() {
            char c;
           // Set the terminal to raw mode
            system("stty raw");
            while(1) {
                c = getchar(); 
                // terminate when "." is pressed
                if(c == '.') {
                    system("stty cooked");
                    exit(0);
                }  
                std::cout << c << " was pressed."<< std::endl;
            }
        }

        Вариант под UNIX еще и очень секурный, ЕВПОЧЯ

        j123123, 22 Января 2019

        Комментарии (39)
      6. Си / Говнокод #25307

        −1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        65. 65
        66. 66
        67. 67
        68. 68
        69. 69
        70. 70
        71. 71
        72. 72
        73. 73
        74. 74
        void sort8(uint64_t a[8])
        {
          uint64_t a0;
          uint64_t a1;
          uint64_t a2;
          uint64_t a3;
          uint64_t a4;
          uint64_t a5;
          uint64_t a6;
          uint64_t a7;
         
          SORT2(a[0], a[1], a0, a1);
          SORT2(a[2], a[3], a2, a3);
          SORT2(a[4], a[5], a4, a5);
          SORT2(a[6], a[7], a6, a7);
        
          uint64_t a_tmp[8];
        
          MERGE_2_4(a0, a1, a2, a3, a_tmp[0], a_tmp[1], a_tmp[2], a_tmp[3]);
          MERGE_2_4(a4, a5, a6, a7, a_tmp[4], a_tmp[5], a_tmp[6], a_tmp[7]);
        
          uint64_t *ptra1 = &a_tmp[0];
          uint64_t *ptra2 = &a_tmp[4];
          
          for (size_t i = 0; i < 4; i++)
          {
            if (*ptra1 < *ptra2)
            {
              a[i] = *ptra1;
              ptra1++;
            }
            else
            {
              a[i] = *ptra2;
              ptra2++;
            }
          }
        
          for (size_t i = 4; i < 8; i++)
          {
            if (ptra1 == &a_tmp[4])
            {
              while (ptra2 != &a_tmp[8])
              {
                a[i++] = *ptra2;
                ptra2++;
              }
              break;
            }
            
            if (ptra2 == &a_tmp[8])
            {
              while (ptra1 != &a_tmp[4])
              {
                a[i++] = *ptra1;
                ptra1++;
              }
              break;
            }
        
        
            if (*ptra1 < *ptra2)
            {
              a[i] = *ptra1;
              ptra1++;
            }
            else
            {
              a[i] = *ptra2;
              ptra2++;
            }
        
          }
        }

        Мерж сорт, специализированный на 8 элементов. Вот доказательство корректности https://paste.debian.net/hidden/cce6d31a/

        j123123, 13 Января 2019

        Комментарии (137)
      7. Assembler / Говнокод #25239

        +2

        1. 1
        2. 2
        3. 3
        https://www.researchgate.net/publication/325358150_cQASM_v10_Towards_a_Common_Quantum_Assembly_Language
        
        cQASM v1.0: Towards a Common Quantum Assembly Language

        The quantum assembly language (QASM) is a popular intermediate representation used in many quantum compilation and simulation tools to describe quantum circuits. Currently, multiple different dialects of QASM are used in different quantum computing tools. This makes the interaction between those tools tedious and time-consuming due to the need for translators between theses different syntaxes. Beside requiring a multitude of translators, the translation process exposes the constant risk of loosing information due to the potential incompatibilities between the different dialects. Moreover, several tools introduce details of specific target hardware or qubit technologies within the QASM syntax and prevent porting the code to other hardwares. In this paper, we propose a common QASM syntax definition, named cQASM, which aims to abstract away qubit technology details and guarantee the interoperability between all the quantum compilation and simulation tools supporting this standard. Our vision is to enable an extensive quantum computing toolbox shared by all the quantum computing community.

        Вот это я понимаю, а то вон там мелкософт какие-то говношарпы придумывает очередные:

        https://docs.microsoft.com/en-us/quantum/language/?view=qsharp-preview


        Нахер ваши шарпы с вашим сраным дуднетом и прочей такой хуйней, даешь Assembler.

        j123123, 28 Декабря 2018

        Комментарии (187)
      8. Си / Говнокод #25229

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        #include <stdio.h>
        #include <string.h>
        #include <stdlib.h>
        
        #define SQARESZ 3
        
        
        void rotateclockwise(char *ptra, size_t sz)
        {
            char (*a_ar)[sz] = (void *)ptra;
            char b_ar[sz][sz];
            for (size_t y = 0; y < sz; y++)
            {
                for (size_t x = 0; x < sz; x++)
                {
                    b_ar[y][x] = a_ar[sz-1-x][y];
                }
            }
            memcpy(a_ar, b_ar, sz*sz);
        }
        
        void print_ar(char *ptra, size_t sz)
        {
            char (*a_ar)[sz] = (void *)ptra;
            for (size_t y = 0; y < sz; y++)
            {
                for (size_t x = 0; x < sz; x++)
                {
                    printf("%i ", a_ar[y][x]);
                }
                printf("\n");
            }
        }
        
        int main()
        {
            char a[SQARESZ][SQARESZ] =
            {
              {1,2,3},
              {4,5,6},
              {7,8,9}
            };
            
            print_ar((char *)a, SQARESZ);
            printf("\n");
            rotateclockwise((char *)a, SQARESZ);
            
            print_ar((char *)a, SQARESZ);
            printf("\n");
            rotateclockwise((char *)a, SQARESZ);
            
            print_ar((char *)a, SQARESZ);
            printf("\n");
            rotateclockwise((char *)a, SQARESZ);
            
            print_ar((char *)a, SQARESZ);
            printf("\n");
            rotateclockwise((char *)a, SQARESZ);
            
            print_ar((char *)a, SQARESZ);
            printf("\n");
        
            return 0;
        }

        https://habr.com/post/317300/ В C++17 до сих пор нет нормальных многомерных массивов, которые были в Fortran начиная с Fortran 90

        > UPD от 2016-12-10 14:03. Посмотрел на этот коммент от @selgjos, поэкспериментировал с компилятором и понял, что с помощью C99 VLA всё-таки можно добиться нужного мне эффекта.
        > В общем, окей, в C есть нужные мне массивы. Как и в Fortran. А в C++ их по-прежнему нет.

        j123123, 26 Декабря 2018

        Комментарии (144)
      9. Assembler / Говнокод #25228

        +2

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        /*
        x86-64 clang (trunk) -O3
        https://godbolt.org/z/t8NDGG
        
        #include <inttypes.h>
        
        uint32_t saturation_add(uint32_t a, uint32_t b)
        {
            const uint64_t tmp = (uint64_t)a + b;
            if (tmp > UINT32_MAX)
            {
                return UINT32_MAX;
            }
            return tmp;
        }
        */
        
        saturation_add:
                mov     edx, esi
                mov     eax, edi
                add     edi, esi
                add     rax, rdx
                mov     edx, 4294967295
                cmp     rax, rdx
                mov     eax, -1   // ЗАЧЕМ???
                cmovbe  eax, edi
                ret

        https://en.wikipedia.org/wiki/Saturation_arithmetic
        Почему компиляторы до сих пор такое говно

        j123123, 26 Декабря 2018

        Комментарии (94)
      10. Куча / Говнокод #25208

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        65. 65
        66. 66
        67. 67
        68. 68
        69. 69
        70. 70
        71. 71
        72. 72
        73. 73
        74. 74
        75. 75
        76. 76
        77. 77
        78. 78
        79. 79
        80. 80
        81. 81
        82. 82
        83. 83
        84. 84
        85. 85
        86. 86
        87. 87
        88. 88
        89. 89
        90. 90
        91. 91
        92. 92
        93. 93
        94. 94
        95. 95
        96. 96
        ;;; the toplevel operators of each equation in the system
        ;;; type : array[term]
        (defmacro match-acz-state-methods (state__) `(svref ,state__ 0))
        
        ;;; functional terms
        ;;; type : array[term]
        (defmacro match-acz-state-lhs-f (state__) `(svref ,state__ 1))
        
        ;;; variables on the LHS
        ;;; type : array[term]
        (defmacro match-acz-state-lhs-v (state__) `(svref ,state__ 2))
        
        ;;; contants on the RHS
        ;;; type : array[term]
        (defmacro match-acz-state-rhs-c (state__) `(svref ,state__ 3))
        
        ;;; functional terms on RHS
        ;;; type : array[term]
        (defmacro match-acz-state-rhs-f (state__) `(svref ,state__ 4))
        
        ;;; notes repeated functional terms of LHS
        ;;; type : array[bool]
        (defmacro match-acz-state-lhs-f-r (state__) `(svref ,state__ 5))
        
        ;;; notes repeated variables of LHS
        ;;; type : array[bool]
        (defmacro match-acz-state-lhs-v-r (state__) `(svref ,state__ 6))
        
        ;;; notes repeated constants of RHS
        ;;; type : array[bool]
        (defmacro match-acz-state-rhs-c-r (state__) `(svref ,state__ 7))
        
        ;;; notes repreated funcational terms of RHS
        ;;; type : array[bool]
        (defmacro match-acz-state-rhs-f-r (state__) `(svref ,state__ 8))
        
        ;;; variables and funs acocunted for by RHS-c-sol
        ;;; type : fixnum
        (defmacro match-acz-state-lhs-mask (state__)  `(svref ,state__ 9))
        
        ;;; funs accounted for by RHS-c-sol
        ;;; type : fixnum
        (defmacro match-acz-state-lhs-f-mask (state__) `(svref ,state__ 10))
        
        ;;; bit vector of all repeated (> 0) terms on LHS
        (defmacro match-acz-state-lhs-r-mask (state__)  `(svref ,state__ 11))
        
        ;;; solution matrix for constants
        ;;; type : array[fixnum]
        (defmacro match-acz-state-rhs-c-sol (state__) `(svref ,state__ 12 ))
        
        ;;; max value of elements of RHS-C-sol
        ;;; type : fixnum
        (defmacro match-acz-state-rhs-c-max (state__) `(svref ,state__ 13))
        
        ;;; solutions matrix; functional terms
        ;;; type : array[fixnum]
        (defmacro match-acz-state-rhs-f-sol (state__) `(svref ,state__ 14))
        
        ;;; max value of elements of RHS-f-sol
        ;;; type : fixnum
        (defmacro match-acz-state-rhs-f-max (state__) `(svref ,state__ 15))
        
        ;;; type : fixnum 11111 ... 1111
        (defmacro match-acz-state-rhs-full-bits (state__) `(svref ,state__ 16))
        
        ;;; array of compatibility bitvectors; constants
        ;;; type : array[fixnum]
        (defmacro match-acz-state-rhs-c-compat (state__) `(svref ,state__ 17))
        
        ;;; array of compatibility bitvectors; funcs
        ;;; type : array[fixnum]
        (defmacro match-acz-state-rhs-f-compat (state__) `(svref ,state__ 18))
        
        ;;; number of constants on LHS after simplification
        ;;; type : fixnum
        (defmacro match-acz-state-lhs-c-count (state__) `(svref ,state__ 19))
        
        ;;; number of functions on LHS after simplification
        ;;; type : fixnum
        (defmacro match-acz-state-lhs-f-count (state__) `(svref ,state__ 20))
        
        ;;; number of variables on LHS after simplification
        ;;; type : fixnum
        (defmacro match-acz-state-lhs-v-count (state__) `(svref ,state__ 21))
        
        ;;; number of constants on RHS after simplification
        ;;; type : fixnum
        (defmacro match-acz-state-rhs-c-count (state__)  `(svref ,state__ 22))
        
        ;;; number of functions on RHS after simplification
        ;;; type : fixnum
        (defmacro match-acz-state-rhs-f-count (state__) `(svref ,state__ 23))
        
        ;;; t iff all solutions have been reported.
        (defmacro match-acz-state-no-more (state__) `(svref ,state__ 24))

        https://github.com/CafeOBJ/cafeobj/blob/master/chaos/e-match/match-acz.lisp

        ГОМОИКОНЫ копипаст лиспе
        CafeOBJ is a most advanced formal specification language which inherits many advanced features (e.g. flexible mix-fix syntax, powerful and clear typing system with ordered sorts, parameteric modules and views for instantiating the parameters, and module expressions, etc.) from OBJ (or more exactly OBJ3) algebraic specification language.

        CafeOBJ is a language for writing formal (i.e. mathematical) specifications of models for wide varieties of software and systems, and verifying properties of them. CafeOBJ implements equational logic by rewriting and can be used as a powerful interactive theorem proving system. Specifiers can write proof scores also in CafeOBJ and doing proofs by executing the proof scores.

        CafeOBJ has state-of-art rigorous logical semantics based on institutions. The CafeOBJ cube shows the structure of the various logics underlying the combination of the various paradigms implemented by the language. Proof scores in CafeOBJ are also based on institution based rigorous semantics, and can be constructed using a complete set of proof rules

        j123123, 20 Декабря 2018

        Комментарии (46)
       
      1. Си / Говнокод #25202

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        enum crap
        {
            shit = 0,
            fuck,
            dick,
            ass,
            turd,
            fart,
        };
        
        static char *crap_to_str(int crap)
        {
            switch (crap)
            {
                case shit:
                {
                    return "shit";
                }
                case fuck:
                {
                    return "fuck";
                }
                case dick:
                {
                    return "dick";
                }
                case ass:
                {
                    return "ass";
                }
                case turd:
                {
                    return "turd";
                }
                case fart:
                {
                    return "fart";
                }
                default:
                {
                    return "!!!UNKNOWN CRAP!!!";
                }
            }
        }

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

        j123123, 18 Декабря 2018

        Комментарии (45)
      2. C++ / Говнокод #25193

        +3

        1. 1
        2. 2
        3. 3
        4. 4
        Кстати, разные эпизоды из Зеленого слоника можно сопоставить с разными статьями
        о C++. Если статья про какие-то новые возможности, которые вводятся в
        каком-нибудь С++20, это когда братишке покушать принесли. Если статья о том,
        как можно метапрограммировать на шаблонах, то это когда вилкой говно чистить.

        Ну что ты! Я тебе сейчас расскажу, вот смотри, Я тебе хорошую сейчас расскажу! Смотри, я… вот у нас здесь копипаста много… ой-ой… копипаста много, понимаешь? Смотри, копипаст, они тебе код читать мешает. А я вот, давай я здесь напишу метушни на темплейтах и консэкспрах с препроцессором сишным, и весь копипаст сокращу слышишь? Ну что, писать?

        j123123, 15 Декабря 2018

        Комментарии (21)
      3. Си / Говнокод #25171

        +4

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        65. 65
        66. 66
        67. 67
        68. 68
        69. 69
        70. 70
        71. 71
        72. 72
        73. 73
        74. 74
        75. 75
        76. 76
        77. 77
        78. 78
        79. 79
        80. 80
        81. 81
        82. 82
        83. 83
        84. 84
        85. 85
        86. 86
        87. 87
        88. 88
        89. 89
        90. 90
        #include <stdio.h>
        #include <inttypes.h>
        #include <stddef.h>
        
        void printuint64(const uint64_t state);
        uint64_t game_of_life8x8(const uint64_t old);
        uint8_t getbit(uint64_t in, uint8_t y, uint8_t x);
        
        uint8_t getbit(uint64_t in, uint8_t y, uint8_t x)
        {
          return !!((in) & (1ULL << ((y&0b111) + (x&0b111)*8)) );
        }
        
        uint64_t setbit(uint8_t y, uint8_t x, uint8_t bit)
        {
          if (bit)
          {
            return 1ULL << ((y&0b111) + (x&0b111)*8);
          }
          return 0;
        }
        
        uint64_t game_of_life8x8(const uint64_t old)
        {
          uint64_t new_state = 0;
          #define GETBIT(y,x,val) getbit(val, y, x)
          #define SETBIT(y,x,bit) setbit(y,x,bit)
          
          #define SUMAROUND(y,x,val) ( \
            GETBIT(y+1,x,val) + GETBIT(y-1,x,val) \
          + GETBIT(y,x+1,val) + GETBIT(y,x-1,val) \
          + GETBIT(y+1,x+1,val) + GETBIT(y+1,x-1,val) \
          + GETBIT(y-1,x+1,val) + GETBIT(y-1,x-1,val) \
          )
        
          #define CELLSTATE(y,x,val) \
          (GETBIT(y,x,old) == 1 ? \
            ( ((SUMAROUND(y,x,val) == 2 ) || ( SUMAROUND(y,x,val) == 3 )) ? 1 : 0) \
            : \
            ( ( SUMAROUND(y,x,val) == 3 ) ? 1 : 0 ) \
          )
        
          #define SETCELL_SH(y,x,val) SETBIT(y,x,CELLSTATE(y,x,val))
        
          #define FILL_LINE(y) \
            SETCELL_SH(y,7,old) | SETCELL_SH(y,6,old) | SETCELL_SH(y,5,old) | \
            SETCELL_SH(y,4,old) | SETCELL_SH(y,3,old) | SETCELL_SH(y,2,old) | \
            SETCELL_SH(y,1,old) | SETCELL_SH(y,0,old)
        
          new_state = FILL_LINE(7) | FILL_LINE(6) | FILL_LINE(5)
          |  FILL_LINE(4) | FILL_LINE(3) | FILL_LINE(2)
          |  FILL_LINE(1) | FILL_LINE(0);
        
          return new_state;
        }
        
        void printuint64(const uint64_t state)
        {
          for (size_t i = 7; i != SIZE_MAX; i--)
          {
            for (size_t j = 7; j != SIZE_MAX; j--)
            {
              printf("%u", !!((state >> (j+i*8)) & 1) );
            }
            printf("\n");
          }
        }
        
        int main(void)
        {
          // Glider
          uint64_t state =
          (( 0b01000000ULL ) << 8*7 ) |
          (( 0b00100000ULL ) << 8*6 ) |
          (( 0b11100000ULL ) << 8*5 ) |
          (( 0b00000000ULL ) << 8*4 ) |
          (( 0b00000000ULL ) << 8*3 ) |
          (( 0b00000000ULL ) << 8*2 ) |
          (( 0b00000000ULL ) << 8*1 ) |
          (( 0b00000000ULL ) << 8*0 );
        
          
          for (size_t i = 0; i < 50; i++)
          {
            printuint64(state);
            state = game_of_life8x8(state);
            printf("\n");
          }
          return 0;
        }

        Conway's game of life внутри uint64_t (8 на 8) с периодическими граничными условиями.

        j123123, 09 Декабря 2018

        Комментарии (148)
      4. JavaScript / Говнокод #25131

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        // https://dev.to/saigowthamr/how-to-reverse-a-string-in-javascript-3i9c
        
        // In this tutorial, we are going to learn three different ways to reverse a string
        // in JavaScript by using the reverse method, reduce method.
        
        // First way
        
        const str = "hello"
        
        str.split('').reverse().join('')
        
        //"olleh"
        
        
        // We used split method to split the string into an array of individual strings then chain it to reverse method.
        // Second way
        
        const str = "hello"
        
        [...str].reduce((prev,next)=>next+prev)
        
        //"olleh"
        
        // First, we spread the string using spread operator and reverse the string using the reduce method
        // Third way
        
        
        function reverseString(str){
        
          const arr = [...str]
          let reverse= "";
        
          while(arr.length){
             reverse = reverse + arr.pop()
          }
        
          return reverse
        }
        
        // I mostly like the Second way to reverse a string using reduce method.
        
        // Happy coding...

        Это видимо такой вид соревнований, типа как вкрутить лампочку в патрон наиболее упоротым и неочевидным способом. Нахрена это нужно обычному программисту? Может это такой способ ручной обфускации? Тогда понятно

        j123123, 29 Ноября 2018

        Комментарии (134)
      5. Си / Говнокод #25130

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        #include <stdio.h>
        #include <inttypes.h>
        #include <string.h>
        
        typedef struct
        {
          uint8_t arr[10];
          uint8_t pos;
          uint8_t is_swap;
        } arr10;
        
        arr10 bubble_sort_recursion(arr10 a);
        void bubble_sort (uint8_t arr[static 10]);
        
        
        void bubble_sort (uint8_t arr[static 10])
        {
          arr10 a;
          memcpy(a.arr, arr, sizeof(a.arr));
          a.pos = 0;
          a.is_swap = 0;
          a = bubble_sort_recursion(a);
          memcpy(arr, a.arr, sizeof(a.arr));
        }
        
        arr10 bubble_sort_recursion(arr10 a)
        {
          if (a.pos != 9)
          {
            if (a.arr[a.pos] > a.arr[a.pos + 1])
            {
              uint8_t tmp = a.arr[a.pos + 1];
              a.arr[a.pos + 1] = a.arr[a.pos];
              a.arr[a.pos] = tmp;
              a.is_swap = 1;
            }
            a.pos++;
            return bubble_sort_recursion(a);
          }
          else
          {
           if (a.is_swap == 0)
           {
             return a;
           }
           else
           {
             a.pos = 0;
             a.is_swap = 0;
             return bubble_sort_recursion(a);
           }
          }
        }
        
        int main(void)
        {
          uint8_t arr[10] = {244, 90, 254, 109, 33, 85, 69, 81, 126, 71};
          bubble_sort(arr);
          printf("%" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8,
                 arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9]);
          return 0;
        }

        Рекурсивная сортировка пузырьком

        j123123, 29 Ноября 2018

        Комментарии (7)
      6. C++ / Говнокод #25098

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        // https://habr.com/post/428846/
        // Работа со строками на этапе компиляции в современном C++
        
        // Определим статическую строку как массив символов, для удобства будем считать, что строка всегда оканчивается нулевым символом:
        
        template<size_t Size>
        using static_string = std::array<const char, Size>;
        
        constexpr static_string<6> hello = {'H', 'e', 'l', 'l', 'o', '\0'};
        
        constexpr auto hello = make_static_string("hello");
        
        // Здесь нам поможет одна из форм вариативного шаблона, которая позволяет развернуть
        // шаблонные аргументы как индексы для агрегатной инициализации нашей статической
        // строки из строкового литерала:
        
        template<size_t Size, size_t ... Indexes>
        constexpr static_string<sizeof ... (Indexes) + 1> make_static_string(const char (& str)[Size]) {
            return {str[Indexes] ..., '\0'};
        }
        
        constexpr auto hello = make_static_string<0, 1, 2, 3, 4>("hello"); // hello == "hello"
        
        // ...
        
        //Будем сравнивать строки посимвольно, пока не выявим различия, либо не достигнем конца хотя бы одной из строк.
        // Поскольку constexpr for еще не изобрели, воспользуемся рекурсией и тернарным оператором:
        
        template<size_t Size1, size_t Size2>
        constexpr int static_string_compare(
            const static_string<Size1>& str1, 
            const static_string<Size2>& str2,
            int index = 0) {
                return index >= Size1 && index >= Size2 ? 0 :
                    index >= Size1 ? -1 :
                        index >= Size2 ? 1 :
                            str1[index] > str2[index] ? 1 :
                                str1[index] < str2[index] ? -1 :
                                    static_string_compare(str1, str2, index + 1);
        }

        Ммм, какой БАГОР
        Крестобляди опять накостылили какой-то параши на шаблонах и радуются

        j123123, 20 Ноября 2018

        Комментарии (26)
      7. C++ / Говнокод #25054

        +2

        1. 1
        2. 2
        https://youtu.be/A4Gu0lfIKU0
        Нужно ли программисту изучать C++?

        Какое только дерьмо не найдешь на ютубе.

        C++ это кривая и дерьмовая высокоуровневая говнонадстройка над Си.
        Начинать с C++ точно не стоит, потому что в итоге получаются какие-то говнокодеры, не умеющие ничего делать без трижды обдристанной плюсовой стдлибы и всяких там классов с шаблонами и эксепшенами. Лучше уж начинать с Си, потом немного потыкать в лисп с его макросами, а потом посмотреть на плюсовые темплейты и констэкспры, тогда-то дерьмовейщая суть говноплюсов будет ясна.
        Что касается ООП в C++, то это просто сраное дерьмо. Понапридумывали каких-то паблик-приват-протектед наследований. Еще эта питушня с множественным наследованием и vtable, отсутствие метаклассов (RTTI - говно), отсутствие нормальных механизмов метапрограммирования (только какое-то кривое и убогое говно), отсутствие интроспекции, тьюринг-полные темплейты, не совпадающие с самим C++. Сраное парашное нагромождение разнообразной хуйни. Никакого базиса и ничего фундаментального в этому куске дерьма нет.

        j123123, 05 Ноября 2018

        Комментарии (2015)
      8. Си / Говнокод #25013

        +2

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        #include <stdio.h>
        #include <stdlib.h>
        #include <stdalign.h>
        #include <inttypes.h>
        #include <string.h>
        
        float sum_f(const float arr[], const size_t len);
        int32_t sum_i32t(const int32_t arr[], const size_t len);
        
        #define sum(a, b) _Generic((a), float*:   sum_f, \
                                     const float*:   sum_f, \
                                     int32_t*: sum_i32t,\
                                     const int32_t*: sum_i32t)(a, b)
        
        
        // foldl (+) 0 arr
        float sum_f(const float arr[], const size_t len)
        {
          return (len != 0) ? ( sum(arr+1, len-1) + arr[0] ) : 0;
        }
        
        int32_t sum_i32t(const int32_t arr[], const size_t len)
        {
          return (len != 0) ? ( sum(arr+1, len-1) + arr[0] ) : 0;
        }
        
        enum { we_want_int, we_want_float } what_we_want;
        
        void test(int www)
        {
          void *a;
          if (www == we_want_int)
          {
            uint8_t buf[sizeof(int32_t[10])] __attribute__ ((aligned (alignof(int32_t[10]))));
            a = (void *) buf;
            memcpy ( a, (int32_t[10]){1,2,3,4,5,6,7,8,9,10},
                     sizeof((int32_t[10]){1,2,3,4,5,6,7,8,9,10})
                    );
            printf("%" PRIi32 "\n", sum((int32_t *)a, 10));
          }
          else if (www == we_want_float)
          {
            uint8_t buf[sizeof(float[10])] __attribute__ ((aligned (alignof(float[10]))));
            a = (void *) buf;
            memcpy ( a, (float[10]){1,2,3,4,5,6,7,8,9,10},
                     sizeof((float[10]){1,2,3,4,5,6,7,8,9,10})
                    );
            printf("%f\n", sum((float *)a, 10));    
          }
        }
        
        int main(void)
        {
          test(we_want_int);
          test(we_want_float);
          return EXIT_SUCCESS;
        }

        https://wandbox.org/permlink/TwbKHE8l7ZJc6PNI
        https://govnokod.ru/25005#comment436646
        https://i.imgur.com/yFYfuED.jpg

        j123123, 23 Октября 2018

        Комментарии (454)
      9. C++ / Говнокод #25009

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        /*
        https://habr.com/post/246009/
        
        Это вторая статья в цикле «Теория категорий для программистов».
        
        ...
        
        Я хотел бы сказать вам, что есть шаблон в стандартной библиотеке С++,
        который принимает две функции и возвращает их композицию, но такого
        нет.
        
        Примечание переводчика: но такой не сложно написать на С++14 (я опускаю
        тонны деталей владения и шаблонной магии для проверок, что эти функции
        и тип аргумента действительно можно компоновать):
        */
        
        template <typename T>
        struct function_arg: public function_arg<decltype(&T::operator())> {};
        
        template<typename ReturnType, typename Arg>
        struct function_arg<ReturnType(Arg) const> {
        	using type = Arg;
        };
        
        template<typename ClassType, typename ReturnType, typename Arg>
        struct function_arg<ReturnType(ClassType::*)(Arg) const> {
        	using type = Arg;
        };
        
        template<typename T>
        using function_arg_t = typename function_arg<T>::type;
        
        template<typename F, typename G>
        auto compose(F&& f, G&& g) {
        	return [f = std::forward<F>(f), g = std::forward<G>(g)]
        		(function_arg_t<F>&& a) {return g(f(std::forward<function_arg_t<F>>(a)));};
        }

        Поэтому я за C++

        j123123, 22 Октября 2018

        Комментарии (17)
      10. C++ / Говнокод #25005

        +1

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        6. 6
        7. 7
        8. 8
        Что-то я давно не обсирал тут хуиту, которую пишут про 
        плюсы на хабре
        
        https://habr.com/post/426965/
        
        Идеального способа для обработки ошибок не существует. 
        До недавнего  времени в С++ были почти все возможные 
        способы обработки ошибок кроме  монад.

        В этой замечательной статье забыли упомянуть setjmp/longjmp(std::longjmp если угодно), который хоть и из Си, но в C++ его никто не запрещал.
        А еще signal (std::signal, если угодно), который хоть и из Си, но в C++ его никто не запрещал.
        А еще goto (почему нет std::goto? Запилите быстраблядь!), который хоть и из Си, но в C++ его никто не запрещал.

        А вообще, зачем иметь в языке такое количество говна в СТАНДАРТНОЙ БИБЛИОТЕКЕ для такой хуиты?

        Вот еще в тему: https://video.twimg.com/tweet_video/De78Qn2XcAAQqfS.mp4

        j123123, 20 Октября 2018

        Комментарии (174)
      1. C++ / Говнокод #24869

        −10

        1. 1
        https://i.imgur.com/2GTA40l.png

        j123123, 07 Октября 2018

        Комментарии (49)
      2. Куча / Говнокод #24856

        −3

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        6. 6
        7. 7
        8. 8
        http://compuhumour.narod.ru/anecdot/programmer.html
        У программиста спрашивают:
         - Hе помнишь, сколько будет два в четвеpтой?
          - (без запинки) Шестнадцать.
          - А шестнадцать в четвеpтой?
          - (без запинки) Шестьдесят пять тысяч пятьсот тpидцать шесть.
          - Вот голова, ну ты даешь!!! Hу, а тpи в четвеpтой?
          - (после паузы) Hе помню точно. Дpобное число получается.

        То ли дело Сетунь

        j123123, 04 Октября 2018

        Комментарии (64)
      3. Assembler / Говнокод #24834

        0

        1. 1
        https://github.com/Microsoft/MS-DOS/tree/master/v2.0/source

        [MS-DOS 1.25 & 2.0 Source] Copyright (c) Microsoft Corporation All rights reserved. MIT License Permission is hereby granted, freeof charge, to any person obtaining a copy of this software and associateddocumentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,merge, publish, distribute, sublicense, and/or sell copies of the Software, andto permit persons to whom the Software is furnished to do so, subject to the following conditions:

        The above copyright notice andthis permission notice shall be included in all copies or substantial portionsof the Software.

        THE SOFTWARE IS PROVIDED AS IS,WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TOTHE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE ANDNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLEFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ORTHE USE OR OTHER DEALINGS IN THE SOFTWARE.

        j123123, 29 Сентября 2018

        Комментарии (19)
      4. SQL / Говнокод #24817

        0

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        https://ru.wikipedia.org/wiki/Хранимая_процедура#Возможности_программирования
        Начиная с версии Oracle 10g поддерживается так называемая естественная компиляция
        (native compilation) хранимого процедурного кода в Си и затем в машинный код целевой
        машины, после чего при вызове хранимой процедуры происходит прямое выполнение её
        скомпилированного объектного кода.

        Можно сделать вирусню, живущую в этих самых хранимых процедурах в машинном коде и инфицирующую другие БД с хранимыми процедурами

        j123123, 26 Сентября 2018

        Комментарии (21)
      5. Си / Говнокод #24807

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        #include <stdio.h>
        #include <inttypes.h>
        
        static const uint32_t pow2[511] ={
        0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256,
        289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156,
        1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401,
        2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096,
        4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241,
        6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836,
        9025, 9216, 9409, 9604, 9801, 10000, 10201, 10404, 10609, 10816, 11025, 11236, 11449, 11664,
        11881, 12100, 12321, 12544, 12769, 12996, 13225, 13456, 13689, 13924, 14161, 14400, 14641,
        14884, 15129, 15376, 15625, 15876, 16129, 16384, 16641, 16900, 17161, 17424, 17689, 17956,
        18225, 18496, 18769, 19044, 19321, 19600, 19881, 20164, 20449, 20736, 21025, 21316, 21609,
        21904, 22201, 22500, 22801, 23104, 23409, 23716, 24025, 24336, 24649, 24964, 25281, 25600,
        25921, 26244, 26569, 26896, 27225, 27556, 27889, 28224, 28561, 28900, 29241, 29584, 29929,
        30276, 30625, 30976, 31329, 31684, 32041, 32400, 32761, 33124, 33489, 33856, 34225, 34596,
        34969, 35344, 35721, 36100, 36481, 36864, 37249, 37636, 38025, 38416, 38809, 39204, 39601,
        40000, 40401, 40804, 41209, 41616, 42025, 42436, 42849, 43264, 43681, 44100, 44521, 44944,
        45369, 45796, 46225, 46656, 47089, 47524, 47961, 48400, 48841, 49284, 49729, 50176, 50625,
        51076, 51529, 51984, 52441, 52900, 53361, 53824, 54289, 54756, 55225, 55696, 56169, 56644,
        57121, 57600, 58081, 58564, 59049, 59536, 60025, 60516, 61009, 61504, 62001, 62500, 63001,
        63504, 64009, 64516, 65025, 65536, 66049, 66564, 67081, 67600, 68121, 68644, 69169, 69696,
        70225, 70756, 71289, 71824, 72361, 72900, 73441, 73984, 74529, 75076, 75625, 76176, 76729,
        77284, 77841, 78400, 78961, 79524, 80089, 80656, 81225, 81796, 82369, 82944, 83521, 84100,
        84681, 85264, 85849, 86436, 87025, 87616, 88209, 88804, 89401, 90000, 90601, 91204, 91809,
        92416, 93025, 93636, 94249, 94864, 95481, 96100, 96721, 97344, 97969, 98596, 99225, 99856,
        100489, 101124, 101761, 102400, 103041, 103684, 104329, 104976, 105625, 106276, 106929,
        107584, 108241, 108900, 109561, 110224, 110889, 111556, 112225, 112896, 113569, 114244,
        114921, 115600, 116281, 116964, 117649, 118336, 119025, 119716, 120409, 121104, 121801,
        122500, 123201, 123904, 124609, 125316, 126025, 126736, 127449, 128164, 128881, 129600,
        130321, 131044, 131769, 132496, 133225, 133956, 134689, 135424, 136161, 136900, 137641,
        138384, 139129, 139876, 140625, 141376, 142129, 142884, 143641, 144400, 145161, 145924,
        146689, 147456, 148225, 148996, 149769, 150544, 151321, 152100, 152881, 153664, 154449,
        155236, 156025, 156816, 157609, 158404, 159201, 160000, 160801, 161604, 162409, 163216,
        164025, 164836, 165649, 166464, 167281, 168100, 168921, 169744, 170569, 171396, 172225,
        173056, 173889, 174724, 175561, 176400, 177241, 178084, 178929, 179776, 180625, 181476,
        182329, 183184, 184041, 184900, 185761, 186624, 187489, 188356, 189225, 190096, 190969,
        191844, 192721, 193600, 194481, 195364, 196249, 197136, 198025, 198916, 199809, 200704,
        201601, 202500, 203401, 204304, 205209, 206116, 207025, 207936, 208849, 209764, 210681,
        211600, 212521, 213444, 214369, 215296, 216225, 217156, 218089, 219024, 219961, 220900,
        221841, 222784, 223729, 224676, 225625, 226576, 227529, 228484, 229441, 230400, 231361,
        232324, 233289, 234256, 235225, 236196, 237169, 238144, 239121, 240100, 241081, 242064,
        243049, 244036, 245025, 246016, 247009, 248004, 249001, 250000, 251001, 252004, 253009,
        254016, 255025, 256036, 257049, 258064, 259081, 260100 };
        
        #define SQR(x) pow2[x]
        
        uint16_t mul8b(uint8_t a, uint8_t b)
        {
          return (SQR((uint16_t)a+(uint16_t)b) - (SQR(a) + SQR(b))) >> 1;
        }
        
        int main(void)
        {
          uint8_t a = 255, b = 255;
          printf("%" PRIu8 " * " "%"PRIu8 " = "  "%"PRIu16, a, b, mul8b(a, b));
          return 0;
        }

        Мегаинновационный алгоритм умножения двух чисел на основе таблицы поиска с предвычисленными квадратами.
        По формуле ab = ((a+b)^2 - (a^2+b^2))/2
        Можно упихать в какой-нибудь дохлый контроллер без инструкций умножения

        j123123, 24 Сентября 2018

        Комментарии (71)
      6. Куча / Говнокод #24806

        +2

        1. 1
        https://i.imgur.com/foJHCYt.jpg

        Новые винды теперь даже БСОД не могут полностью вывести полностью.
        Хотели сделать красивый нескучный bsod с грустным смайликом, а он теперь не выводится из-за всей этой красивости и нескучности. Оставили б старый bsod - была бы какая-то инфа о причинах самого бсода. Но зато тут теперь нескучный смайлик.

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

        j123123, 24 Сентября 2018

        Комментарии (96)
      7. Objective C / Говнокод #24721

        +1

        1. 1
        2. 2
        3. 3
        https://pbs.twimg.com/media/Dl4x_P-XsAAPfgC.jpg
        
        https://twitter.com/_inside/status/1035319938641276928 The Apple Watch pride face is hardcoded to not show up if the paired iPhone is using the Russian locale

        > Однако 30 октября 2014 года в статье на Bloomberg Businessweek Кук совершил каминг-аут, признавшись в своей гомосексуальности, и выразил надежду, что это признание поможет другим геям принять себя и вдохновит их на борьбу за свои права.

        Бабло победило принципы

        j123123, 05 Сентября 2018

        Комментарии (39)
      8. Си / Говнокод #24655

        −4

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-wsaasyncselect
        int WSAAsyncSelect(
          SOCKET s,
          HWND   hWnd,
          u_int  wMsg,
          long   lEvent
        );
        
        /*
        
        hWnd
        
        A handle that identifies the window that will receive a message when a network event occurs.
        */

        Почему виндовые асинхронные (или правильно говорить "небликирующиеся") сокеты так черезжопно сделаны? Нафига им через HWND надо месседжи слать? Что, другого способа нет для оповещений?
        Требовать для работы асинхронных сокетов чтоб какое-то окно было это как требовать зубную щетку для входа в туалет чтоб посрать

        j123123, 24 Августа 2018

        Комментарии (16)
      9. Си / Говнокод #24560

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
        
        1.14:   Ну а если честно, на какой-нибудь реальной машине используются
                ненулевые внутренние представления нулевых указателей или разные
                представления для указателей разных типов?
        
        О:	Серия Prime 50 использует сегмент 07777, смещение 0 для	нулевого
                указателя, по крайней мере, для PL/I. Более поздние модели используют
                сегмент 0, смещение 0 для нулевых указателей С, что делает
                необходимыми новые инструкции, такие как TCNP (проверить нулевой
                указатель С), которые вводятся для совместимости с уцелевшими
                скверно написанными С программами, основанными на неверных
                предположениях. Старые машины Prime с адресацией слов были печально
                знамениты тем, что указатели на байты (char *) у них были большего
                размера, чем указатели на слова (int *).
        
                Серия Eclipse MV корпорации Data General имеет три аппаратно
                поддерживаемых типа указателей (указатели на слово, байт и бит), два
        	из которых - char * и void * используются компиляторами	С. Указатель
        	word * используется во всех других случаях.
        
        	Некоторые центральные процессоры Honeywell-Bull	используют код 06000
        	для внутреннего	представления нулевых указателей.
        
        	Серия CDC Cyber	180 использует 48-битные указатели, состоящие из
                кольца (ring), сегмента и смещения. Большинство пользователей
        	(в кольце 11) имеют в качестве нулевых указателей код 0xB00000000000.
        
        	Символическая Лисп-машина с теговой архитектурой даже не имеет
        	общеупотребительных указателей;	она использует пару <NIL,0> (вообще
                говоря, несуществующий <объект, смещение> хендл) как нулевой
                указатель С.
        
                В зависимости от модели памяти, процессоры 80*86 (PC) могут
                использовать либо 16-битные указатели на данные и 32-битные указатели
                на функции,  либо, наоборот, 32-битные указатели на данные и 16-битные
                - на функции.
        
        	Старые модели HP 3000 используют различные схемы адресации для байтов
                и для слов. Указатели на char и на void, имеют, следовательно,
                другое представление, чем указатели на int (на структуры и т.п.),
        	даже если адрес	одинаков.

        Более поздние модели используют сегмент 0, смещение 0 для нулевых указателей С, что делает необходимыми новые инструкции, такие как TCNP (проверить нулевой указатель С), которые вводятся для совместимости с уцелевшими скверно написанными С программами, основанными на неверных предположениях.

        Делать специальную инструкцию в процессоре для криво написанного сишного кода. Какой багор!

        j123123, 01 Августа 2018

        Комментарии (29)
      10. Си / Говнокод #24557

        +2

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        http://faqs.org.ru/progr/c_cpp/watcom_c.htm
        
                        WATCOM C/C++ FAQ
        
                           version 3.0
                           29 Aug 1998
        
                compiled by Lenik Terenin, 2:5061/1
        
        Maintained by Cyril Pertsev, 2:5020/1415.1
        Please send your additions and suggestions to the above address.
        
        Для удобства потpебления данного текста
        добавления выделены символом квотинга
        
        ...
        
        > Q: Гpафическая библиотека ваткома отказывается пеpеключать pежимы/банки
        > или делает это кpиво
        
        >A: В результате ковыряния в библиотеке выяснилось, что криворукие
        >ваткомовцы
        >совершенно не задумываются ни о какой переносимости и универсальности их
        >библиотек. В результате, если видео-карта имеет в биосе прошитое имя
        >производителя или другую информацию о нем, то для нее будет вызываться
        >вместо
        >функции переключения банков через VESA, другая функция, работающая с
        >картой
        >напрямую (иногда даже через порты).
        >Единственная проблема, что у каждого производителя (ATI, в моем случае),
        >рано
        >или поздно выходят новые и продвинутые карты, раскладка портов в которых
        >может
        >отличаться от той, которая использовалась в старых моделях. В результате,
        >все
        >это свинство начинает глючить и иногда даже виснуть.
        >После того, как я руками заткнул ему возможность использовать "родные"
        >фишки
        >для конкретной карты и прописал пользоваться только VESA -- все работает
        >как из
        >пушки ;))
        >Как затыкать -- а просто, есть переменная: _SVGAType, которую я
        >описывается
        >следующим образом: "extern "C" int _SVGAType;", и потом _перед_ (важно!)
        >вызовом _setvideomode нужно сказать "_SVGAType = 1;".

        Люблю читать несвежие FAQ.

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

        j123123, 31 Июля 2018

        Комментарии (114)
       
      1. Си / Говнокод #24550

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        copy(v) char *v; {	/* copy ctokn to v */
        	char *p;
        
        	p=ctokn;
        	while( *v++ = *p++ );
        	}
        
        compare(v) char *v; {	/* compare ctokn with v */
        	char *p;
        
        	for( p=ctokn; ; ++p ){
        		if( *p != *v++ ) return( 0 );
        		if( *p == 0 ) return(1);
        		}
        	}
        
        int *yalloc(n){ /* allocate n+1 words from vector mem */
        	int *omem;
        	omem = mem;
        	mem =+ n+1;
        	if(mem-mem0 >= memsiz) error("memory overflow");
        	return(omem);
        	}
        
        aryfil( v, n, c ) int *v,n,c; { /* set elements 0 through n-1 to c */
          int i;
          for( i=0; i<n; ++i ) v[i] = c;
          }
        
        union( a, b, c ) int *a, *b, *c; {
          /* set a to the union of b and c */
          /* a may equal b */
          /* return 1 if c is not a subset of b, 0 otherwise */
        
          _REGISTER int i, x, sub;
        
          sub = 0;
          for( i=0; i<tbitset; ++i ){
            x = b[i] | c[i];
            if( x != b[i] ) sub=1;
            a[i] = x;
            }
          return( sub );
          }
        
        prlook( pp ) int *pp;{
        	int j;
        	pp = pp->lset;
        	if( pp == 0 ) printf("\tNULL");
        	else {
        		printf(" { " );
        		for( j=1; j<=nterms; ++j ){
        			if( (pp[j>>4]>>(j&017) )&01 != 0 ) printf( "%s ", symnam(j) );
        			}
        		printf( "}" );
        		}
        	}

        https://github.com/eunuchs/unix-archive/blob/master/PDP-11/Trees/V6/usr/source/yacc/source/y1.c

        https://www.tuhs.org//Archive/Distributions/Research/Dennis_v6/v6src.tar.gz

        Для любителей обмазываться несвежим сишкокодом. Research Unix

        j123123, 28 Июля 2018

        Комментарии (15)
      2. C++ / Говнокод #24542

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        // Non-constant constant-expressions in C++
        // http://b.atch.se/posts/non-constant-constant-expressions/
        // The Implementation
        
        constexpr int flag (int);
        
        template<class Tag>
        struct writer {
          friend constexpr int flag (Tag) {
            return 0;
          }
        };
        
        template<bool B, class Tag = int>
        struct dependent_writer : writer<Tag> { };
        
        template<
          bool B = noexcept (flag (0)),
          int    =   sizeof (dependent_writer<B>)
        >
        constexpr int f () {
          return B;
        }
        
        int main () {
          constexpr int a = f ();
          constexpr int b = f ();
        
          static_assert (a != b, "fail");
        }

        Note: clang incorrectly shows the wrong behavior, a workaround is available in the appendix.

        j123123, 26 Июля 2018

        Комментарии (7)
      3. Си / Говнокод #24517

        −3

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        // https://github.com/Qqwy/raii_with/blob/74e4c66a821fba6a483d62a8c583b3fab06e3443/raii/raii.h#L60
        
        /**
         * Custom Control Structure Macro to provide Resource Acquisition Is Initialization (and Resource Relinquishment is Destruction).
         *
         * Use this to run a block of code with `var_decl` initialized to `init`, where at the end of the block (or at an earlier `safe_return`),
         * the passed `destr`-function will automatically be called with the given resource.
         *
         * Gotcha's:
         * 1. Do not use `return` from within `raii_with`, but only `safe_return`, because otherwise the destructors will not be run.
         * 2. Do not perform pointer-swaps with `var_decl`; the destructor will still be run on the original structure, because `raii` keeps its own reference to the resource.
         */
        #define raii_with(var_decl, init, destr)                                \
          while(1) /* i.c.m. break on l.4, so we can jump past the user-supplied block */ \
            if(0)                                                               \
            raii_glue(__raii_with_finished, __LINE__):                              \
              break;                                                            \
            else                                                                \
              /* initialize _tmp lifetime list elem so replacement `raii_lifetime_list` can have previous one as tail. */ \
              for(struct raii_lifetime_list_t _tmp = {.elem.resource = init, .elem.destructor = destr, .next = raii_lifetime_list};;) \
                /* initialize user-supplied variable name */                    \
                for(var_decl = _tmp.elem.resource;;)                            \
                  if (1) {                                                      \
                    /* Fill `_tmp`'s tail before `raii_lifetime_list` is shadowed */ \
                    _tmp.next = raii_lifetime_list;                             \
                    goto raii_glue(__raii_with_setup, __LINE__);                    \
                  } else                                                        \
                  raii_glue(__raii_with_setup, __LINE__):                           \
                    /* Shadow `raii_lifetime_list` with inner version */        \
                    for(struct raii_lifetime_list_t *raii_lifetime_list = &_tmp;;) \
                      if(1){                                                    \
                        goto raii_glue(__raii_with_body, __LINE__);                 \
                      } else                                                    \
                        while (1) /* so break works as expected */              \
                          while (1) /*so continue works as expected */          \
                            if (1){                                             \
                              /*after the else-block (or break or continue), destruct and finish */ \
                              destruct_raii_lifetime(raii_lifetime_list->elem); \
                              goto raii_glue(__raii_with_finished, __LINE__);       \
                            } else                                              \
                            raii_glue(__raii_with_body, __LINE__):
        
        
        #endif // RAII_WITH_H

        raii

        A simple library to provide RAII in standard-compliant C99, using raii_with(resource, initializer, destructor) { ... }-syntax:

        j123123, 19 Июля 2018

        Комментарии (242)
      4. C++ / Говнокод #24501

        0

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        6. 6
        7. 7
        8. 8
        // https://habr.com/company/JetBrains/blog/249479/
        
        Привет, Хабр!
        
        Некоторое время назад мы объявили конкурс — требовалось продолжить фразу:
        Бьёрн Страуструп создал С++ 36 лет назад, и он до сих пор востребован и пользуется популярностью у разработчиков, потому что...
        
        Спасибо всем участникам за массу положительных эмоций и разнообразные предположения о том, что же сделало C++ таким популярным.

        Посовещавшись, мы выбрали топ-6 ответов:

        j123123, 16 Июля 2018

        Комментарии (63)
      5. Си / Говнокод #24496

        +5

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        void sort3(uint32_t a[static 3])
        {
          //                   0     1     2     3     4     5     6     7     8
          uint32_t tmp[9] = {a[0], a[1], a[2], a[0], a[1], a[0], a[2], a[1], a[0]};
          uint8_t bits = (a[0] <= a[1]) | ((a[1] <= a[2]) << 1) | ((a[0] <= a[2]) << 2);
          static const uint8_t b[] =
          {
            [0b000] = 6,
            [0b001] = 2,
            [0b010] = 1,
            [0b101] = 5,
            [0b110] = 4,
            [0b111] = 0,
          };
          memcpy(a, tmp+b[bits], 3*sizeof(uint32_t));
        }

        Новая инновационная сортировка на 3 элемента без if-ов
        https://wandbox.org/permlink/pTLXgxKKQuaiVCxb

        j123123, 15 Июля 2018

        Комментарии (176)
      6. C++ / Говнокод #24487

        +1

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        65. 65
        66. 66
        67. 67
        68. 68
        69. 69
        70. 70
        71. 71
        72. 72
        73. 73
        74. 74
        75. 75
        76. 76
        77. 77
        78. 78
        79. 79
        80. 80
        81. 81
        82. 82
        // https://habr.com/post/417027/
        // Как я стандартную библиотеку C++11 писал или почему boost такой страшный
        // https://github.com/oktonion/stdex/blob/1472fd5e2f5e0d10a136518631055c3aad2e1cfd/stdex/include/thread.hpp#L51
        
        
        		template<class R, class T1>
        		struct _function_traits<R(*)(T1)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T1 argument_type;
        		};
        
        		template<class R, class T1, class T2>
        		struct _function_traits<R(*)(T1, T2)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			
        			
        		};
        
        		template<class R, class T1, class T2, class T3>
        		struct _function_traits<R(*)(T1, T2, T3)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			typedef T3 arg3_type;
        		};
        
        		template<class R, class T1, class T2, class T3, class T4>
        		struct _function_traits<R(*)(T1, T2, T3, T4)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			typedef T3 arg3_type;
        			typedef T4 arg4_type;
        		};
        
        		template<class R, class T1, class T2, class T3, class T4,
        			class T5>
        		struct _function_traits<R(*)(T1, T2, T3, T4, T5)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			typedef T3 arg3_type;
        			typedef T4 arg4_type;
        			typedef T5 arg5_type;
        		};
        
        		template<class R, class T1, class T2, class T3, class T4,
        			class T5, class T6>
        		struct _function_traits<R(*)(T1, T2, T3, T4, T5, T6)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			typedef T3 arg3_type;
        			typedef T4 arg4_type;
        			typedef T5 arg5_type;
        			typedef T6 arg6_type;
        		};
        
        		template<class R, class T1, class T2, class T3, class T4,
        			class T5, class T6, class T7>
        		struct _function_traits<R(*)(T1, T2, T3, T4, T5, T6, T7)>
        		{
        			typedef R result_type;
        			typedef T1 arg1_type;
        			typedef T2 arg2_type;
        			typedef T3 arg3_type;
        			typedef T4 arg4_type;
        			typedef T5 arg5_type;
        			typedef T6 arg6_type;
        			typedef T7 arg7_type;
        		};
        
        ...

        > На дворе был 2017 год! Уже C++ 17 активно вводился в GCC, clang, Visual Studio, везде был decltype (since C++ 11), constexpr (since C++ 11, но существенно доработан), модули уже почти на подходе, хорошее время было. Я же находился на работе и с некоторым неодобрением смотрел на очередной Internal Compiler Error в своем Borland C++ Builder 6.0, а так же на множество ошибок сборки с очередной версией библиотеки boost. Думаю, теперь вы понимаете, откуда взялась эта тяга к велосипедостроению. У нас использовался Borland C++ Builder 6.0 и Visual Studio 2010 под Windows, g++ версии 4.4.2 или ниже под QNX и под некоторые unix системы. От MacOS мы были избавлены, что несомненно было плюсом. Ни о каких других компиляторах (под C++ 11 в том числе) речи даже быть не могло по соображениям, которые мы оставим за пределами данной статьи.

        > «А что там может быть на столько сложного» — закралась мысль в мой измученный попытками завести boost под старый-добрый builder мозг. «Мне всего то нужно type_traits, thread, mutex, возможно chrono, nullptr было бы еще неплохо.» — рассудил я и принялся за работу.

        j123123, 13 Июля 2018

        Комментарии (3)
      7. C++ / Говнокод #24474

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        #include <stdio.h>
        #include <stdlib.h>
        #include <inttypes.h>
        
        void test1(void)
        {
          printf("test1\n");
        }
        void test2(void)
        {
          printf("test2\n");
        }
        void test3(void)
        {
          printf("test3\n");
        }
        void test4(void)
        {
          printf("test4\n");
        }
        
        uint8_t func_dist[3] = {(uint8_t)((char *)test2-(char *)test1), (uint8_t)((char *)test3-(char *)test2), (uint8_t)((char *)test4-(char *)test3)};
        
        void callf(uint8_t fn)
        {
          size_t sum_dis = 0;
          for (uint8_t i = 0; i < fn; i++)
          {
            sum_dis += func_dist[i];
          }
          ( (void(*)(void)) ((char *)test1+sum_dis) )  ();
        }
        
        int main(void)
        {
          callf(0);
          callf(1);
          callf(2);
          callf(3);
          return EXIT_SUCCESS;
        }

        Зожатие указателей. Главное чтоб длины функций не превышали 255 и чтоб функции шли строго подряд, как они объявлены кода
        Как сделать чтобы это компилировалось сишкой?

        j123123, 10 Июля 2018

        Комментарии (12)
      8. Си / Говнокод #24447

        0

        1. 001
        2. 002
        3. 003
        4. 004
        5. 005
        6. 006
        7. 007
        8. 008
        9. 009
        10. 010
        11. 011
        12. 012
        13. 013
        14. 014
        15. 015
        16. 016
        17. 017
        18. 018
        19. 019
        20. 020
        21. 021
        22. 022
        23. 023
        24. 024
        25. 025
        26. 026
        27. 027
        28. 028
        29. 029
        30. 030
        31. 031
        32. 032
        33. 033
        34. 034
        35. 035
        36. 036
        37. 037
        38. 038
        39. 039
        40. 040
        41. 041
        42. 042
        43. 043
        44. 044
        45. 045
        46. 046
        47. 047
        48. 048
        49. 049
        50. 050
        51. 051
        52. 052
        53. 053
        54. 054
        55. 055
        56. 056
        57. 057
        58. 058
        59. 059
        60. 060
        61. 061
        62. 062
        63. 063
        64. 064
        65. 065
        66. 066
        67. 067
        68. 068
        69. 069
        70. 070
        71. 071
        72. 072
        73. 073
        74. 074
        75. 075
        76. 076
        77. 077
        78. 078
        79. 079
        80. 080
        81. 081
        82. 082
        83. 083
        84. 084
        85. 085
        86. 086
        87. 087
        88. 088
        89. 089
        90. 090
        91. 091
        92. 092
        93. 093
        94. 094
        95. 095
        96. 096
        97. 097
        98. 098
        99. 099
        100. 100
        void check_manifest_line (int p) {
          static char c[MAX_LINE_LEN + 1];
          int l = p - START_MANIFEST_POSITION;
          if (l <= MAX_LINE_LEN && l > 4) {
            get_binlog_data (c, START_MANIFEST_POSITION, l);
            c[l] = 0;
            char *pp = c;
            int op = -1;
            if (l >= 6 && !memcmp (c, "start", 5)) {
              op = 1; 
              pp += 5;
            } else if (l >= 5 && !memcmp (c, "stop", 4)) {
              op = 2;
              pp += 4;
            } else if (l >= 8 && !memcmp (c, "version", 7)) {
              op = 3;
              pp += 7;
            }
            if (is_whitespace (*pp) && op > 0) {      
              pp ++;
              pp = eat_whitespace (pp);
              if (!*pp) {
                START_MANIFEST_POSITION = p + 1;
                return;
              }
              if (op == 1 || op == 2) {
                char *rr = pp;
                pp = eat_not_whitespace (pp);
                char *zz = pp;
                pp = eat_whitespace (pp);
                *zz = 0;
                if (pp == c + l && zz - rr > 0) {
                  struct cluster *C = CC;
                  int x = BINLOG_NAME_LEN - 1;
                  while (x >= 0 && BINLOG_NAME[x] != '/') {
                    x--;
                  }
                  add_cluster (BINLOG_NAME, x + 1, rr, (MAIN_REPLICA ? 2 : 0) + (op == 2 ? 4 : 0) + (1 << 30));
                  CC = C;
                }
              } else {
                assert (op == 3);
                char *rr = pp;
                pp = eat_not_whitespace (pp);
                char *rr_end = pp;
                pp = eat_whitespace (pp);
                *rr_end = 0;
                if (!*pp) {
                  START_MANIFEST_POSITION = p + 1;
                  return;
                }
                int version = atoi (pp);
                pp = eat_not_whitespace (pp);
                pp = eat_whitespace (pp);
                if (!*pp) {
                  START_MANIFEST_POSITION = p + 1;
                  return;
                }
                long long size = atoll (pp);
                pp = eat_not_whitespace (pp);
                pp = eat_whitespace (pp);
                if (pp == c + l && rr_end > rr && version > 0 && size >= 0) {
                  struct cluster *C = CC;
                  int x = BINLOG_NAME_LEN - 1;
                  while (x >= 0 && BINLOG_NAME[x] != '/') {
                    x --;
                  }
                  int rrlen = rr_end - rr;
                  int i;
                  for (i = 0; i < max_cluster; i++) if (Clusters[i]) {
                    //fprintf (stderr, "i = %d, binlog_name = %s, rr = %s, rrlen = %d\n", i, Clusters[i]->binlog_name, rr, rrlen);
                    const char *s = Clusters[i]->binlog_name;
                    int l = strlen (Clusters[i]->binlog_name) - 1;
                    while (l >= 0 && s[l] != '/') { l --; }
                    s = s + l + 1;
                    if (!memcmp (s, rr, rrlen) && s[rrlen] == '.') {
                      int old = atoi (s + rrlen + 1);
                      if (old >= version) {
                        vkprintf (0, "New version %d, old %d. Skipping\n", version, old);
                        START_MANIFEST_POSITION = p + 1;
                        return;
                      }
                      if (unlink (Clusters[i]->binlog_name) < 0) {
                        fprintf (stderr, "Can not delete old file %s: %m\n", Clusters[i]->binlog_name);
                      }
                      delete_cluster (i);
                    }
                  }
                  static char name[1024];
                  memcpy (name, rr, rrlen);
                  name[rrlen] = '.';
                  sprintf (name + rrlen + 1, "%06d", version);
                  add_cluster (BINLOG_NAME, x + 1, name, (MAIN_REPLICA ? 2 : 0) + (1 << 30));
                  LAST_SIZE = size;
                  CC = C;
                }
              }
            }
          }
          START_MANIFEST_POSITION = p + 1;

        https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/copyfast/copyfast-engine.c#L1081-L1181


        Очередная порция вконтактового говнокода.

        j123123, 05 Июля 2018

        Комментарии (4)
      9. C++ / Говнокод #24437

        0

        1. 1
        2. 2
        3. 3
        4. 4
        5. 5
        6. 6
        https://github.com/mikael-s-persson/templight
        Templight 2.0 - Template Instantiation Profiler and Debugger
        
        Templight is a Clang-based tool to profile the time and memory consumption of
        template instantiations and to perform interactive debugging sessions to gain
        introspection into the template instantiation process.

        Шаблонные метапрограммисты будут довольны.
        Осталось еще сделать такое же, но чтобы constexpr можно было профилировать и интерактивно дебажить

        j123123, 02 Июля 2018

        Комментарии (20)
      10. Си / Говнокод #24355

        0

        1. 01
        2. 02
        3. 03
        4. 04
        5. 05
        6. 06
        7. 07
        8. 08
        9. 09
        10. 10
        11. 11
        12. 12
        13. 13
        14. 14
        15. 15
        16. 16
        17. 17
        18. 18
        19. 19
        20. 20
        21. 21
        22. 22
        23. 23
        24. 24
        25. 25
        26. 26
        27. 27
        28. 28
        29. 29
        30. 30
        31. 31
        32. 32
        33. 33
        34. 34
        35. 35
        36. 36
        37. 37
        38. 38
        39. 39
        40. 40
        41. 41
        42. 42
        43. 43
        44. 44
        45. 45
        46. 46
        47. 47
        48. 48
        49. 49
        50. 50
        51. 51
        52. 52
        53. 53
        54. 54
        55. 55
        56. 56
        57. 57
        58. 58
        59. 59
        60. 60
        61. 61
        62. 62
        63. 63
        64. 64
        65. 65
        66. 66
        67. 67
        68. 68
        69. 69
        70. 70
        71. 71
        72. 72
        73. 73
        74. 74
        75. 75
        76. 76
        77. 77
        78. 78
        79. 79
        80. 80
        81. 81
        82. 82
        83. 83
        84. 84
        85. 85
        86. 86
        87. 87
        88. 88
        89. 89
        90. 90
        91. 91
        92. 92
        93. 93
        94. 94
        95. 95
        96. 96
        97. 97
        98. 98
        99. 99
        // https://github.com/google/brotli/blob/29dc2cce9090d6c92c908116e11373bc7fdc8ad1/c/enc/static_dict.c#L82
        
                /* Transforms "" + BROTLI_TRANSFORM_IDENTITY + <suffix> */
                if (s[0] == ' ') {
                  AddMatch(id + n, l + 1, l, matches);
                  if (s[1] == 'a') {
                    if (s[2] == ' ') {
                      AddMatch(id + 28 * n, l + 3, l, matches);
                    } else if (s[2] == 's') {
                      if (s[3] == ' ') AddMatch(id + 46 * n, l + 4, l, matches);
                    } else if (s[2] == 't') {
                      if (s[3] == ' ') AddMatch(id + 60 * n, l + 4, l, matches);
                    } else if (s[2] == 'n') {
                      if (s[3] == 'd' && s[4] == ' ') {
                        AddMatch(id + 10 * n, l + 5, l, matches);
                      }
                    }
                  } else if (s[1] == 'b') {
                    if (s[2] == 'y' && s[3] == ' ') {
                      AddMatch(id + 38 * n, l + 4, l, matches);
                    }
                  } else if (s[1] == 'i') {
                    if (s[2] == 'n') {
                      if (s[3] == ' ') AddMatch(id + 16 * n, l + 4, l, matches);
                    } else if (s[2] == 's') {
                      if (s[3] == ' ') AddMatch(id + 47 * n, l + 4, l, matches);
                    }
                  } else if (s[1] == 'f') {
                    if (s[2] == 'o') {
                      if (s[3] == 'r' && s[4] == ' ') {
                        AddMatch(id + 25 * n, l + 5, l, matches);
                      }
                    } else if (s[2] == 'r') {
                      if (s[3] == 'o' && s[4] == 'm' && s[5] == ' ') {
                        AddMatch(id + 37 * n, l + 6, l, matches);
                      }
                    }
                  } else if (s[1] == 'o') {
                    if (s[2] == 'f') {
                      if (s[3] == ' ') AddMatch(id + 8 * n, l + 4, l, matches);
                    } else if (s[2] == 'n') {
                      if (s[3] == ' ') AddMatch(id + 45 * n, l + 4, l, matches);
                    }
                  } else if (s[1] == 'n') {
                    if (s[2] == 'o' && s[3] == 't' && s[4] == ' ') {
                      AddMatch(id + 80 * n, l + 5, l, matches);
                    }
                  } else if (s[1] == 't') {
                    if (s[2] == 'h') {
                      if (s[3] == 'e') {
                        if (s[4] == ' ') AddMatch(id + 5 * n, l + 5, l, matches);
                      } else if (s[3] == 'a') {
                        if (s[4] == 't' && s[5] == ' ') {
                          AddMatch(id + 29 * n, l + 6, l, matches);
                        }
                      }
                    } else if (s[2] == 'o') {
                      if (s[3] == ' ') AddMatch(id + 17 * n, l + 4, l, matches);
                    }
                  } else if (s[1] == 'w') {
                    if (s[2] == 'i' && s[3] == 't' && s[4] == 'h' && s[5] == ' ') {
                      AddMatch(id + 35 * n, l + 6, l, matches);
                    }
                  }
                } else if (s[0] == '"') {
                  AddMatch(id + 19 * n, l + 1, l, matches);
                  if (s[1] == '>') {
                    AddMatch(id + 21 * n, l + 2, l, matches);
                  }
                } else if (s[0] == '.') {
                  AddMatch(id + 20 * n, l + 1, l, matches);
                  if (s[1] == ' ') {
                    AddMatch(id + 31 * n, l + 2, l, matches);
                    if (s[2] == 'T' && s[3] == 'h') {
                      if (s[4] == 'e') {
                        if (s[5] == ' ') AddMatch(id + 43 * n, l + 6, l, matches);
                      } else if (s[4] == 'i') {
                        if (s[5] == 's' && s[6] == ' ') {
                          AddMatch(id + 75 * n, l + 7, l, matches);
                        }
                      }
                    }
                  }
                } else if (s[0] == ',') {
                  AddMatch(id + 76 * n, l + 1, l, matches);
                  if (s[1] == ' ') {
                    AddMatch(id + 14 * n, l + 2, l, matches);
                  }
                } else if (s[0] == '\n') {
                  AddMatch(id + 22 * n, l + 1, l, matches);
                  if (s[1] == '\t') {
                    AddMatch(id + 50 * n, l + 2, l, matches);
                  }
                } else if (s[0] == ']') {
                  AddMatch(id + 24 * n, l + 1, l, matches);
                } else if (s[0] == '\'') {
                  AddMatch(id + 36 * n, l + 1, l, matches);
                } else if (s[0] == ':') {
                  AddMatch(id + 51 * n, l + 1, l, matches);

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

        Не могли для этого каких-нибудь ГОМОИКОН сделать?

        j123123, 04 Июня 2018

        Комментарии (26)
         
         
        1. Си / Говнокод #24338

          −1

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          36. 36
          37. 37
          38. 38
          39. 39
          40. 40
          41. 41
          42. 42
          43. 43
          44. 44
          45. 45
          46. 46
          // https://github.com/omonar/nginx-http-auth-digest/blob/38fd7eb04b862636e61b812bbbb8fd2cae4d9ab4/ngx_http_auth_digest_module.c#L910
          
                  if (ngx_auth_digest_str2_casecmp(start, 'n', 'c'))
                  {
                      field = &ngx_http_auth_digest_fields.nc;
          
                  } else if (ngx_auth_digest_str3_casecmp(start, 'q', 'o', 'p'))
                  {
                      field = &ngx_http_auth_digest_fields.qop;
          
                  } else if (ngx_auth_digest_str3_casecmp(start, 'u', 'r', 'i'))
                  {
                      field = &ngx_http_auth_digest_fields.uri;
          
                  } else if (ngx_auth_digest_str5_casecmp(start, 'n', 'o', 'n', 'c', 'e'))
                  {
                      field = &ngx_http_auth_digest_fields.nonce;
          
                  } else if (ngx_auth_digest_str5_casecmp(start, 'r', 'e', 'a', 'l', 'm'))
                  {
                      field = &ngx_http_auth_digest_fields.realm;
          
                  } else if (ngx_auth_digest_str6_casecmp(start, 'c', 'n', 'o', 'n', 'c', 'e'))
                  {
                      field = &ngx_http_auth_digest_fields.cnonce;
          
                  } else if (ngx_auth_digest_str6_casecmp(start, 'o', 'p', 'a', 'q', 'u', 'e'))
                  {
                      field = &ngx_http_auth_digest_fields.opaque;
          
                  } else if (ngx_auth_digest_str8_casecmp(start, 'u', 's', 'e', 'r', 'n', 'a', 'm', 'e'))
                  {
                      field = &ngx_http_auth_digest_fields.username;
          
                  } else if (ngx_auth_digest_str8_casecmp(start, 'r', 'e', 's', 'p', 'o', 'n', 's', 'e'))
                  {
                      field = &ngx_http_auth_digest_fields.response;
          
                  } else if (ngx_auth_digest_str9_casecmp(start, 'a', 'l', 'g', 'o', 'r', 'i', 't', 'h', 'm'))
                  {
                      field = &ngx_http_auth_digest_fields.algorithm;
          
                  } else {
                      goto skip;
          
                  }

          Чем им strcasecmp не угодил?

          j123123, 29 Мая 2018

          Комментарии (18)
        2. Куча / Говнокод #24253

          +1

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          36. 36
          37. 37
          38. 38
          39. 39
          40. 40
          41. 41
          42. 42
          43. 43
          44. 44
          45. 45
          46. 46
          47. 47
          48. 48
          49. 49
          50. 50
          51. 51
          52. 52
          53. 53
          54. 54
          55. 55
          56. 56
          57. 57
          58. 58
          59. 59
          60. 60
          61. 61
          62. 62
          63. 63
          64. 64
          65. 65
          66. 66
          67. 67
          68. 68
          69. 69
          70. 70
          71. 71
          72. 72
          73. 73
          74. 74
          75. 75
          76. 76
          77. 77
          78. 78
          79. 79
          80. 80
          81. 81
          82. 82
          83. 83
          84. 84
          85. 85
          86. 86
          87. 87
          88. 88
          89. 89
          90. 90
          // https://github.com/Navadvipa-Chandra-das/prabhupada_calendar/blob/master/source/Prabhupada_convert.d
          
              bool день_ли_это;
              Тип_строки вид_строки;
              
              Класс_Хитрый_накопитель Хитрый_накопитель = new Класс_Хитрый_накопитель( !Нужно_ли_удалять_пустые_дни, !Нужно_ли_удалять_пустые_дни_окончания_поста, Выходной_файл );
              // цикл не простой, а с меткой "цикл"
              цикл: while ( ( строка = Входной_файл.readln() ) !is null ) {
          
                if ( Нужно_ли_удалять_служебные_строки ) {
                  if ( строка.length < 3 )
                    // чудо, а не возможность! Можно делать любые переходы и вылеты из множества вложенных циклов!
                    continue цикл;
                  служебная_строка = matchFirst( строка, выражение_служебная_строка );
                  if ( служебная_строка.captures.length > 0 )
                    continue цикл;
                }
              
                день_месяца = matchFirst( строка, выражение_день );
                день_ли_это = день_месяца.captures.length > 0;
                
                if ( день_ли_это ) {
                  вид_строки = Тип_строки.День;
                  if ( Нужна_ли_табуляция ) {
                    строка = "\t"c ~ день_месяца.captures[ 1 ] ~ "\t"c ~ день_месяца.captures[ 2 ]              ~ "\t"c ~ день_месяца.captures[ 3 ] ~
                             "\t"c ~ день_месяца.captures[ 4 ] ~ "\t"c ~ день_месяца.captures[ 6 ].stripRight() ~ "\t"c ~ день_месяца.captures[ 7 ] ~
                             "\t"c ~ день_месяца.captures[ 8 ] ~ "\t"c ~ день_месяца.captures[ 10 ];
                    // обрабатываем "звездочку" поста
                    if ( день_месяца.captures[ 11 ].indexOf( '*' ) != -1 )
                      строка ~= "\t*"c;
                    строка ~= "\n";
                  }
                  // Удаляем, при желании комментрий к Экадаши - подходит для поста и не додходит для поста. Все равно есть еще символ звездочка и
                  // строка с именем Экадаши и явным упоминанием о посте!
                  if ( Нужно_ли_удалять_комментарий_Экадаши ) {
                    строка = replaceFirst( строка, выражение_для_чистки_комментария_Экадаши, ""c );
                  }
                } else {
                  проверка_месяца = matchFirst( строка, выражение_месяц_ли_это );
                  if ( проверка_месяца.captures.length > 0 ) {
                    вид_строки = Тип_строки.Месяц;
                    // Просто удаляем цепочку начальных пробелов в строках месяца, если готовим табуляцию
                    if ( Нужна_ли_табуляция )
                      строка = replaceFirst( строка, выражение_цепочка_пробелов_в_начале_строки, ""c );
                  } else {
                    // Заменяем цепочку пробелов вначале строки на один единственный символ табуляции для праздников, но только если нужна табуляция
                    пробелы_в_начале_строки = matchFirst( строка, выражение_цепочка_пробелов_в_начале_строки );
                    if ( пробелы_в_начале_строки.captures.length > 0 ) {
                      окончание_поста = matchFirst( строка, выражение_окончание_поста );
                      if ( окончание_поста.captures.length > 0 )
                        вид_строки = Тип_строки.Окончание_поста;
                      else
                        вид_строки = Тип_строки.Праздник;
                      if ( Нужна_ли_табуляция )
                        строка = replaceFirst( строка, выражение_цепочка_пробелов_в_начале_строки, "\t"c );
                    } else
                      вид_строки = Тип_строки.Солнце;
                  }
                }
          
                // Удаляем строки из тире и GCal, но только если нужна табуляци. В книге они не нужны.
                // Можно указать номер версии программы GCal в колонтитулах книги при желании
                if ( Нужна_ли_табуляция ) {
                  if ( вид_строки == Тип_строки.Месяц )
                    строка = replaceAll( строка, выражение_для_чистки_Месяца, ""c );
                  if ( вид_строки == Тип_строки.Солнце )
                    строка = replaceAll( строка, выражение_для_чистки_Солнца, ""c );
                }
                
                // Переводим сначала фразы. Длительная операция, так как переводятся все имеющиеся фразы, не зависимо от того, встречаются ли они в строке или нет
                foreach ( ref фраза; фразы )
                  строка = replaceAll( строка, regex( фраза ), _Словарь_фраз[ фраза ] );
          
                // Переводим слова. Быстрее, так как переводятся только те слова, которые встречаются в данной конкретной строке
                слова = std.regex.split( строка, выражение_разделитель );
                // сортируем, чтобы короткие слова не позаменялись в более длинных словах внутри
                // Вдохнули поглубже! Такого чуда я еще не видел! Не иначе как mixin в действии!
                слова.sort!( "a.length > b.length" );
                foreach ( ref слово; слова )
                  if ( слово.length > 0 )
                    строка = replaceAll!( Чудо_слов )( строка, regex( слово ) );
                
                Хитрый_накопитель.В_копилку( строка, вид_строки );
              }
              // Пропихнем в файл последнюю строку
              Хитрый_накопитель.В_копилку( ""c, Тип_строки.День );
          
              window.showMessageBox( UIString.fromId( "ЧЕСТЬ_ИМЕЮ_ДОЛОЖИТЬ"c ),
                                     UIString.fromId( "ЗАДАНИЕ_ВЫПОЛНЕНО!"c ) );
          }

          Кришнаит, пишущий на языке D в стиле 1С

          j123123, 12 Мая 2018

          Комментарии (10)
        3. C++ / Говнокод #24241

          0

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          https://github.com/dotnet/coreclr/blob/a589e3926a1780256fdb52376f8681fe047daf54/src/vm/i386/cgenx86.cpp#L1551-L1553
          
              PAL_TRY(Param *, pParam, &param)
              {
                  unsigned char buffer[16];
                  DWORD* dwBuffer = NULL;
          
                  DWORD maxCpuId = getcpuid(0, buffer);
          
                  if (maxCpuId < 1)
                      goto lDone;
          
                  dwBuffer = (DWORD*)buffer;
          
                  if (dwBuffer[1] == 'uneG') {
                      if (dwBuffer[3] == 'Ieni') {
                          if (dwBuffer[2] == 'letn')  {  // get SMT/multicore enumeration for Intel EM64T

          С каких пор в одинарные кавычки можно писать больше одного символа? Это какое-то MSVC или что?

          j123123, 09 Мая 2018

          Комментарии (232)
        4. C++ / Говнокод #24235

          −1

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          // https://github.com/dotnet/coreclr/blob/a589e3926a1780256fdb52376f8681fe047daf54/src/vm/binder.cpp#L503-L511
          
          const MscorlibBinder::OffsetAndSizeCheck MscorlibBinder::OffsetsAndSizes[] =
          {
              #define DEFINE_CLASS_U(nameSpace, stringName, unmanagedType) \
                  { PTR_CSTR((TADDR) g_ ## nameSpace ## NS ), PTR_CUTF8((TADDR) # stringName), sizeof(unmanagedType), 0, 0, 0 },
              
              #define DEFINE_FIELD_U(stringName, unmanagedContainingType, unmanagedOffset) \
                  { 0, 0, 0, PTR_CUTF8((TADDR) # stringName), offsetof(unmanagedContainingType, unmanagedOffset), sizeof(((unmanagedContainingType*)1)->unmanagedOffset) },
              #include "mscorlib.h"
          };

          Дух старой школы всё еще живет в майкрософт

          j123123, 08 Мая 2018

          Комментарии (8)
        5. Куча / Говнокод #24228

          −2

          1. 1
          2. 2
          Золотце
          https://lj.rossia.org/users/sadkov/103320.html?nc=55

          OpenGL - говно опенсурсное
          Попытался реализовать getPixel и putPixel на OpenGL, в результате получение одного пикселя занимает болшьшую часть времени выполнения программы. Другие люди тоже жалуются на тормознутость функций OpenGL, вроде glDrawPixels и glReadPixels

          https://stackoverflow.com/questions/39821850/why-is-glreadpixels-so-slow-and-are-there-any-alternative
          
          https://stackoverflow.com/questions/36534933/gldrawpixels-vs-textures-to-draw-a-2d-buffer-in-opengl

          >glDrawPixels is known to be very slow

          Зачем вообще нужно все это 3d ускорение? В DOS все было идеально:
          ((uint8_t*)(0xB8000))[y*320+x] = pixel

          почему нельзя современным программам предоставить такой 0xB8000 адрес и пару регистров вывода? Зачем все эти ритуалы? И да, MMU и protected mode значительно замедляют доступ к памяти, посему современный DOS работал бы на порядок быстрей Windows/Linux. Протекция памяти оправдана только на этапе разработки программы, а для release билда ее лучше отключить, чтобы иметь прямой доступ к реальной памяти.

          И я не одинок в негодовании:
          https://stackoverflow.com/questions/39430404/drawing-pixels-in-opengl

          >I'm using integrated GPU (Intel HD graphics 4000), as far as I know CPU and GPU share the same memory so why is it that I need to download? Why is it impossible to get a pointer?

          Начинаю думать, что Unabomber был прав во всем - надо к чертям взорвать офисы мразотных бюрократов из Khronos Group.

          j123123, 05 Мая 2018

          Комментарии (48)
        6. Java / Говнокод #24217

          +3

          1. 1
          http://www.ssw.uni-linz.ac.at/Research/Papers/Wuerthinger07/Wuerthinger07.pdf

          Как известно, в языках C и C++ есть проблема с buffer overflow, в то время как в языке Java такой проблемы нет (баги в реализации самой JVM не рассматриваем). В языке Java, как и в многих других подобных языках для анскиллябр заедушных, не могущих в сырые указатели, сделали проверки границ массива. В говноязыке C++ впрочем тоже есть какая-то такая питушня, например std::vector::at выполняет роверку выхода индекса за границы диапазона вектора. Только вот в язык JVM давно уже внедряют такую хреноту, как array bounds check elimination, т.е. убирание проверок, когда на этапе компиляции можно доказать, что такие проверки не нужны.

          В какой версии C++ сделают чтоб std::vector::at тоже вот так могло автозаменяться на небезопасный аналог если компилятор доказал что там эти проверки не нужны?

          j123123, 03 Мая 2018

          Комментарии (24)
        7. Си / Говнокод #24216

          0

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          if (cond1)
          {
            do_shit1();
          }
          else if (cond2)
          {
            do_shit2();
          }
          else if (cond3)
          {
            do_shit3();
          }
          else if (cond4)
          {
            do_shit4();
          }

          Вот например есть такая вот типичная хуита, предположим что я знаю, что среди этих cond1 cond2 ... только один может быть true, остальные условия всегда будет ложными.
          И в этой сраной цепочке из if - else if можно перемещать if блоки без изменения логики. НО в языке Си (да и в C++ я уверен тоже) нет способа сказать компилятору что-то вроде "только одно из условий true, так что ты, сраный компилятор, можешь переделывать эту хуиту, и даже убрать else, если процессор в таком случае (при if(cond1) {do_shit1();}; if(cond2) {do_shit2();}; ... ) будет эту ссанину быстрее обрабатывать".
          Какие-нибудь языки программирования такую оптимизацию вообще умеют?

          j123123, 03 Мая 2018

          Комментарии (19)
        8. Куча / Говнокод #24155

          0

          1. 1
          2. 2
          3. 3
          https://twitter.com/i_am_romochka/status/986936174538383365
          UDP: кинул тебе за щеку
          TCP: кинул тебе за щеку, ПРОВЕРЯЙ

          А откуда эта хуита с "защекой" пошла? Не с говнокода ли?

          j123123, 20 Апреля 2018

          Комментарии (11)
        9. C++ / Говнокод #23938

          −1

          1. 1
          2. 2
          3. 3
          4. 4
          5. 5
          6. 6
          7. 7
          8. 8
          9. 9
          Antony Polukhin
           in 
          pro.cxx
          Кстати, в EWG одобрили constexpr контейнеры http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0784r1.html
          так что есть все шансы к С++20 писать:
          constexpr std::string result = foo();
          t.me/ProCxx
          /184343
          Mar 16 at 10:47

          Library pragmatism

          Current implementations of standard libraries sometimes perform various raw storage operations through interfaces other than the standard allocator and allocator traits. That may make it difficult to make the associated components usable in constexpr components. Based on a cursory examination of current practices, we therefore propose to start only with the requirement that the container templates in the [containers] clause be usable in constexpr evaluation, when instantiated over literal types and the default allocator. In particular, this excludes std::string, std::variant, and various other allocating components. Again, it is our hope we will be able to extend support to more components in the future.

          With regards to the default allocator and allocator traits implementation, the majority of the work is envisioned in the constexpr evaluator: It will recognize those specific components and implement their members directly (without necessarily regarding the library definition).
          We might, however, consider decorating the class members with the constexpr keyword. Also, some implementations provide extra members in these class templates (such as libc++'s allocator_traits<A>::__construct_forward ) that perform non-constexpr-friendly operations (memcpy, in particular). Lifting such members to standard status would help interoperability between library and compiler implementations.

          j123123, 16 Марта 2018

          Комментарии (10)
        10. Куча / Говнокод #23908

          +6

          1. 1
          2. 2
          3. 3
          4. 4
          5. 5
          6. 6
          7. 7
          8. 8
          9. 9
          https://www.opennet.ru/opennews/art.shtml?num=48234
          
          Создатели редактора кода Atom из компании GitHub развивают новый
          экспериментальный текстовый редактор Xray, который также построен
          с использованием фреймворка Electron, но примечателен тем, что для
          повышения надёжности и производительности ядро редактора с
          реализацией базовой логики написано на языке Rust, интерфейс
          оформлен на JavaScript/CSS с применением фреймворка React, а для
          отрисовки текста применяется WebGL.

          Чем вообще руководствуются люди, делающие IDE из кусков браузера? Нахрена там JavaScript/CSS, нахрена там React? Еще и Rust приплели зачем-то.
          Может это чтоб всякие фронтенд-разрабы возрадовались, потому что теперь их умение писать хуиту на жабаскрипте применимо для написания говноплагинов к этой хуите? А как же бекенд? Пусть дополнительно встроят туда PHP MySQL чтоб никто не ушел обиженным.

          j123123, 11 Марта 2018

          Комментарии (270)
         
        1. Си / Говнокод #23862

          +2

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          36. 36
          37. 37
          // https://github.com/Samsung/ADBI/blob/3e424c45386b0a36c57211da819021cb1929775a/idk/include/division.h#L138
          
          /* Long division by 10. */
          static unsigned long long int div10l(unsigned long long int v) {
          
              /* It's a kind of magic.  We achieve 64-bit (long) division by dividing the two 32-bit halfs of the number 64-bit
               * number.  The first (most significant) half can produce a rest when dividing, which has to be carried over to the
               * second half.  The rest_add table contains values added to the second half after dividing depending on the rest
               * from the first division.  This allows evaluation of a result which is almost correct -- it can be either the
               * expected result, or the expected result plus one.  The error can be easily detected and corrected.
               */
              
              /* one dream */
              static unsigned long long int rest_add[] = {
                  0x00000000, 0x1999999a, 0x33333334, 0x4ccccccd, 0x66666667,
                  0x80000001, 0x9999999a, 0xb3333334, 0xcccccccd, 0xe6666667
              };
              
              /* one soul */
              unsigned long long int a = div10((unsigned int)(v >> 32));
              unsigned long long int b = div10((unsigned int)(v & 0xffffffff));
              
              /* one prize */
              int ri = (v >> 32) - a * 10;
              
              /* one goal */
              unsigned long long int ret = (a << 32) + b + rest_add[ri];
              
              /* one golden glance */
              if (ret * 10L > v) {
                  //printf("OGG %llu %llu\n", ret * 10, v);
                  --ret;
              }
              
              /* of what should be */
              return ret;
          }

          Деление на 10. Но зачем? Неужели компилятор настолько туп, что сам не может этого сделать?
          И да, эти туповатые комментарии one dream, one soul это отсылка к песне Queen - A Kind of Magic https://youtu.be/0p_1QSUsbsM

          j123123, 03 Марта 2018

          Комментарии (52)
        2. PHP / Говнокод #23798

          0

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          // http://www.compiler.su/prodolzhenie-tsikla-i-vykhod-iz-nego.php
          // В PHP выход из вложенного цикла выглядит, на мой взгляд, значительно элегантнее. После «break» указывается количество вложенных циклов, которые должен «покинуть» оператор «break». В приведённом примере, который аналогичен приведённому выше для Java, «break» должен «пересечь» две фигурные скобки «}», чтобы оказаться за пределами двух циклов.
          
          for($i=0; $i < $Imax; ++$i)
          {
             // ...
             for($j=0; $j < $Jmax; ++$j)
             {
                // ...
                if(условие) 
                    break 2;
                // ...
             }
             // ...
          }

          Интересно, а почему б нечто подобное не сделать для функций? Ну например есть функция a() которая вызывает функцию b() которая вызывает функцию c(), которая вызывает функцию d(), и например в функции d() чтоб сделать особый return_3, который бы вернул управление на три уровня вниз, сразу в функцию a()? Хотя не, хуйня, надо ведь еще знать, какой там тип возвращается в функцию a() из функции b().
          То ли дело ассемблер. Можно тупо отмотать стек в нужное место

          j123123, 16 Февраля 2018

          Комментарии (64)
        3. C++ / Говнокод #23711

          0

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          36. 36
          37. 37
          38. 38
          39. 39
          40. 40
          41. 41
          42. 42
          43. 43
          44. 44
          45. 45
          46. 46
          47. 47
          48. 48
          49. 49
          50. 50
          51. 51
          52. 52
          53. 53
          54. 54
          55. 55
          56. 56
          57. 57
          58. 58
          59. 59
          60. 60
          61. 61
          62. 62
          63. 63
          64. 64
          65. 65
          66. 66
          67. 67
          68. 68
          69. 69
          70. 70
          71. 71
          72. 72
          73. 73
          74. 74
          75. 75
          76. 76
          77. 77
          78. 78
          79. 79
          80. 80
          81. 81
          82. 82
          83. 83
          84. 84
          85. 85
          // enum_helper_pre.h
          
          #ifndef delimiter 
              #define delimiter , 
          #endif 
           
           
          #ifndef enumeration_begin 
              #define enumeration_begin(arg) enum arg { 
          #endif 
           
          #ifndef enumeration_end 
              #ifdef last_enumerator 
                  #define enumeration_end delimiter last_enumerator } 
              #else 
                  #define enumeration_end } 
              #endif 
          #endif 
           
          #ifndef declare_member 
              #define declare_member(arg) arg 
          #endif 
           
          #ifndef member_value 
              #define member_value(arg) = arg 
          #endif 
          
          
          // enum_helper_post.h
          
          #undef delimiter 
          #undef enumeration_begin 
          #undef enumeration_end 
          #undef last_enumerator 
          #undef declare_member 
          #undef member_value
          
          
          // color.h
          
          #include "enum_helper_pre.h" 
           
          enumeration_begin(color) 
          declare_member(RED) member_value(-2) delimiter 
          declare_member(GREEN) delimiter 
          declare_member(BLUE) member_value(5) delimiter 
          declare_member(BRIGHTNESS) 
          enumeration_end; 
           
          #include "enum_helper_post.h"
          
          
          // main.cpp
          
          #include <iostream> 
          #include <string> 
          #include <boost/bimap.hpp> 
          #include <boost/preprocessor/stringize.hpp> 
           
          #include "color.h" 
           
          int main(int argc,char* argv[]) 
          { 
              typedef boost::bimap<color,std::string> map_type; 
              map_type color_map; 
              #define declare_member(arg) color_map.insert( map_type::value_type(arg,BOOST_PP_STRINGIZE(arg)) ) 
              #define delimiter ; 
              #define enumeration_begin(arg) 
              #define enumeration_end 
              #define member_value(arg) 
              #include "color.h" 
           
              std::cout<<color_map.left.at(RED)<<std::endl; 
              std::cout<<color_map.left.at(BLUE)<<std::endl; 
              std::cout<<color_map.right.at("GREEN")<<std::endl; 
              std::cout<<color_map.right.at("BRIGHTNESS")<<std::endl; 
              return 0; 
          }
          
          // Output
          
          RED 
          BLUE 
          -1 
          6

          Нарыл эту хуйню на http://www.quizful.net/post/enum-types-c

          j123123, 06 Февраля 2018

          Комментарии (2)
        4. JavaScript / Говнокод #23701

          0

          1. 1
          2. 2
          3. 3
          4. 4
          5. 5
          6. 6
          https://github.com/SeleniumHQ/selenium/commit/388793a775aea41533fb5816aabe710e1b42ff61
          
          +        if (Math.random() > 0.8) {
          +            throw new SeleniumError("Selenium 1.0 (Core, RC, etc) is going away; update to WebDriver now.");
          +        }
          +

          j123123, 02 Февраля 2018

          Комментарии (9)
        5. Си / Говнокод #23672

          0

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          /*
           * Returns 1 if filename has .zip extension.
           */
          static int
          str_zipext(char *name)
          {
          	int i;
          
          	i = strlen(name) - 1;
          	if (i < 0 || name[i] != 'p' && name[i] != 'P') return 0;
          	i--;
          	if (i < 0 || name[i] != 'i' && name[i] != 'I') return 0;
          	i--;
          	if (i < 0 || name[i] != 'z' && name[i] != 'Z') return 0;
          	i--;
          	if (i < 0 || name[i] != '.') return 0;
          	i--;
          	if (i < 0) return 0;
          	return 1;
          }

          https://github.com/fabiensanglard/xrick/blob/239d213f01be8d0086c449080ce61bde8dcad7b4/src/data.c#L189

          j123123, 25 Января 2018

          Комментарии (15)
        6. C++ / Говнокод #23666

          +1

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          template < typename T >
          T shit (void)
          {
            return 0;
          }
          
          int main()
          {
            int crap = shit();
          // Почему дедукция аргумента шаблона в данном случае не работает?
            return crap;
          }
          
          //-------------------------------------
          
          int shit (void)
          {
            return 0;
          }
          
          // Почему functions that differ only in their return type cannot be overloaded 
          double shit (void)
          {
            return 0;
          }
          
          int main()
          {
            int crap = shit();
            return crap;
          }

          Почему плюсы такое говно?

          j123123, 22 Января 2018

          Комментарии (46)
        7. C++ / Говнокод #23656

          0

          1. 1
          2. 2
          3. 3
          4. 4
          https://www.reddit.com/r/cpp/comments/75gohf/i_just_found_a_use_for_the_poop_emoji_in_c/
          запостить этот говнокод непосредственно сюда не представляется возможным из-за юникодного символа говна:
          Application was halted by an exception.
          Debug-mode is off.

          I just found a use for the poop emoji in C++
          This actually detects whether the Visual Studio project has the proper UTF-8 flags set to compile it correctly.

          j123123, 16 Января 2018

          Комментарии (9)
        8. Куча / Говнокод #23588

          0

          1. 1
          http://shitcode.net/

          У говнокода появился конкурент

          j123123, 15 Декабря 2017

          Комментарии (37)
        9. C++ / Говнокод #23568

          +1

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          36. 36
          37. 37
          38. 38
          39. 39
          40. 40
          41. 41
          42. 42
          43. 43
          44. 44
          45. 45
          46. 46
          47. 47
          48. 48
          49. 49
          50. 50
          51. 51
          52. 52
          53. 53
          54. 54
          55. 55
          56. 56
          57. 57
          58. 58
          59. 59
          60. 60
          61. 61
          62. 62
          63. 63
          64. 64
          65. 65
          66. 66
          67. 67
          68. 68
          69. 69
          70. 70
          71. 71
          72. 72
          73. 73
          74. 74
          75. 75
          76. 76
          77. 77
          78. 78
          79. 79
          80. 80
          81. 81
          82. 82
          83. 83
          84. 84
          85. 85
          86. 86
          87. 87
          #include <experimental/coroutine>
          #include <iostream>
          #include <optional>
          #include <utility>
          
          template<typename T>
          class Maybe
          {
              std::shared_ptr<std::optional<T>> m_maybe = std::make_shared<std::optional<T>>();
          public:
              Maybe() = default;
              
              Maybe(const T& t)
              : m_maybe { std::make_shared<std::optional<T>>(t) }
              {
              }
          
              explicit operator bool() const { return static_cast<bool>(*m_maybe); }
              T& operator* () { return **m_maybe; }
              const T& operator*() const { return **m_maybe; }
              
              void reset() { m_maybe->reset(); }
              
              template<typename U>
              void emplace(U&& u) { m_maybe->emplace(std::forward<U>(u)); }
          };
          
          template<typename T>
          void printMaybe(const Maybe<T>& opt)
          {
              if (opt)
                  std::cout << *opt << std::endl;
              else
                  std::cout << "<empty>" << std::endl;
          }
          
          template<typename T, typename... Args>
          struct std::experimental::coroutine_traits<Maybe<T>, Args...>
          {
              struct promise_type
              {
                  Maybe<T> m_maybe;
                  
                  auto get_return_object() { return m_maybe; }
                  
                  std::experimental::suspend_never initial_suspend() { return {}; }
                  std::experimental::suspend_never final_suspend() { return {}; }
                  
                  void unhandled_exception() { m_maybe.reset(); }
                  
                  template<typename U>
                  void return_value(U&& u) { m_maybe.emplace(std::forward<U>(u)); }
              };
          };
          
          template<typename T>
          auto operator co_await(const Maybe<T>& maybe)
          {
              struct Awaiter
              {
                  const Maybe<T>& input;
          
                  bool await_ready() { return static_cast<bool>(input); }
                  auto await_resume() { return *input; }
                  void await_suspend(std::experimental::coroutine_handle<> coro) { coro.destroy(); }
              };
          
              return Awaiter { maybe };
          }
          
          Maybe<int> maybeAdd(const Maybe<int>& maybeA, const Maybe<int>& maybeB)
          {
              auto a = co_await maybeA;
              auto b = co_await maybeB;
              co_return a + b;
          }
          
          int main()
          {
            /*
              printMaybe(maybeAdd({ 1 }, { 2 }));
              printMaybe(maybeAdd({}, { 2 }));
              printMaybe(maybeAdd({ 1 }, {}));
              */
              const auto res = maybeAdd({ 1 }, { 2 });
              return res ? *res : 0;
          }

          do-нотация в плюсах

          j123123, 07 Декабря 2017

          Комментарии (85)
        10. Си / Говнокод #23566

          −2

          1. 01
          2. 02
          3. 03
          4. 04
          5. 05
          6. 06
          7. 07
          8. 08
          9. 09
          10. 10
          11. 11
          12. 12
          13. 13
          14. 14
          15. 15
          16. 16
          17. 17
          18. 18
          19. 19
          20. 20
          21. 21
          22. 22
          23. 23
          24. 24
          25. 25
          26. 26
          27. 27
          28. 28
          29. 29
          30. 30
          31. 31
          32. 32
          33. 33
          34. 34
          35. 35
          #define POLY 0x8408
          /*
          //                                      16   12   5
          // this is the CCITT CRC 16 polynomial X  + X  + X  + 1.
          // This works out to be 0x1021, but the way the algorithm works
          // lets us use 0x8408 (the reverse of the bit pattern).  The high
          // bit is always assumed to be set, thus we only use 16 bits to
          // represent the 17 bit value.
          */
          
          unsigned short crc16(unsigned char *data_p, size_t length)
          {
            unsigned char i;
            unsigned int data;
          
            if ( length == 0 ) return 0;
            unsigned int crc = 0xFFFF;
            do
            {
              data = *data_p++;
              for ( i=0; i < 8; i++ )
              {
                if ( (crc ^ data) & 1 )
                  crc = (crc >> 1) ^ POLY;
                else
                  crc >>= 1;
                data >>= 1;
              }
            } while ( --length != 0 );
          
            crc = ~crc;
            data = crc;
            crc = (crc << 8) | ((data >> 8) & 0xff);
            return (unsigned short)(crc);
          }

          Типичный пример непортабельной хуйни на Си.

          j123123, 07 Декабря 2017

          Комментарии (6)
           
          1. Куча / Говнокод #23535

            +2

            1. 1
            https://shmat-razum.blogspot.com/2012/12/blog-post.html

            Есть такое правило, к которому все привыкли: если в программе записано логическое выражение с and, и первое подвыражение оказалось равно false, то второе не вычисляется. Аналогично с or: если первое подвыражение равно true, второе не вычисляется. Это позволяет удобно записывать вещи вида

            if (index < 0 || array[index] == NULL)
            
              ...

            или
            if (index >= 0 && array[index] == ptr)
            
              ...


            Это правило действует во всех широко используемых языках программирования: C/C++, Java, C#, Javascript, Python, а также в многочисленных представителях семейств лиспов и смолтоков. И даже в Хаскеле. И даже в PL/SQL. У правила есть название: закорачивание логических связок (short-circuit evaluation). Казалось, оно само собой разумеется, и есть во всех языках.

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

            j123123, 15 Ноября 2017

            Комментарии (29)
          2. C++ / Говнокод #23515

            0

            1. 1
            https://webhamster.ru/mytetrashare/index/mtb0/1480776952mrczr7xk44

            Какие изменения предлагает инициативная группа стандарта C++!!, чтобы сделать язык C++ красивым, мощным и востребованным средством современной разработки?

            j123123, 10 Ноября 2017

            Комментарии (18)
          3. C++ / Говнокод #23498

            +1

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            // https://github.com/telegramdesktop/tdesktop/blob/5f5770dd46491133b135a71fc2d4f92d13107ade/Telegram/SourceFiles/history.cpp#L1455
            
            int History::countUnread(MsgId upTo) {
            	int result = 0;
            	for (auto i = blocks.cend(), e = blocks.cbegin(); i != e;) {
            		--i;
            		for (auto j = (*i)->items.cend(), en = (*i)->items.cbegin(); j != en;) {
            			--j;
            			if ((*j)->id > 0 && (*j)->id <= upTo) {
            				break;
            			} else if (!(*j)->out() && (*j)->unread() && (*j)->id > upTo) {
            				++result;
            			}
            		}
            	}
            	return result;
            }
            
            void History::updateShowFrom() {
            	if (showFrom) return;
            
            	for (auto i = blocks.cend(); i != blocks.cbegin();) {
            		--i;
            		for (auto j = (*i)->items.cend(); j != (*i)->items.cbegin();) {
            			--j;
            			if ((*j)->id > 0 && (!(*j)->out() || !showFrom)) {
            				if ((*j)->id >= inboxReadBefore) {
            					showFrom = *j;
            				} else {
            					return;
            				}
            			}
            		}
            	}
            }

            очередная порция говнеца из телесрамного клиента

            j123123, 07 Ноября 2017

            Комментарии (119)
          4. Куча / Говнокод #23477

            −7

            1. 1
            Про убогость ООП подхода.

            Итак, вот допустим наследование. Есть всякие там тупые примеры ООП, типа "котик и собачка наследуется от четырехногих" и проч., где подобный бред вполне работает. Но давайте попробуем рассмотреть более интересные ситуации.

            Допустим что мы пишем некую игру. В игре есть некое оружие, например там есть огнестрел и дубинки. И мы делаем ружье, которое одновременно и огнестрел и дубинка, т.е. ружьем можно и как палкой уебать, и пальнуть как из револьвера. У родительского класса "огнестрел" есть свойства, типа дальности выстрела, точности, используемых боеприпасов, уровень прочности(износ), вес, наносимый урон при попадании. У дубинки есть свойства длины дубинки, уровень прочности(износ), вес, наносимый урон при ударе. Вес для ружья нам нужен только один, т.е. нет смысла делать два "веса" одному предмету. И огнестрел и дубинка наследуется от родительского класса "объект инвентаря", в общем тут ромбовидное наследование, которое в разных языках решается разными способами. Ну ок, допустим что мы там каким-то образом указали компилятору некоего языка X, что наследовать свойство "вес" надо лишь один единственный раз, как и прочие хрени, которые являются общими для родительского класса "объект инвентаря". Теперь надо решить с прочностью. Не все "объекты инвентаря" в этой игре имеют свойство прочности, есть например какие-то расходные материалы, типа патронов, для которых понятие прочности неприменимо. Использование ружья как дубинки изнашивает его не таким же самым образом, как использование ружья как огнестрела, но при этом слишком большой износ ружья-как-дубинки может настолько повредить его, что как огнестрел его уже и не поиспользовать из-за погнутого ствола. Но использование ружья как огнестрел никак на износ ружья-как-дубинки не влияет, типа это механический износ спускового механизма, износ ствола при стрельбе...

            j123123, 02 Ноября 2017

            Комментарии (255)
          5. Куча / Говнокод #23465

            +2

            1. 1
            2. 2
            https://i.imgur.com/kMVofCA.png
            ооооонейросетьоооотвечайрррооооооооооооооооооооооооооооооооооооооооооооооооввоооооооооооо

            по какому блядь принципу работает этот гугловский говнопереводчик?

            j123123, 30 Октября 2017

            Комментарии (12)
          6. C++ / Говнокод #23449

            0

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            https://github.com/TartanLlama/optional/blob/master/optional.hpp#L853
            
              /// Constructs the stored value with `u`.
              /// \synopsis template <class U=T> constexpr optional(U &&u);
              template <
                  class U = T,
                  detail::enable_if_t<std::is_convertible<U &&, T>::value> * = nullptr,
                  detail::enable_forward_value<T, U> * = nullptr>
              constexpr optional(U &&u) : base(in_place, std::forward<U>(u)) {}
            
              /// \exclude
              template <
                  class U = T,
                  detail::enable_if_t<!std::is_convertible<U &&, T>::value> * = nullptr,
                  detail::enable_forward_value<T, U> * = nullptr>
              constexpr explicit optional(U &&u) : base(in_place, std::forward<U>(u)) {}
            
              /// Converting copy constructor.
              /// \synopsis template <class U> optional(const optional<U> &rhs);
              template <
                  class U, detail::enable_from_other<T, U, const U &> * = nullptr,
                  detail::enable_if_t<std::is_convertible<const U &, T>::value> * = nullptr>
              optional(const optional<U> &rhs) {
                this->m_has_value = true;
                new (std::addressof(this->m_value)) T(*rhs);
              }
            
              /// \exclude
              template <class U, detail::enable_from_other<T, U, const U &> * = nullptr,
                        detail::enable_if_t<!std::is_convertible<const U &, T>::value> * =
                            nullptr>
              explicit optional(const optional<U> &rhs) {
                this->m_has_value = true;
                new (std::addressof(this->m_value)) T(*rhs);
              }
            
              /// Converting move constructor.
              /// \synopsis template <class U> optional(optional<U> &&rhs);
              template <
                  class U, detail::enable_from_other<T, U, U &&> * = nullptr,
                  detail::enable_if_t<std::is_convertible<U &&, T>::value> * = nullptr>
              optional(optional<U> &&rhs) {
                this->m_has_value = true;
                new (std::addressof(this->m_value)) T(std::move(*rhs));
              }
            
              /// \exclude
              template <
                  class U, detail::enable_from_other<T, U, U &&> * = nullptr,
                  detail::enable_if_t<!std::is_convertible<U &&, T>::value> * = nullptr>
              explicit optional(optional<U> &&rhs) {
                this->m_has_value = true;
                new (std::addressof(this->m_value)) T(std::move(*rhs));
              }

            Я даже не знаю, какой конкретно фрагмент этого творчества сюда выкладывать.

            https://github.com/TartanLlama/optional C++11/14/17 std::optional with functional-style extensions https://optional.tartanllama.xyz

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

            Понятно что из плюсов никакого гомоиконного лиспа сделать не выйдет, ведь тогда надо выкинуть очень красивый и элегантный плюсосинтаксис вида std::kukarek(std:kudah<std:kokoko{kokoko ko[hui<govno>]}>:()[*huita]{}) и заменить его на бездуховные скобочки

            j123123, 24 Октября 2017

            Комментарии (74)
          7. JavaScript / Говнокод #23444

            +8

            1. 1
            2. 2
            3. 3
            4. 4
            5. 5
            6. 6
            7. 7
            Для кульминации ебаных тендеций ебаных информационных технологий,
            предлагаю выпустить новые процессоры интел со встроенным джаваскриптом.
            Никакого больше ассемблера, никаких ядер, драйверов, ничего не нужно, на
            каждом процессоре будет встроенный хардварный веб-сервер с нодежс,
            общение с видеокартой, памятью, периферией будет только с помощью
            API-вызовов, теперь каждый альтернативно интеллектуальный 
            жаваскрипт-разработчик сможет почувствовать себя системным программистом

            j123123, 22 Октября 2017

            Комментарии (55)
          8. C++ / Говнокод #23432

            +3

            1. 1
            https://pbs.twimg.com/media/DMbz4s9UEAACa5x.jpg

            how to deprecate an interface

            j123123, 19 Октября 2017

            Комментарии (2)
          9. Си / Говнокод #23426

            +3

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            // https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/bayes/bayes-data.c#L1966
            
            int init_all (kfs_file_handle_t Index) {
              int i;
            
              log_ts_exact_interval = 1;
            
              ltbl_init (&user_table);
            
              bl_head = qmalloc (sizeof (black_list));
              black_list_init (bl_head);
            
              int f = load_header (Index);
            
              jump_log_ts = header.log_timestamp;
              jump_log_pos = header.log_pos1;
              jump_log_crc32 = header.log_pos1_crc32;
            
              int user_cnt = index_users = header.user_cnt;
            
              if (user_cnt < 1000000) {
                user_cnt = 1000000;
              }
            
              assert (user_cnt >= 1000000);
              user_cnt *= 1.1;
            
              while (user_cnt % 2 == 0 || user_cnt % 5 == 0) {
                user_cnt++;
              }
            
              ltbl_set_size (&user_table, user_cnt);
              users = qmalloc (sizeof (user) * user_cnt);
            
              for (i = 0; i < user_cnt; i++) {
                user_init (&users[i]);
              }
            
              LRU_head = users;
              LRU_head->next_used = LRU_head->prev_used = LRU_head;
            
              if (f) {
                try_init_local_uid();
              }
            
              if (index_mode) {
                buff = qmalloc (max_words * sizeof (entry_t));
                new_buff = qmalloc (4000000 * sizeof (entry_t));
              }
            
              return f;
            }

            http://govnokod.ru/23357#comment390273
            > Говорят что в ВК в начале была такая херь: "уже зарегистрировано N" и это N увеличивалось джаваскриптом со случайной скоростью вообще без связи с сервером

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

            user_cnt *= 1.1;

            cunt

            j123123, 17 Октября 2017

            Комментарии (28)
          10. Си / Говнокод #23348

            +2

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            63. 63
            64. 64
            65. 65
            66. 66
            67. 67
            68. 68
            69. 69
            70. 70
            71. 71
            72. 72
            73. 73
            74. 74
            // https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/bayes/bayes-data.c#L569
              for (i = j = 0; v[i]; i++) {
                f[j] = i;
                if (v[i + 1] == '#' && (v[i] == '&' || v[i] == '$')) {
                  int r = 0, ti = i;
                  if (v[i + 2] != 'x') {
                    for (i += 2; v[i] != ';' && v[i]; i++) {
                      if ('0' <= v[i] && v[i] <= '9') {
                        r = r * 10 + v[i] - '0';
                      } else {
                        break;
                      }
                    }
                  } else {
                    for (i += 3; v[i] != ';' && v[i]; i++) {
                      if (('0' <= v[i] && v[i] <= '9') ||
                          ('a' <= v[i] && v[i] <= 'f') ||
                          ('A' <= v[i] && v[i] <= 'F')) {
                        r = r * 16;
                        if (v[i] <= '9') {
                          r += v[i] - '0';
                        } else if (v[i] <= 'F') {
                          r += v[i] - 'A' + 10;
                        } else {
                          r += v[i] - 'a' + 10;
                        }
                      } else {
                        break;
                      }
                    }
                  }
                  if (r == 0) {
                    bad[j] = 0;
                    pv[j++] = v[i = ti];
                  } else {
                    bad[j] = 1;
                    pv[j++] = r;
                    if (v[i] != ';') {
                      i--;
                    }
                  }
                } else if (v[i] == '%' && '0' <= v[i + 1] && v[i + 1] <= '7' &&
                                        (('0' <= v[i + 2] && v[i + 2] <= '9') ||
                                         ('a' <= v[i + 2] && v[i + 2] <= 'f') ||
                                         ('A' <= v[i + 2] && v[i + 2] <= 'F'))) {
                  int r = (v[i + 1] - '0') * 16;
                  if (v[i + 2] <= '9') {
                    r += v[i + 2] - '0';
                  } else if (v[i + 2] <= 'F') {
                    r += v[i + 2] - 'A' + 10;
                  } else {
                    r += v[i + 2] - 'a' + 10;
                  }
                  i += 2;
                  if (r != ':' && r != '/' && r != '=' && r != '?' && r != '&' && r != '+') {
                    bad[j] = 1;
                  } else {
                    bad[j] = 0;
                  }
                  pv[j++] = r;
                } else {
                  bad[j] = 0;
                  pv[j++] = v[i];
                }
              }
              f[j] = i;
              pv[j] = 0;
            
              for (i = 0; i < j; i++) {
                if ('A' <= pv[i] && pv[i] <= 'Z') {
                  pv[i] = pv[i] - 'A' + 'a';
                  bad[i] += 2;
                }
              }

            Очередной ебаный пиздец из kPHP
            В предыдущих сериях:
            http://govnokod.ru/19842
            http://govnokod.ru/15406

            j123123, 22 Сентября 2017

            Комментарии (20)
           
          1. C++ / Говнокод #23347

            +2

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            63. 63
            64. 64
            65. 65
            66. 66
            67. 67
            68. 68
            69. 69
            70. 70
            71. 71
            72. 72
            73. 73
            74. 74
            75. 75
            76. 76
            77. 77
            78. 78
            79. 79
            80. 80
            81. 81
            82. 82
            83. 83
            84. 84
            85. 85
            86. 86
            87. 87
            88. 88
            89. 89
            90. 90
            91. 91
            92. 92
            93. 93
            94. 94
            95. 95
            96. 96
            97. 97
            98. 98
            string shifarhex(string count)
            {
            
              string take,take2;
            string getch1;
            
            
            	getch1=count;
            
                string sub1 = "0000";//2 to 3		 31
               unsigned int pos1 = getch1.find(sub1,0);
              if(pos1 != string::npos)
              {
               take2="0"; 
              }
                 string sub2 = "0001";//2 to 3		 31
               unsigned int pos2 = getch1.find(sub2,0);
              if(pos2 != string::npos)
              {
               take2="1"; 
              }
               string sub3 = "0010";//2 to 3		 31
               unsigned int pos3 = getch1.find(sub3,0);
              if(pos3 != string::npos)
              {
               take2="2"; 
              }
               string sub4 = "0011";//2 to 3		 31
               unsigned int pos4 = getch1.find(sub4,0);
              if(pos4 != string::npos)
              {
               take2="3"; 
              }
               string sub5 = "0100";//2 to 3		 31
               unsigned int pos5 = getch1.find(sub5,0);
              if(pos5 != string::npos)
              {
               take2="4"; 
              }
                 string sub6 = "0101";//2 to 3		 31
               unsigned int pos6 = getch1.find(sub6,0);
              if(pos6 != string::npos)
              {
               take2="5"; 
              }
                  string sub7 = "0110";//2 to 3		 31
               unsigned int pos7 = getch1.find(sub7,0);
              if(pos7 != string::npos)
              {
               take2="6"; 
              }
                  string sub8 = "0111";//2 to 3		 31
               unsigned int pos8 = getch1.find(sub8,0);
              if(pos8 != string::npos)
              {
               take2="7"; 
              }
                string sub9 = "1000";//2 to 3		 31
               unsigned int pos9 = getch1.find(sub9,0);
              if(pos9 != string::npos)
              {
               take2="8"; 
              }
               string sub10 = "1001";//2 to 3		 31
               unsigned int pos10 = getch1.find(sub10,0);
              if(pos10 != string::npos)
              {
               take2="9"; 
              }
            
               string sub11 = "1010";//2 to 3		 31
               unsigned int pos11 = getch1.find(sub11,0);
              if(pos11 != string::npos)
              {
               take2="A"; 
              }
                string sub12 = "1011";//2 to 3		 31
               unsigned int pos12 = getch1.find(sub12,0);
              if(pos12 != string::npos)
              {
               take2="B"; 
            
              }
               string sub13 = "1100";//2 to 3		 31
               unsigned int pos13 = getch1.find(sub13,0);
              if(pos13 != string::npos)
              {
               take2="B"; 
              }
               string sub14 = "1101";//2 to 3		 31
               unsigned int pos14 = getch1.find(sub14,0);
              if(pos14 != string::npos)
              {
               take2="D"; 
              }
                string sub15 = "1110";//2 to 3		 31
               unsigned int pos15 = getch1.find(sub15,0);
            ...

            http://www.sql.ru/forum/1269897/delaem-arhivator
            Вореционное зожатие битов

            j123123, 21 Сентября 2017

            Комментарии (1)
          2. C++ / Говнокод #23305

            +2

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            void Assembler::divsd(XMMRegister dst, Address src) {
              NOT_LP64(assert(VM_Version::supports_sse2(), ""));
              InstructionMark im(this);
              simd_prefix(dst, dst, src, VEX_SIMD_F2);
              emit_byte(0x5E);
              emit_operand(dst, src);
            }
            
            void Assembler::divsd(XMMRegister dst, XMMRegister src) {
              NOT_LP64(assert(VM_Version::supports_sse2(), ""));
              int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2);
              emit_byte(0x5E);
              emit_byte(0xC0 | encode);
            }
            
            void Assembler::divss(XMMRegister dst, Address src) {
              NOT_LP64(assert(VM_Version::supports_sse(), ""));
              InstructionMark im(this);
              simd_prefix(dst, dst, src, VEX_SIMD_F3);
              emit_byte(0x5E);
              emit_operand(dst, src);
            }
            
            void Assembler::divss(XMMRegister dst, XMMRegister src) {
              NOT_LP64(assert(VM_Version::supports_sse(), ""));
              int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3);
              emit_byte(0x5E);
              emit_byte(0xC0 | encode);
            }
            
            void Assembler::emms() {
              NOT_LP64(assert(VM_Version::supports_mmx(), ""));
              emit_byte(0x0F);
              emit_byte(0x77);
            }
            
            void Assembler::hlt() {
              emit_byte(0xF4);
            }
            
            void Assembler::idivl(Register src) {
              int encode = prefix_and_encode(src->encoding());
              emit_byte(0xF7);
              emit_byte(0xF8 | encode);
            }

            https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/cpu/x86/vm/assembler_x86.cpp

            Вот эта вот вся ерунда отвечает в Hotspot JVM за генерацию опкодов (чтоб JIT делать). Вы возможно спросите "а где тут говно, j123123?".
            Отвечаю: говно тут на фундаментальном уровне. Такой хуйни по-хорошему вообще не надо писать. Надо формально описать вообще все ебучие опкоды жабового байткода, и все машинные инструкции процессора, которые могут быть порождены жабовым JIT-ом, и потом математически доказать эквивалентность всей этой трансформации какой-нибудь логикой Хоара, системами автоматического доказательства теорем, всякими там Coq, Isabelle и прочей такой сранью, о которой вероятно слышал roman-kashitsyn, раз он там хачкель и Idris с зависимыми типами задрачивал. Ну и CHayT.

            j123123, 29 Августа 2017

            Комментарии (67)
          3. Си / Говнокод #23278

            +3

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            // https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/code/c/1.1%EF%BC%9A%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.c
            
            #include <stdio.h>
            #include <string.h>
            //字符串旋转问题,例如abcdef 左旋2位 变成 cdefab
            
            //暴力移位法
            void leftShift1(char * arr, int n)
            {
                size_t tmpLen = strlen(arr);
                char tmpChar;
                int i, j;
                if (n >= 0)
                {
                    for (i = 0; i < n; i++)
                    {
                        tmpChar = *arr;
                        for (j = 0; j < tmpLen - 1; j++)
                        {
                            *(arr + j) = *(arr + j + 1);
                        }
                        *(arr + tmpLen - 1) = tmpChar;
                    }
                }
                else
                {
                    for (i = 0; i < -n; i++)
                    {
                        tmpChar = *(arr + tmpLen - 1);
                        for (j = tmpLen - 1; j > 0; j--)
                        {
                            *(arr + j) = *(arr + j - 1);
                        }
                        *arr = tmpChar;
                    }
                }
            }

            Копаясь в гитхабе, нашел я тут The Art Of Programming By July, написанный каким-то китайцем.
            https://github.com/julycoding/The-Art-Of-Programming-By-July

            j123123, 18 Августа 2017

            Комментарии (5)
          4. Си / Говнокод #23275

            +1

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            63. 63
            64. 64
            65. 65
            66. 66
            67. 67
            68. 68
            69. 69
            70. 70
            71. 71
            72. 72
            73. 73
            74. 74
            75. 75
            76. 76
            77. 77
            78. 78
            79. 79
            80. 80
            81. 81
            82. 82
            83. 83
            84. 84
            85. 85
            86. 86
            87. 87
            88. 88
            89. 89
            90. 90
            91. 91
            92. 92
            93. 93
            94. 94
            95. 95
            96. 96
            97. 97
            static inline void set0b (const uint8_t at, uint64_t bm[static 4])
            {
              bm[at / 64] &= ~(1ULL << (at % 64));
            }
            
            static inline  void set1b (const uint8_t at, uint64_t bm[static 4])
            {
              bm[at / 64] |= 1ULL << (at % 64);
            }
            
            static inline void inv_b (const uint8_t at, uint64_t bm[static 4])
            {
              bm[at / 64] ^= 1ULL << (at % 64);
            }
            
            
            static inline uint8_t find_empt_pos (const uint64_t bm[static 4])
            {
              if (bm[0] != UINT64_MAX)
              {
                return __builtin_ctzll(~bm[0]) + 64 * 0;  // __builtin_ctzll - https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
              }
              if (bm[1] != UINT64_MAX)
              {
                return __builtin_ctzll(~bm[1]) + 64 * 1;
              }
              if (bm[2] != UINT64_MAX)
              {
                return __builtin_ctzll(~bm[2]) + 64 * 2;
              }
              if (bm[3] != UINT64_MAX)
              {
                return __builtin_ctzll(~bm[3]) + 64 * 3;
              }
              fprintf(stderr, "ERROR! No empty space!\n");
              exit (-1);
            }
            
            static inline uint8_t allocate_ll (uint64_t bm[static 4])
            {
              uint8_t tmp = find_empt_pos (bm);
              set1b (tmp, bm);
              return tmp;
            }
            
            static inline void inject(const uint8_t prev_p, const uint8_t next_p, const uint8_t at, struct ll_data a[static 256])
            {
              a[next_p].ll.prev = at;
              a[prev_p].ll.next = at;
            
              a[at].ll.prev = prev_p;
              a[at].ll.next = next_p;
            }
            
            static inline void remove_betw(const uint8_t prev_p, const uint8_t next_p, struct ll_data a[static 256])
            {
              a[prev_p].ll.next = next_p;
              a[next_p].ll.prev = prev_p;
            }
            
            static inline void remove_at(const uint8_t at, struct ll_data a[static 256], uint64_t bm[static 4])
            {
              uint8_t prev_t = a[at].ll.prev;
              uint8_t next_t = a[at].ll.next;
            
              set0b (at, bm);
            
              a[at].ll.prev = next_t;
              a[at].ll.next = prev_t;
            }
            
            
            void add_elem_next (struct ll_all *a, const uint8_t elm, const int value)
            {
              uint8_t pos = allocate_ll (a->bm);
              inject(elm, a->arr[elm].ll.next, pos, a->arr);
              set_elm (pos, value, a->arr);
            }
            
            void add_elem_prev (struct ll_all *a, const uint8_t elm, const int value)
            {
              uint8_t pos = allocate_ll (a->bm);
              inject(a->arr[elm].ll.prev, elm, pos, a->arr);
              a->arr[pos].data = value;
            }
            
            void rem_elem_next (struct ll_all *a, const uint8_t elm)
            {
              set0b (a->arr[elm].ll.next, a->bm);
              remove_betw (elm, a->arr[a->arr[elm].ll.next].ll.next, a->arr);
            }
            
            void rem_elem_prev (struct ll_all *a, const uint8_t elm)
            {
              set0b (a->arr[elm].ll.next, a->bm);
              remove_betw (a->arr[a->arr[elm].ll.prev].ll.prev, elm, a->arr);
            }

            Тру-царская неанскилльная реализация двусвязного списка внутри массива.
            К сожалению, весь код не помещается, см https://wandbox.org/permlink/Ky8fnuqyE0Ahxftm

            j123123, 18 Августа 2017

            Комментарии (35)
          5. C++ / Говнокод #23263

            +1

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            #if !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
            namespace __detail {
            
            template<typename _Tp, size_t ..._Extra> struct __repeat;
            template<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> {
              typedef __integer_sequence<_Tp,
                                       _Np...,
                                       sizeof...(_Np) + _Np...,
                                       2 * sizeof...(_Np) + _Np...,
                                       3 * sizeof...(_Np) + _Np...,
                                       4 * sizeof...(_Np) + _Np...,
                                       5 * sizeof...(_Np) + _Np...,
                                       6 * sizeof...(_Np) + _Np...,
                                       7 * sizeof...(_Np) + _Np...,
                                       _Extra...> type;
            };
            
            template<size_t _Np> struct __parity;
            template<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
            
            template<> struct __make<0> { typedef __integer_sequence<size_t> type; };
            template<> struct __make<1> { typedef __integer_sequence<size_t, 0> type; };
            template<> struct __make<2> { typedef __integer_sequence<size_t, 0, 1> type; };
            template<> struct __make<3> { typedef __integer_sequence<size_t, 0, 1, 2> type; };
            template<> struct __make<4> { typedef __integer_sequence<size_t, 0, 1, 2, 3> type; };
            template<> struct __make<5> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
            template<> struct __make<6> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
            template<> struct __make<7> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
            
            template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
            template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
            template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
            template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
            template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
            template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
            template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
            template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
            
            } // namespace detail

            Накопипащенная параша из стандартной библиотеки плюсов для clang/llvm, имеющая отношение к реализации integer_sequence и tuple

            https://github.com/llvm-mirror/libcxx/blob/191f075c6fe7440659781f2603088b2df337c06a/include/__tuple#L101-L139

            https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160627/163531.html

            j123123, 14 Августа 2017

            Комментарии (2)
          6. 1C / Говнокод #23260

            −3

            1. 1
            2. 2
            3. 3
            https://github.com/covrom/gonec
            
            1C:Enterprise-like language interpreter written in Go https://covrom.github.io/gonec/

            ГОВНЕЦ (govnec)
            Интерпретатор и платформа создания микросервисов на 1С-подобном языке

            Цели

            Интерпретатор создан для решения программистами 1С множества задач, связанных с высокопроизводительными распределенными вычислениями, создания вэб-сервисов и вэб-порталов для работы тысяч пользователей, работы с высокоэффективными базами данных с использованием синтаксиса языка, похожего, но не ограниченного возможностями языка 1С.

            Включив такой интерпретатор в свое решение, Вы можете предоставить высокий уровень сервиса для своих клиентов, который обгонит решения не только ваших конкурентов на рынке 1С, но и конкурентных платформ в enterprise.

            Интерпретатор разрабатывается “от простого к сложному”. На начальных этапах будет включена базовая функциональность многопоточных вычислений и сетевых сервисов. В перспективе планируется организация работы с различными базами данных и визуализация управляемых форм, созданных в конфигураторе.

            Еще никогда не были так просто доступны программистам 1С возможности:

            * Создать микросервис с произвольным сетевым протоколом, развернуть его на linux, в docker контейнере или кластере kubernetes
            * Выполнить сложную многопоточную вычислительную задачу для десятков тысяч подключающихся пользователей за миллисекунды
            * Взаимодействовать с пользователем через web-браузер с минимальным трафиком
            * Сохранять и получать данные с максимально доступной скоростью в key-value базах данн

            j123123, 12 Августа 2017

            Комментарии (39)
          7. Си / Говнокод #23254

            0

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            63. 63
            64. 64
            65. 65
            #include <stddef.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            
            void *govno[300] = {NULL};
            
            size_t govnopoindex = 0;
            
            void chisti_govno(void)
            {
              do
              {
                free(govno[--govnopoindex]);
              } while (govnopoindex != 0);
            }
            
            
            char *concat(char *a, char *b)
            {
              char *ptr = malloc(strlen(a)+strlen(b)+4);
              if (ptr == NULL)
              {
                fprintf(stderr, "Huli ty obosralsya, mudak blyad? Ves' heap zasral\n");
                chisti_govno(); // иди под струю мойся
                exit(-1);
              }
              sprintf(ptr, "(%s*%s)", a, b);
              govno[govnopoindex++] = ptr;
              return ptr;
            }
            
            
            char *pow_gen(size_t n, char *a, char *p)
            {
              if (n == 0)
              {
                return a;
              }
              if (n & 1)
              {
                return pow_gen(n >> 1, concat(a, p), concat(p, p));
              }
              else
              {
                return pow_gen(n >> 1, a, concat(p, p));
              }
            }
            
            char* pow_b2(size_t n) {
              return pow_gen(n, "1", "a");
            }
            
            void printfshit(const size_t pow)
            {
              printf("double pow_%zu(double a) {return %s;}\n\n", pow, pow_b2(pow));
            }
            
            
            int main(void)
            {
              printfshit(255);
              chisti_govno();
              return 0;
            }

            http://govnokod.ru/23246#comment388959 - считаю что это заслуживает отдельного говнокода

            j123123, 10 Августа 2017

            Комментарии (107)
          8. Си / Говнокод #23246

            +2

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            #include <stddef.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            
            char *concat(char *a, char *b)
            {
              char *ptr = malloc(strlen(a)+strlen(b)+6);
              if (ptr == NULL)
              {
                fprintf(stderr, "da ty ohuel!\n");
                exit(-1);
              }
              sprintf(ptr, "(%s)*(%s)", a, b);
              return ptr;
            }
            
            char *govno[255] = {"a"};
            
            void printfshit(const size_t pow, const char *mul_stuff)
            {
              printf("double pow_%zu(double a) {return %s;}\n\n", pow, mul_stuff);
            }
            
            void genshit(void)
            {
              //printfshit(0,"1");
              size_t end_ind = 1;
              size_t prev_stop = 0;
              size_t end_ind_tmp = 1;
              while (end_ind < 255)
              {
                for (size_t ind1 = 0; ind1 < end_ind_tmp; ind1++)
                {
                  for (size_t ind2 = prev_stop; ind2 < end_ind_tmp; ind2++)
                  {
                    if ( 
                         ((ind1+1) + (ind2+1) < 256) &&
                         (govno[(ind1+1) + (ind2+1)-1] == NULL)
                       )
                    {
                      govno[(ind1+1) + (ind2+1)-1] = concat(govno[ind1], govno[ind2]);
                      end_ind++;
                    }
                  }
                }
                prev_stop = end_ind_tmp;
                end_ind_tmp = end_ind;
              }
              printfshit(1,govno[0]);
              for (size_t i = 1; i < 255; i++ )
              {
                printfshit(i+1,govno[i]);
                free(govno[i]);
              }
            }
            
            int main(void)
            {
              genshit();
              return 0;
            }

            Кодогенератор, написаный специально для Antervis
            http://govnokod.ru/23227#comment388895

            j123123, 08 Августа 2017

            Комментарии (38)
          9. PHP / Говнокод #23242

            +3

            1. 1
            http://blog.extremehacking.org/blog/2017/07/31/hungarian-hacker-arrested-pressing-f12/

            Вкратце: в Будапеште за миллион баксов набыдлокодили систему продажи билетов на общественный транспорт с кучей багов, как например поле с суммой было readonly, но если поправить html в браузере, то можно цену поменять, а на бэкенде никто не стал проверку суммы делать. Пацанчик этот баг нашел, написал в саппорт, а через 2 недели его мусора загребли.

            j123123, 05 Августа 2017

            Комментарии (6)
          10. Си / Говнокод #23227

            −1

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            13. 13
            14. 14
            15. 15
            16. 16
            17. 17
            18. 18
            19. 19
            20. 20
            21. 21
            22. 22
            23. 23
            24. 24
            25. 25
            26. 26
            27. 27
            28. 28
            29. 29
            30. 30
            31. 31
            32. 32
            33. 33
            34. 34
            35. 35
            36. 36
            37. 37
            38. 38
            39. 39
            40. 40
            41. 41
            42. 42
            43. 43
            44. 44
            45. 45
            46. 46
            47. 47
            48. 48
            49. 49
            50. 50
            51. 51
            52. 52
            53. 53
            54. 54
            55. 55
            56. 56
            57. 57
            58. 58
            59. 59
            60. 60
            61. 61
            62. 62
            63. 63
            64. 64
            65. 65
            66. 66
            67. 67
            68. 68
            69. 69
            70. 70
            71. 71
            72. 72
            73. 73
            74. 74
            75. 75
            76. 76
            77. 77
            78. 78
            79. 79
            80. 80
            81. 81
            82. 82
            83. 83
            84. 84
            85. 85
            86. 86
            87. 87
            88. 88
            89. 89
            90. 90
            91. 91
            92. 92
            93. 93
            94. 94
            95. 95
            96. 96
            97. 97
            98. 98
            99. 99
            BYTE1 *GetLanguageCodeString( BYTE1	upper, BYTE1 lower , BYTE1  *lang_idx )
            {
            	int index = 0;
            	
            	switch(upper){
            		case 'a' :
            			switch(lower){
            				case 'a' : index = 0; break;
            				case 'b' : index = 1; break;
            				case 'f' : index = 2; break;
            				case 'm': index = 3; break;
            				case 'r': index = 4; break;
            				case 's': index = 5; break;
            				case 'y': index = 6; break;
            				case 'z': index = 7; break;
            				default: break;
            			}
            			break;
            		case 'b' :
            			switch(lower){
            				case 'a' : index = 8; break;
            				case 'e' : index = 9; break;
            				case 'g' : index = 10; break;
            				case 'h': index = 11; break;
            				case 'i': index = 12; break;
            				case 'n': index = 13; break;
            				case 'o': index = 14; break;
            				case 's': index = 136; break;	/* Added in SEIN 2004.04.01 KTJ */
            				default: break;
            			}
            			break;
            		case 'c' :
            			switch(lower){
            				case 'a' : index = 15; break;
            				case 'o' : index = 16; break;
            				case 's' : index = 17; break;
            				case 'y': index = 18; break;
            				default: break;
            			}
            			break;
            		case 'd' :
            			switch(lower){
            				case 'a' : index = 19; break;
            				case 'e' : index = 20; break;
            				case 'z' : index = 21; break;
            				default: break;
            			}
            			break;			
            		case 'e' :
            			switch(lower){
            				case 'l' : index = 22; break;
            				case 'n' : index = 23; break;
            				case 'o' : index = 24; break;
            				case 's': index = 25; break;
            				case 't': index = 26; break;
            				case 'u': index = 27; break;
            				break;
            			}
            			break;
            		case 'f' :
            			switch(lower){
            				case 'a' : index = 28; break;
            				case 'i' : index = 29; break;
            				case 'j' : index = 30; break;
            				case 'o': index = 31; break;
            				case 'r': index = 32; break;
            				case 'y': index = 33; break;
            				default: break;
            			}
            			break;
            		case 'g' :
            			switch(lower){
            				case 'a' : index = 34; break;
            				case 'd' : index = 35; break;
            				case 'l' : index = 36; break;
            				case 'n': index = 37; break;
            				case 'u': index = 38; break;
            				default: break;
            			}
            			break;
            		case 'h' :
            			switch(lower){
            				case 'a' : index = 39; break;
            				case 'e' : index = 40; break;
            				case 'i' : index = 41; break;
            				case 'r': index = 42; break;
            				case 'u': index = 43; break;
            				case 'y': index = 44; break;				
            				default: break;
            			}
            			break;			
            		case 'i' :
            			switch(lower){
            				case 'a' : index = 45; break;
            				case 'd' : index = 46; break;
            				case 'k': index = 47; break;
            				case 'n': index = 48; break;				
            				case 's': index = 49; break;
            				case 't': index = 50; break;

            питушня на switch для распознавания какой-то фигни с буквами

            j123123, 30 Июля 2017

            Комментарии (121)

Комментарии

Популярные сообщения из этого блога

8

Kiev

1