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

    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
    char *SomeGlobalPointer {};
    
    void foo()
    {
      SomeGlobalPointer = new char[1024];
    }
    
    int main()
    {
      foo();
    
      if (!SomeGlobalPointer)
      {
        delete[] SomeGlobalPointer;
      }
    
      return 0;
    }

    Отсюдова:

    https://pvs-studio.ru/ru/blog/posts/cpp/1068/

    Запостил: CEHT9I6PbCKuu_nemyx, 13 Сентября 2023

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

    • SEO-поц: И где тут утечка?
      Ответить
    • Какой противный код: глобалка, да еще и ручной new.

      Вызывает подозрение строка двенадцать
      Ответить
      • Именно. Тут отрицание не нужно.
        Ответить
        • так краш же будет? если не в синтетике и foo не вызовется
          Ответить
          • Смотри внимательно:
            if (!SomeGlobalPointer)
              {
               // эта ветка вызовется, только если SomeGlobalPointer == 0
              }
            Ответить
            • это я сразу понял

              delete[] на 0 это ж краш?
              Ответить
              • Оказывается, не факт:

                If expression evaluates to a null pointer value, no destructors are called, and the deallocation function may or may not be called (it's unspecified), but the default deallocation functions are guaranteed to do nothing when passed a null pointer.

                https://en.cppreference.com/w/cpp/language/delete

                Т. е. зависит от типа. Встроенные деаллокаторы обещают с нулём ничего не делать.
                Ответить
                • а по умолчанию SomeGlobalPointer на nullptr указывает или на мусор? я так понимаю, зависит от release/debug?
                  Ответить
                  • У статической переменной значением будет нуль по стандарту наскока я помню. Это сделано вероятно потому, что операцинка выделяет тебе память предварительно обнулив, чтобы тебе не досталось памяти чужого процесса (и ты не узнал грязные секретики)

                    Алсо, тут vlaue инициализатор "{}" который явно закажет туда nullptr
                    Ответить
                    • Кстати, NULL — это всегда ноль или на каких-то платформах в нём могут быть установленные биты?
                      Ответить
                      • https://c-faq.com/null/machexamp.html
                        https://govnokod.ru/24560

                        Насчет крестоговна - не уверен.
                        Ответить

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