k001
k001
:...
k001 [userpic]
Вот как бывает... (С) Юрий Антонов

Нашёл багу фичу? в glibc. Update: на всякий случай зафайлил #10818 в sources.redhat.com bugzilla.

[kir@kir ~]$ cat null.c
#include <stdio.h>

int main(void) {
fprintf(stdout, "%s\n", NULL);
printf("%s%s\n", NULL, NULL);
printf("%s\n", NULL);
}
[kir@kir ~]$ gcc -o null null.c
[kir@kir ~]$ ./null
(null)
(null)(null)
Segmentation fault


glibc-2.9-3.x86_64
gcc-4.3.2-7.x86_64

А всё потому, что
(1) кто-то слишком умный оптимизирует printf с агрументами ("%s\n", str) до puts(str);
(2) puts(NULL) вызывает strlen(NULL);
(3) последний почему-то сегфолтится.

Comments

гы.
хттп дточ слеш слеш gcc точка gnu точка org слеш bugzilla слеш show_bug.cgi?id=15685

в #25609 епик баттле Дреппера с гццшниками :)

а где написано что %s может жрать NULL? в c99 не нашёл.
я понимаю что давно так в glibc, но это не переносимо и не безопасно.

Это gcc. -fno-builtin-printf поможет.
www.ciselant.de/projects/gcc_printf/gcc_printf.html

Маркап поломался

спасибо, уже

Этот gcc утомил уже заменять вызовы одних функций другими.
Помнится, в linux-kernel была история с введением в gcc такой оптимизиции:

strcpy(dst, "constant string" + offset)

на

memcpy(dst, "constant string" + offset, sizeof("constant string") - offset)

всё было хорошо, пока в linux не встретился такой вызов strcpy, где offset попадал за пределы "constant string" в динамически формируемую строку.

Чем дело закончилось у них, я не помню. Скорее всего, пропатчили kernel. Убедить в чём-то разработчиков gcc - тухлый номер, проще переспорить священника.

Re: > sizeof("constant string")

Гоню, пожалуй. :-)