LINUX.ORG.RU

Нашёл баг, кроме как переустановкой glibc, можно как-будь исправить?


0

0

Slackware 10 (Проверял на 2-х машинах)!

#include <stdio.h>
#include <stdlib.h>

main()
{
char *ns, *ps;
printf("%s\n", "Введите число");
fgets(ns, 5, stdin);
printf("%s\n", "Введите разряд");
fgets(ps, 5, stdin);
printf("%s %d\n", "Результат сдвига вправо ", atoi(ns) >> atoi(ps));
}

(gdb) run
Starting program: /root/a.out
Введите число
16
Введите разряд
1

Program received signal SIGSEGV, Segmentation fault.
0x4008d5c5 in _IO_getline_info () from /lib/libc.so.6

ldd a.out
libc.so.6 => /lib/libc.so.6 (0x4002a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Дома стоит компилятор 2.95.3, что самое интересное, выдаёт верный результат, но вылетает в sig fault, во второй библиотеке!
Тестировал со всеми битовыми операциями, результат аналогичный!
Выши мнения!

★★★★★

А просто взять и выучить "C" тебе в голову не приходило?

книжку там почитать и т.д.

char *ns, *ps;
printf("%s\n", "Введите число");
fgets(ns, 5, stdin);

ns указывает на неизвестно что,
почему ты думаешь что не должен получать seg fault в ответ на работу
своей программы?

надо делать примерно так

char ns[1024];
printf("%s\n", "Введите число");
fgets(ns, sizeof(ns), stdin);

fghj ★★★★★
()
Ответ на: комментарий от UVV

> тогда почему данный пример без проблем идёт на RedHat?

Потому, что ПОВЕЗЛО! Поведение программы, в коде которой было проделано такое действо, как запись по адресу неинициализированного указателя, не определено. И вообще, чтобы таких ошибок впредь избегать, пиши char * n = null; там етбя будут сразу сегфолтить :-) А еще можно сказать MALLOC_CHECK_=1 или MALLOC_CHECK_=2 ...

no-dashi ★★★★★
()
Ответ на: комментарий от UVV

>Хорошо, тогда почему данный пример без проблем идёт на RedHat?

если головой подумать, то будет понятно почему это может идти.

значение ns это мусор, если повезет то этот мусор указывает
на область данных не повезет произойдет segfault.

просто надо выучить C, прежде чем на нем писать вот и все.

fghj ★★★★★
()
Ответ на: комментарий от fghj

> просто надо выучить C, прежде чем на нем писать вот и все.
Дык я и учу!

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.