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

    +145

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    /* */
            int fooBar() {
                /* do something */
    
    /* - */     return NULL;
    /* + */     return 0ULL;
            }

    > src/foobar.c:42:3: warning: return makes integer from pointer without a cast
    > return NULL;

    П О Ч И Н Е Н О

    Запостил: Elvenfighter, 11 Марта 2015

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

    • return (int) (u64) 0;
      Ответить
    • хм. это с какой версии С "NULL" перестал быть "0"?
      Ответить
      • Вроде ж, был ((воид *)0)
        Ответить
        • не. он в С пожизненно был просто "0". потому что "0" есть оба - и число ноль, и нулевой указатель.
          Ответить
          • Вроде бы так: в сишке был ((void*)0), а в крестах тупо 0 (потому что void * без явного каста не раскастуется, в отличие от си). Но, скорее всего, там какой-нибудь implementation defined, и кто как хочет так и дрочит. Может быть в каких-то компиляторах и в сишке NULL это 0.
            Ответить
            • В общем борьба с инструментом
              Ответить
            • из студийного хедера:
              /* Define NULL pointer value */
              #ifndef NULL
              #ifdef __cplusplus
              #define NULL    0
              #else  /* __cplusplus */
              #define NULL    ((void *)0)
              #endif  /* __cplusplus */
              #endif  /* NULL */

              Из C99: NULL which expands to an implementation-defined null pointer constant;
              Ответить
              • > из студийного хедера
                Ну и в гнутой либе точно так же (плагиаторы!):
                #ifndef NULL
                #ifdef __cplusplus
                #define NULL    0
                #else
                #define NULL    ((void *)0)
                #endif
                #endif
                > implementation-defined
                Так я и знал...
                Ответить
      • stdlib
        #define NULL ((void *) 0)
        Ответить
    • Во мне что-то умерло при виде этого...
      Ответить
    • I always thought that using NULL whenever I wanted to assign a null pointer value to a pointer was a good thing, but today I learned the contrary.

      The standard, 6.3.2.3, says, seemingly innocent
      An integer constant expression with the value 0, or such an expression cast to type void*, is called a null pointer constant.
      An integer constant expression is something that evaluates at compile time and is of an integer type. Integer types are all the standard integer types that we all know, including plain char and _Bool, and enumeration types. In particular such expressions may contain casts to such types.

      So far this all sounds relatively innocent if you think of the primary use of null pointer constants namely to be assigned to pointer variables, but see below.
      Then later (7.17) is defined the macro
      NULL which expands to an implementation-defined null pointer constant
      This means that NULL may result in at least 12 different standard integer types and many more expressions that result in a null value in that type:
      [...]
      In summary,
      * NULL obfuscates an expression that can be either of integer type or of pointer type.
      * Whenever you want to initialize or assign to a pointer to a null value, use plain 0, it does serve well.
      * Whenever you use a null value in a function call for a parameter that has no prototype use (T*)0.

      https://gustedt.wordpress.com/2010/11/07/dont-use-null/

      Отака хуйня, малята.
      Ответить
      • Как-то недостаточно зловеще звучит. Питуизация сгладит 12 different standard integer types, неприятного осадка не останется.
        Вот я понимаю, C++, шаблоны, NULL и std::nullptr_t.
        Ответить
      • О как оно…

        char * ptr = '\0';
        http://ideone.com/rm7sr6
        Ответить
        • Сначала выглядит дико, но потом вспоминаешь, что '\0' это тот же 0. Только размером в char, а не int.
          Ответить
        • Приводишь char к char*? ССЗБ.
          Ответить
          • С99 6.3.2.3/5 An integer may be converted to any pointer type.
            Ответить
            • But result of this conversion is unspecified?
              Ответить
              • Почти ...
                the result is implementation-defined, might not be correctly aligned, might not point to an
                entity of the referenced type, and might be a trap representation.
                Ответить

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