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

    −17

    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
    /* skip directories */
    	if (S_ISDIR(statbuf.st_mode))
    		goto out;
    
    	/* skip non-readable files */
    	if ((statbuf.st_mode & S_IRUSR) == 0)
    		goto out;
    
    	/* read attribute value */
    	fd = open(path, O_RDONLY);
    	if (fd < 0) {
    		dbg(udev_device->udev, "attribute '%s' can not be opened\n", path);
    		goto out;
    	}
    	size = read(fd, value, sizeof(value));
    	close(fd);
    	if (size < 0)
    		goto out;
    	if (size == sizeof(value))
    		goto out;
    
    	/* got a valid value, store it in cache and return it */
    	value[size] = '\0';
    	util_remove_trailing_chars(value, '\n');
    	dbg(udev_device->udev, "'%s' has attribute value '%s'\n", path, value);
    	list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_list, sysattr, value, 0, 0);
    	val = udev_list_entry_get_value(list_entry);
    out:
    	return val;

    Кусок libudev, OpenSource теперь с goto

    Запостил: semoro, 02 Июля 2016

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

    • И так вся функция, везде goto out
      Ответить
      • Это нормально. Классическая сишная идиома. Читай это как обработку исключений.

        З.Ы. В других функциях после метки out всяко есть освобождение ресурсов.
        Ответить
        • Т.е это рудимент с тех времён когда в этой функции выделялась память?
          Ответить
          • Это общий стиль для всей проги, видимо.

            Вот "оптимизируешь" ты сейчас всё это return'ами, а потом тебе в этой функции потребуется выделить память. Будешь обратно goto втыкать?

            Короче в данном контектсте goto - не говно, а средство передвижения.
            Ответить
            • Как бы goto - это не ёбаный путин, в смысле жупел, чтобы бояться одного его вида. В данном случае вполне себе оправдано.
              Ответить
            • Это стиль только для этой функции, в остальных нету
              Ответить
              • Ну там вон видно close(fd). Может быть от него рудименты.
                Ответить
    • Не всё то говно, что goto.
      Ответить
    • Укушенный радиоактивным Эдсгером Дейкстрой, semoro превратился в человека-дейкстру и отправился бороться с goto в проекте.
      Ответить
    • все увидели гото, а то, что переменные именованы хуй пойми как - никто не заметил
      Ответить

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