LINUX.ORG.RU

tcc gnu getline в рот мне ноги

 ,


0

2
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

void read_file ( FILE * file ) {
    size_t  len = 0;
    char *  line = NULL;
    ssize_t bytes_read;
    while ( ( bytes_read = getline ( &line, &len, file ) ) != -1 ) {
        printf ( line );
    }
    free ( line );
}
int main ( void ) {
    FILE *  file = fopen ( "/etc/fstab", "r" );
    read_file ( file );
    fclose ( file );
    return 0;
}

Запускаем

tcc -run test.c
>> # /etc/fstab: static file system information.
>> Segmentation fault
Меняем местами строчки
size_t  len  = 0;
char *  line = NULL;
И все работает как положено. Дэвид блейн, не надо!

ЗЫ баг уже отправил по почте

★★

Последнее исправление: punya (всего исправлений: 3)

УМВР, убунта

$ apt-cache policy tcc
tcc:
  Installed: 0.9.26~git20120104.83d57c0-5
  Candidate: 0.9.26~git20120104.83d57c0-5

olibjerd ★★★★★
()
Последнее исправление: olibjerd (всего исправлений: 1)

Debian 6.0.6 (amd64), tcc 0.9.25:

$ tcc -run test.c 
# /etc/fstab: static file system information.
Segmentation fault

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

что-то я не понимаю что ты написал.

по документации getline сам делает malloc и realloc если ему не хватает места. как раз для этого ты и передаешь ему указатель на буффер. в итоге длина самой длинной строки <= размеру буфера. не должен он падать и в новой версии tcc это исправили

punya ★★
() автор топика
Последнее исправление: punya (всего исправлений: 1)
Ответ на: комментарий от punya

Для полноты картины хотелось бы увидеть файл /etc/fstab.

loki231
()

УМВР

ivan@debian:~/test$ uname -a
Linux debian 2.6.32-5-686 #1 SMP Mon Jan 21 04:01:23 UTC 2013 i686 GNU/Linux
ivan@debian:~/test$ tcc -v
tcc version 0.9.25

solovey ★★
()
Ответ на: комментарий от punya
viper@debian:~$ tcc -run main.c
# /etc/fstab: static file system information.
Segmentation fault
viper@debian:~$ uname -a
Linux debian 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux
viper@debian:~$ tcc -v
tcc version 0.9.25
vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 1)
    while ( ( bytes_read = getline ( &line, &len, file ) ) != -1 ) {
        printf ( line );
    }
    free ( line );

А ты уверен, что realloc в getline при неудаче не сделает тупо free?

А, не: на gcc работает...

// что такое tcc без понятия

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

tcc интерпретирует си. если вместо free поставить printf(«123») то до него не дойдет. первую строчку читает а дальше getline падает. вот такой прикол =)

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

tcc интерпретирует си

А, блин, дошло! tcc — сишный интерпретатор? Ну и извращение… Хотя, ХЗ: может, иной раз для отладки и удобно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

там фиг его знает что падает =) но вот если поставить новую версию tcc из git то все хорошо. а в этой версии магия прям: строчку переставил - работает

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

что такое tcc без понятия

Очень быстрый компилятор си. Есть даже бутлоадер на его основе, который компилирует ядро прямо в память.

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

а звучит

По-моему, ничем принципиально не отличается от

viper@debian

=)

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

что-то я не понимаю что ты написал.

повторяю по буквам - т в о я __ п р о г р а м м а __ п а ш е т __ п а м я т ь

getline выделит кусок памяти только если ему передн NULL иначе пишет в имеющийся. Так вот при втором проходе цикла приходит не нул, а то что было выделено на первом. Если хоть одна строка будет длинее первой - память упахана.

перед тем как строчить багрепорты ищите собственный баги блин.

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