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

    +130

    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
    int print_entry(const char* name, const char* dir,const struct stat* st)
    {
      if(!S_ISDIR(st->st_mode)){
          if(S_ISREG(st->st_mode)){
            printf("<file type=\"regular file\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
          };
          if(S_ISCHR(st->st_mode)){
            printf("<file type=\"charcter device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
          }
          if(S_ISBLK(st->st_mode)){
            printf("<file type=\"block device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
          }
          if(S_ISFIFO(st->st_mode)){
            printf("<file type=\"FIFO(named pipe)\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
          }
          if(S_ISLNK(st->st_mode)){
             char *linkname;
             ssize_t r;
             char *lname=strcat(dir,"");
             linkname =  new char[st->st_size + 1];
             if (linkname == NULL) {
                fprintf(stderr, "insufficient memory\n");
                exit(EXIT_FAILURE);
             }
            r=readlink(lname, linkname, st->st_size + 1);
            if (r < 0) {
              return 0;
            }
               if (r > st->st_size) {
            fprintf(stderr, "symlink increased in size "
                            "between lstat() and readlink()\n");
            exit(EXIT_FAILURE);
        }
    
            linkname[st->st_size] = '\0';
            printf("<file type=\"symbolic link\" owner=\"%d\" group=\"%d\" linkname=\"%s\">%s/%s</file>\n",st->st_uid,st->st_gid,linkname,dir,name);
          }
          if(S_ISSOCK(st->st_mode)){
            printf("<file type=\"socket\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
          }
        }
        return 0;
    }
     
    int main(int argc, char* argv[])
    {
    if(argc != 2)
        {
        fprintf(stderr, "Usage: %s DIR\n", argv[0]);
        exit(1);
        }
        printf("<dir name=\"%s\">\n",argv[1]);
        walk(argv[1], print_entry, 1,0);
        printf("</dir>",argv[1]);
    }

    Создание xml файла всех директорий, поддиректорий и их файлов

    Запостил: AliceGoth, 22 Июня 2012

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

    • };
      Автор тот же?

      linkname = new char[st->st_size + 1]; - какой ещё С?
      int main без return - халтура какая-то.

      Вот уж не думал что файл может одновременно быть:
      regular file, charcter device, block device, FIFO(named pipe).
      Ответить
      • new течёт кстати
        Ответить
        • «Та нормально, память всё равно освободится после завершения программы» (с)
          Ответить
        • Зато автор проверил, что new не возвращает NULL ;)
          Вдруг злые люди переопределят его, и оно перестанет вбрасывать std::bad_alloc...
          Ответить
          • Я тут недавно читал историю, чем закончилось переопределение глобального new в webkit'е...
            Ответить
    • херня какая-то
      Ответить
    • это же @ AliceGoth
      Ответить
    • AliceGoth - какой то препод, хвалящийся работами студентоты по теме "обработка xml на C"?
      Ответить
    • показать все, что скрытоКакой багор )))
      Ответить
    • Исправил http://pastebin.com/KzTmbkFf
      Ответить
      • Это просто пиздец какой-то а не код. Ворнинги читать религия не позволяет?
        1.cpp:29:5: ошибка: слишком много аргументов для форматирования [-Werror=format-extra-args]
        1.cpp:33:5: ошибка: слишком много аргументов для форматирования [-Werror=format-extra-args]
        1.cpp:43:31: ошибка: некорректное преобразование из «const char*» в «char*» [-fpermissive]
        ...
        Ответить
      • Итак, разбор кода и советы:

        1) Надо бы выбрать какой-либо приличный стиль форматирования кода и придерживаться его.
        2) Если мы пишем на С - то new и delete в нем нет, а есть malloc и free.
        3) Всегда компилим код как минимум с -Wall и -Wextra. Они ничего плохого не сделают, а кучу глупых ошибок помогут устранить.
        4) return используем в void функциях, return <значение> в остальных (строка 86).
        5) strcat портит свой первый аргумент (строка 43) поэтому внимательно читаем man strcat и переделываем как положено.
        6) У xml в первой строке желательно поставить декларацию с версией и кодировкой.
        Ответить
      • 7) Возможна утечка, если в строке 49 readlink() вернет -1
        Ответить
        • http://pastebin.com/Wa4AaATm
          Ответить
          • Еще в 29, 33, 87 строках лишние параметры у printf.
            Результат, возвращаемый walk, игнорируется.
            Ответить
          • Ну и если walk претендует на общность и использование в других проектах - надо бы выкинуть из него вывод <dir></dir> и продумать, как бы этот вывод реализовать в колбеке.
            Ответить
          • 1) Не смешивайте С и С++, это плохо для переваривания психикой
            Если плюсы, то std::cout, std::cin и иже с ними.
            2) linkname = NULL;
            Не нужно, скоуп решает.
            3) Посмотрите реализацию инициализации-проверки для ваших if'ов в JavaScript
            4) Единообразный стиль очень не помешает:
            - если exit(EXIT_FAILURE); - то уж везде exit(EXIT_FAILURE);
            - формат вывода ошибок

            И уже, в конце-то концов http://ftp.gnu.org/gnu/coreutils/ есть такое ls.c

            Обратите внимание на книгу «Linux программирование в примерах» А.Роббинс
            Ответить

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