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

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #include <stdio.h>
    #include <inttypes.h> 
    
    int main(void) {
    	float a = 0;
    	float b = -9.8 * 0;
    	uint32_t* pa = (void*)&a;
    	uint32_t* pb = (void*)&b;
    	printf("%li %li %i %f %f\n",pa[0] , pb[0], pb[0]>>31, b+0, b);
    	return 0;
    }

    Нолик со взведенным знаковым битом. Вот зачем он нужен?

    Psionic, 16 Августа 2018

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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    Ритчи, Томпсон, [s]Страуструп[/s] всё-таки охуенные дедки.
    Приклоняюсь перед ними.
    Придумали хуету хуй знает когда, которую, спустя 50 лет
    хуй кто смог переплюнуть. Ничего лучше за это время придумали.
    (Кроме «PHP», разумеется)
    И вряд ли придумают ещё лет сто.

    LinuxGovno, 10 Августа 2018

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

    0

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

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

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

    j123123, 01 Августа 2018

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

    +2

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

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

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

    j123123, 31 Июля 2018

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

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    #ifdef DEBUG
    static int (*printfn)(FILE *stream, const char *format, ...) = fprintf;
    #else
    static void (*printfn)(int priority, const char *format, ...) = syslog;
    #endif
    
    /* somewhere in getopt() options */
    #ifdef DEBUG
        printfn = noprintf;
    #else
        printfn = nosyslog;
    #endif
    
    /* elsewhere in a common header file */
    #ifdef DEBUG
    #undef LOG_ERR
    #undef LOG_WARNING
    #undef LOG_INFO
    #define LOG_ERR stderr
    #define LOG_WARNING stderr
    #define LOG_INFO stderr
    #endif
    
    void nosyslog(int priority, const char *format, ...)
    {
        (void)priority;
        (void)format;
    }
    
    int noprintf(FILE *stream, const char *format, ...)
    {
        (void)stream;
        (void)format;
        return 0;
    }

    А попроще способа для --quiet / -DDEBUG нету?

    codemonkey, 29 Июля 2018

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

    +1

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

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

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

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

    j123123, 28 Июля 2018

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

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    #include <stdio.h>
    
    int main(void) {
        int a, b;
        int *p = &a;
        int *q = &b + 1;
        printf("%p %p %d\n", (void *)p, (void *)q, p == q);
        return 0;
    }

    https://habr.com/company/pvs-studio/blog/418023/

    0x7fff4a35b19c 0x7fff4a35b19c 0

    кто понимает почему?

    guestinxo, 25 Июля 2018

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

    −3

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

    raii

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

    j123123, 19 Июля 2018

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

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    #include <stdio.h>
    #include <inttypes.h>
         
    int main(void) {
      
    	uint64_t a = 1<<31;
    	uint64_t b = 1<<32;
    	uint64_t c = (uint64_t)1<<32;
         
    	printf("a:%llx\n", a);
    	printf("b:%llx\n", b);
    	printf("c:%llx\n", c);
         
    	return 0;
    }

    a:ffffffff80000000
    b:0
    c:100000000

    Занимался битоёбством и не сразу понял откуда в алгоритме мусор.

    govnokod3r, 16 Июля 2018

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

    0

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

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

    j123123, 15 Июля 2018

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