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

    +137

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    void
    meta_window_constrain (MetaWindow          *window,
                           MetaFrameBorders    *orig_borders,
                           MetaMoveResizeFlags  flags,
                           int                  resize_gravity,
                           const MetaRectangle *orig,
                           MetaRectangle       *new)
    {
      ConstraintInfo info;
    
      /* ... */
    
      setup_constraint_info (&info, window,  orig_borders, flags, resize_gravity, orig, new);
    
      /* ... */
    
      /* Ew, what an ugly way to do things.  Destructors (in a real OOP language,
       * not gobject-style--gobject would be more pain than it's worth) or
       * smart pointers would be so much nicer here.  *shrug*
       */
      if (!orig_borders)
        g_free (info.borders);
    }
    
    static void
    setup_constraint_info (/* ... */)
    {
      /* ... */
    
      /* Create a fake frame geometry if none really exists */
      if (orig_borders && !window->fullscreen)
        info->borders = orig_borders;
      else
        info->borders = g_new0 (MetaFrameBorders, 1);
    
      /* ... */
    }

    http://git.gnome.org/browse/mutter/tree/src/core/constraints.c

    Запостил: rat4, 29 Июня 2012

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

    • Если кто-то вдруг найдёт ошибку, то патч я уже отправил.
      Ответить
      • Забавно. Если бордеров нет - создаем их, а потом освобождаем... А ошибка в том, что g_free() не помещает NULL в info.borders и это надо бы сделать самому?
        Ответить
        • info лежит на стеке, какая разница что там будет после выхода из функции?
          Ответить
          • Ну да, затупил. А в чем тогда ошибка?
            Ответить
          • А ну да. Если orig_borders && window->fullscreen то течет.

            - if (!orig_borders)
            + if (!orig_borders || window->fullscreen)
            Ответить
            • Таки не угадал.
              Ответить
              • Хм. А в чем тогда подвох?
                Ответить
                • >it's really ugly to duplicate the complicated
                  check

                  http://git.gnome.org/browse/mutter/commit/src/core/constraints.c?id=255347f87626c4715d0d661 c6f8918676b341aee
                  Ответить
                  • Ясно. Т.е. накосячил я все-таки в патче, а не в причине утечки...

                    >it's really ugly to duplicate the complicated check
                    Ну да, полностью согласен.
                    Ответить
    • Метапрограмиррование на Си
      Ответить
    • И почему "new" подсвечивается в сишном разделе?!
      Ответить
    • А что такое static void?
      Ответить
      • функция, которая ничего возвращает и видна только внутри единицы компиляции.
        Ответить
        • > и видна только внутри единицы компиляции
          Не понял, а без static не так?
          Ответить
          • без статик эта функция как минимум видна в obj файле по имени
            Ответить
          • Этож сишка, тут нет private.
            Ну не включишь ты эту функцию в заголовочный файл, умники смогут её подцепить через extern и таки соберут аппликейшн. А со static на линковке ошибка будет.
            Ответить
            • А, понял, это чтобы функция уж наверняка из cpp не вылезла наружу.
              Ответить
              • И, что самое важное, не пересеклась случайно с другой так же названной функцией (что приведет к ошибке линковки).
                Ответить
          • > Не понял, а без static не так?
            Нет.
            Ответить
      • Неподвижная пустота.
        Ответить

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