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, во второй библиотеке!
Тестировал со всеми битовыми операциями, результат аналогичный!
Выши мнения!

★★★★★

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

А просто взять и выучить "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 ★★★★★ ()

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

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

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

no-dashi ★★★★★ ()

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

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

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

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

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

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