Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка 'Segmentation fault' 
:(
    Опции темы
extira
Дата 27.4.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



При работе программы вылетает ошибка Segmentation fault

Если в switch идти по варианту 'd' вылетает в промежутке между printf("TEST4\n") и printf("TREST"). TEST4 выводит а TREST уже нет.
Если в switch идти по варианту 'f' то вылетает сразуже даже не печатая test10.

Я даже не знаю в какую сторону копать.

ЗЫ. Закоменчено конечноже все это не было.

Вот кусок кода:
Код

int main (int argc, char *argv[])
{
    if(argc!=3||((argv[1][0]!='d'||argv[1][0]!='f')&& argv[1][1]!=0))
    {
        printf("The program %s takes 2 arguments:\n\t 1 -  \"d\" - make matrix of all included elements in directory\n\t\t\"f\" - make matrix of element n\t 2 -  full path to element\n", argv[0]);
        return 0;
    }
    
    struct stat info;
    struct filerights *fileinfo=NULL;    
    int ret;
    DIR *directory=NULL;
    struct dirent *entry=NULL;
    struct dirent *entry1=NULL;
    int i=0, j=0;
    size_t path, name;
    char *fullpath=NULL;
    int ii=0;
    struct passwd **users;
    int k=0, l=0;
    
    switch (argv[1][0])
    {
        case 'd':
            directory=opendir(argv[2]);
            if(directory==NULL)
            {
                perror("ERROR:");
                return 0;
            }
            while (entry = readdir(directory)) 
            {
                if(entry == NULL)
                {
                    perror("ERROR1:");
                }
                else
                {
                    i=i+1;
                }
            }
            if(closedir(directory)==(-1))
            {
                perror("ERROR");
            }
            fileinfo=malloc(i*sizeof(struct filerights));
            if(fileinfo==NULL)
            {
                perror("ERROR:");
            }
            directory=opendir(argv[2]);
            if(directory==NULL)
            {
                perror("ERROR:");
            }
            path=strlen(argv[2]);
//            printf("%d\n",i);
            for(j=0;j<i;j++)
            {
//                printf("%d\n",j);
                entry1=readdir(directory);
                if(entry1==NULL)
                {
                    perror("ERROR");
                    printf("End");
                    return 0;
                }
                else
                {
//                    printf("working %d\n", j);
                }
//                printf("%s\n", entry1->d_name);
                name=strlen(entry1->d_name);
                fullpath=malloc(path+name);
                if(fullpath==NULL)
                {
                    perror("ERROR");
                }
                if(strcpy(fullpath,argv[2])==NULL)
                {
                    perror("ERROR");
                }
                if(strcat(fullpath,entry1->d_name)==NULL)
                {
                    perror("ERROR");
                }
//                printf("%s\n", fullpath);

                if(!stat(fullpath, &info))
                {
//                    printf("testI");
                    if(strcpy(fileinfo[j].name, fullpath)==NULL)
                    {
                        perror("ERROR");
                    }
//                    printf("%s\n", fileinfo[j].name);
                    fileinfo[j].uid=info.st_uid;
                    fileinfo[j].gid=info.st_gid;
                
                    if((info.st_mode|1)==info.st_mode)
                    {
                        fileinfo[j].execute_other=1;
                    }
                    else
                    {
                        fileinfo[j].execute_other=0;
                    }
                    if((info.st_mode|2)==info.st_mode)
                    {
                        fileinfo[j].write_other=1;
                    }
                    else
                    {
                        fileinfo[j].write_other=0;
                    }
                    if((info.st_mode|4)==info.st_mode)
                    {
                        fileinfo[j].read_other=1;
                    }
                    else
                    {
                        fileinfo[j].read_other=0;
                    }
                    if((info.st_mode|8)==info.st_mode)
                    {
                        fileinfo[j].execute_group=1;
                    }
                    else
                    {
                        fileinfo[j].execute_group=0;
                    }
                    if((info.st_mode|16)==info.st_mode)
                    {
                        fileinfo[j].write_group=1;
                    }
                    else
                    {
                        fileinfo[j].write_group=0;
                    }
                    if((info.st_mode|32)==info.st_mode)
                    {
                        fileinfo[j].read_group=1;
                    }
                    else
                    {
                        fileinfo[j].read_group=0;
                    }
                    if((info.st_mode|64)==info.st_mode)
                    {
                        fileinfo[j].execute_owner=1;
                    }
                    else
                    {
                        fileinfo[j].execute_owner=0;
                    }
                    if((info.st_mode|128)==info.st_mode)
                    {
                        fileinfo[j].write_owner=1;
                    }
                    else
                    {
                        fileinfo[j].write_owner=0;
                    }
                    if((info.st_mode|256)==info.st_mode)
                    {
                        fileinfo[j].read_owner=1;
                    }
                    else
                    {
                        fileinfo[j].read_owner=0;
                    }
                    if((info.st_mode|512)==info.st_mode)
                    {
                        fileinfo[j].sticky_bit=1;
                    }
                    else
                    {
                        fileinfo[j].sticky_bit=0;
                    }
                    if((info.st_mode|1024)==info.st_mode)
                    {
                        fileinfo[j].set_gid=1;
                    }
                    else
                    {
                        fileinfo[j].set_gid=0;
                    }
                    if((info.st_mode|2048)==info.st_mode)
                    {
                        fileinfo[j].set_uid=1;
                    }
                    else
                    {
                        fileinfo[j].set_uid=0;
                    }
                }
                else
                {
                    perror("ERROR:");
                    return 0;
                }
                free(fullpath);
            }
//            printf("TEST\n");
            closedir(directory);
//            free(fullpath);
//            printf("TEST1\n");
//            printf("TEST2\n");
//            printf("TEST3\n");
//            printf("TEST4\n");    
            break;
        case 'f':
//            printf("test10");
            i=1;
//            printf("test1");
            fileinfo=malloc((size_t)sizeof(struct filerights));
//            printf("test2");
            if(!stat(argv[2], &info))
            {
                strcpy(fileinfo->name, argv[2]);
                fileinfo->uid=info.st_uid;
                fileinfo->gid=info.st_gid;
                
                if((info.st_mode|1)==info.st_mode)
                {
                    fileinfo->execute_other=1;
                }
                else
                {
                    fileinfo->execute_other=0;
                }
                if((info.st_mode|2)==info.st_mode)
                {
                    fileinfo->write_other=1;
                }
                else
                {
                    fileinfo->write_other=0;
                }
                if((info.st_mode|4)==info.st_mode)
                {
                    fileinfo->read_other=1;
                }
                else
                {
                    fileinfo->read_other=0;
                }
                if((info.st_mode|8)==info.st_mode)
                {
                    fileinfo->execute_group=1;
                }
                else
                {
                    fileinfo->execute_group=0;
                }
                if((info.st_mode|16)==info.st_mode)
                {
                    fileinfo->write_group=1;
                }
                else
                {
                    fileinfo->write_group=0;
                }
                if((info.st_mode|32)==info.st_mode)
                {
                    fileinfo->read_group=1;
                }
                else
                {
                    fileinfo->read_group=0;
                }
                if((info.st_mode|64)==info.st_mode)
                {
                    fileinfo->execute_owner=1;
                }
                else
                {
                    fileinfo->execute_owner=0;
                }
                if((info.st_mode|128)==info.st_mode)
                {
                    fileinfo->write_owner=1;
                }
                else
                {
                    fileinfo->write_owner=0;
                }
                if((info.st_mode|256)==info.st_mode)
                {
                    fileinfo->read_owner=1;
                }
                else
                {
                    fileinfo->read_owner=0;
                }
                if((info.st_mode|512)==info.st_mode)
                {
                    fileinfo->sticky_bit=1;
                }
                else
                {
                    fileinfo->sticky_bit=0;
                }
                if((info.st_mode|1024)==info.st_mode)
                {
                    fileinfo->set_gid=1;
                }
                else
                {
                    fileinfo->set_gid=0;
                }
                if((info.st_mode|2048)==info.st_mode)
                {
                    fileinfo->set_uid=1;
                }
                else
                {
                    fileinfo->set_uid=0;
                }
            }
            else
            {
                perror("ERROR:");
                return 0;
            }
            break;
    }
//    printf("TREST");
    
//    printf("test3");

    setpwent();
.............................

PM MAIL   Вверх
azesmcar
Дата 27.4.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата

Вот кусок кода:

Какой ужас. Если это кусок, я представляю как выглядет весь код smile 

Цитата

Я даже не знаю в какую сторону копать.

В сторону дебагера smile 

Еще можно через strace запустить

Цитата

# strace ./program

PM   Вверх
MAKCim
Дата 27.4.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



extira, 
откройте для себя valgrind

Добавлено через 3 минуты и 42 секунды
extira, 
Цитата(extira @  27.4.2009,  13:26 Найти цитируемый пост)
fullpath=malloc(path+name);

вот на это обратите особое внимание


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
extira
Дата 28.4.2009, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Спасибо разобралась, было несколько ошибок с выделением меньшей памяти чем нужно и с присваиванием указателей, пришлось копировать области памяти.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.