Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: непонятные странности gcc-4.6 (oneric 11.10)  (Прочитано 1661 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
непонятные странности gcc-4.6 (oneric 11.10)
« : 24 Октября 2011, 03:03:52 »
собственно вот то что у меня всегда работало как часы, а сейчас влетает непонятный сегфолт. поставил новую Kubuntu, gnulib из репов. Не доходит до меня почему Ubuntu не дружит с glibc-source и как это исправить.

#include <stdio.h>

int main()
{
  char *a = "123456";
  int i = 0;
 
  while (a[i + 1] != '\0')
    a[i++] = a[i + 1];
  printf("%s\n", a);
 
  return 0;
}
(gdb) file a.out
Reading symbols from /home/deadman/documents/a.out...(no debugging symbols found)...done.
(gdb) start
Temporary breakpoint 1 at 0x80483d7
Starting program: /home/deadman/documents/a.out

Temporary breakpoint 1, 0x080483d7 in main ()
(gdb) step
Single stepping until exit from function main,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x08048405 in main ()
(gdb) bt
#0  0x08048405 in main ()
(gdb)
« Последнее редактирование: 24 Октября 2011, 03:50:53 от ChertopoloX »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #1 : 24 Октября 2011, 05:40:24 »
Правильный сегфолт. Можно даже сказать классический.
сравни char* и const char*. "123456" это const char *
Ты пытаешься модифицировать константные данные. Получаешь по голове.

yurik@yurik-pc:~$ g++ -Wall -Wextra test.c
test.c: В функции «int main()»:
test.c:5:13: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
test.c:9:22: предупреждение: операция над «i» может дать неопределенный результат [-Wsequence-point]

Си до какой-то степени позволяет вольно обращаться с константностю строк, пока это не приводит к сегфолту =)
Какого черта он не выдал предупреждение я не понял, поэтому грязный хак с вызовом С++ компилятора. Он стабильно даёт предупреждение на такую конструкцию.

Ну и с индексами у тебя не порядок (см. второе предупреждение)

#include <stdio.h>

int main()
{
  char a[] = "123456";
  int i;
 
  for (i = 0; a[i + 1] != '\0'; ++i)
    a[i] = a[i + 1];

  printf("%s\n", a);
 
  return 0;
}

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #2 : 24 Октября 2011, 07:16:13 »
#include <stdio.h>

int main()
{
  char a[] = "123456";
  int i;
 
  for (i=0;i<strlen(str);i++)
     a[i] = a[i + 1];

  printf("%s\n", a);
 
  return 0;
}

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #3 : 25 Октября 2011, 08:44:22 »
i<strlen(str);

Вызов функции при каждой итерации? Можно но глупо, лучше как было написанно. И вроде последний символ надо еще затереть нулем, иначе там 6 останется, но тут я не в курсе про условие задачи.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #4 : 25 Октября 2011, 09:15:23 »
Современный компилятор вычисляет strlen(str) один раз в данном случае.

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #5 : 25 Октября 2011, 13:32:25 »
Цитировать
Вызов функции при каждой итерации?
нету вызова каждый раз. Вычисляется однажды и записывается в регистр (или еще куда). Я просто никогда раньше не сталкивался с тем что (char *x = "blabla") == (const char *x = "blabla") обычно указатель либо для констант используется, либо для динамик мемори с файловым i\o. спасибо за помощь.
Цитировать
Ну и с индексами у тебя не порядок (см. второе предупреждение)
нету там особых непорядков, все красиво и компактно.

А может подскажет кто побитовые операции с ячейками вида.
unsigned char *x = 4096;Я вижу только цикл, но что-то он меня не вдохновляет. Скажем, к примеру, возведение двойки в степень 1000. Конечно для этого есть уже реализованные алгоритмы, но там использованы другие инструменты (int, char_to_int, int_to_char), а можно было бы реализовать подобную задачу с помощью указателя на байт и битовой маски для вычисления переноса в младший (счет слева направо) байт.
« Последнее редактирование: 25 Октября 2011, 14:03:35 от ChertopoloX »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #6 : 26 Октября 2011, 07:21:10 »
Цитировать
Вызов функции при каждой итерации?
нету вызова каждый раз. Вычисляется однажды и записывается в регистр (или еще куда).
Вообще-то описан именно вызов при каждой итерации. то что компиляторы умеют это оптимизировать не должно расслаблять. ибо раз на раз не приходится. может подвернуться другой компилятор/другая платформа и приплыли
(Нажмите, чтобы показать/скрыть)


Я просто никогда раньше не сталкивался с тем
что (char *x = "blabla") == (const char *x = "blabla") обычно указатель либо для констант используется, либо для динамик мемори с файловым i\o. спасибо за помощь.
Что-то мой смыслоуловитель заглючил на этой фразе.

Цитировать
Ну и с индексами у тебя не порядок (см. второе предупреждение)
нету там особых непорядков, все красиво и компактно.
Ага утешай себя. Только вот компилятор тебя предупредил что в зависимости от фаз луны код будет давать раный результат. Использование и модиификация i без разделения sequence point'ом чревато... Описано где-то на первых страницах стандарта почитай на досуге.

А может подскажет кто побитовые операции с ячейками вида.
unsigned char *x = 4096;Я вижу только цикл, но что-то он меня не вдохновляет. Скажем, к примеру, возведение двойки в степень 1000. Конечно для этого есть уже реализованные алгоритмы, но там использованы другие инструменты (int, char_to_int, int_to_char), а можно было бы реализовать подобную задачу с помощью указателя на байт и битовой маски для вычисления переноса в младший (счет слева направо) байт.
Опять смыслоуловитель заглючил. Какие ячейки какие битовые операции. Ты указателю присобачил взятое с потолка значение.
Вообще при чем здесь 2^1000? Для того чтобы обрабатывать такие циферки боюсь нужен будет весьма не трвиальный код.
читай

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #7 : 27 Октября 2011, 06:07:51 »
Yurror, ты наверное думаешь что я не понимаю предмет беседы... только смыслоуловитель не у меня глючит. Ссылочку это тебе самому полезно было бы почитать. И если подобная задача для тебя весьма нетривиальная, может лучше грузчиком пойти? Решения этой задачи есть. Меня не устраивают эти решения (почему - я пояснил), реализацию я и так вижу, просто во-первых лень сделать, во-вторых других дел хватает, в-третьих с языком не определился. Чепуха, флуд пошел. Гугл он меня читать отсылает... корона у тебя выросла в одном месте. Если сам не знаешь предмета, то хоть не надо умняк лепить. Могу себе представить как твой мозг взорвется для n ^ m, m >= 1000000
« Последнее редактирование: 27 Октября 2011, 06:21:11 от ChertopoloX »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #8 : 27 Октября 2011, 07:24:57 »
ChertopoloX, ну это не я пришел с тривиальным вопросом на форум. Видимо помощи тебе больше не надо. Пока.

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #9 : 28 Октября 2011, 05:44:54 »
Видимо помощи тебе больше не надо. Пока.
Только я никак увязать не могу слова о помощи из поста #8 и пост #6, где ты трясешь своей седой бородой, которой и нет в принципе. Конечно пока, еще как пока, я бы даже сказал прости - прощай.

Оффлайн Vovaldo

  • Любитель
  • *
  • Сообщений: 82
  • Ху Тин Пуй
    • Просмотр профиля
    • Путин забрал у Медведева инновационный орган
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #10 : 28 Октября 2011, 06:50:10 »
Видимо помощи тебе больше не надо. Пока.
где ты трясешь своей седой бородой,
Гы... А ты трясёшь своей пустой головой. Которая даже не удосужилась разобраться - что же такое указатели и с чем их едят.

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #11 : 29 Октября 2011, 14:33:50 »
Цитировать
Гы... А ты трясёшь своей пустой головой. Которая даже не удосужилась разобраться - что же такое указатели и с чем их едят.
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char *x, i = 0;

    x = (char*) malloc(2 * sizeof(char));
    if (!x)
        exit ( -1 );

    x[0] = 40;
    x[1] = 96;

    while (x[i] != 0)
        printf("%d", x[i++]);

    free(x);
    return 0;
}
так дошло, петикантроп? понаплодятся бараны, и доказывают что баран ты, а не они.
« Последнее редактирование: 29 Октября 2011, 14:45:54 от ChertopoloX »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #12 : 29 Октября 2011, 14:51:38 »
Цитировать
Гы... А ты трясёшь своей пустой головой. Которая даже не удосужилась разобраться - что же такое указатели и с чем их едят.
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char *x, i = 0;

    x = (char*) malloc(2 * sizeof(char));
    if (!x)
        exit ( -1 );

    x[0] = 40;
    x[1] = 96;

    while (x[i] != 0)
        printf("%d", x[i++]);

    free(x);
    return 0;
}
так дошло, петикантроп? понаплодятся бараны, и доказывают что баран ты, а не они.
Гы... реальная ржака =)
Тебе случаем не потролить сюда привели?
yurik@yurik-pc:~$ valgrind ./test
==32580== Memcheck, a memory error detector
==32580== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==32580== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==32580== Command: ./test
==32580==
==32580== Invalid read of size 1
==32580==    at 0x400643: main (in /home/yurik/test)
==32580==  Address 0x51ce042 is 0 bytes after a block of size 2 alloc'd
==32580==    at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==32580==    by 0x4005E9: main (in /home/yurik/test)
==32580==
4096==32580==
==32580== HEAP SUMMARY:
==32580==     in use at exit: 0 bytes in 0 blocks
==32580==   total heap usage: 1 allocs, 1 frees, 2 bytes allocated
==32580==
==32580== All heap blocks were freed -- no leaks are possible
==32580==
==32580== For counts of detected and suppressed errors, rerun with: -v
==32580== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
yurik@yurik-pc:~$
« Последнее редактирование: 29 Октября 2011, 14:59:42 от Yurror »

Оффлайн ChertopoloX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #13 : 29 Октября 2011, 16:25:28 »
ну если смыслоуловитель не посзволяет написать так
x = (char*) malloc(3 * sizeof(char));
x[2] = 0;
то можно еще дальше ржать... и замечать о троллинге просто из непонимания предмета
« Последнее редактирование: 29 Октября 2011, 16:30:19 от ChertopoloX »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: непонятные странности gcc-4.6 (oneric 11.10)
« Ответ #14 : 29 Октября 2011, 19:46:36 »
О да... все мы горазды сказать "ааа, да да да..." когда носом ткнули =)
иногда лучше жевать чем гворить (с)

 

Страница сгенерирована за 0.02 секунд. Запросов: 21.