LINUX.ORG.RU

История изменений

Исправление PPP328, (текущая версия) :

Как я уже сказал, вы можете вообще убрать это вызов, если сделаете три вызова вместо _log_file_write:

// Пишет в file тип сообщения и время
static void _log_file_wtime(FILE *file, enum log_level level); 
// Пишет в file переданные исходно данные
static void _log_file_wdata(FILE *file, const char *fmt, va_list args);
// Пишет в file \n
static void _log_file_wlend(FILE *file);

Так у меня на этапе malloc возникает

__attribute__((format(printf, 1, 2)))
char *my_asprintf(const char *fmt, ...) {
    va_list list;
    va_start(list, fmt);
    char *str = my_vasprintf(fmt, list);
    va_end(list);
    return str;
}

char *my_vasprintf(const char *fmt, va_list args) {
    va_list copy;
    va_copy(copy, args);
    ssize_t size = vsnprintf(NULL, 0, fmt, copy);
    va_end(copy);

    char *str = malloc(size + 1);
    // Алсо неплохо было бы проверить malloc
    vsprintf(str, fmt, args);
    return str;
}

Исходная версия PPP328, :

Как я уже сказал, вы можете вообще убрать это вызов, если сделаете три вызова вместо _log_file_write:

// Пишет в file тип сообщения и время
static void _log_file_wtime(FILE *file, enum log_level level); 
// Пишет в file переданные исходно данные
static void _log_file_wdata(FILE *file, const char *fmt, va_list args);
// Пишет в file \n
static void _log_file_wlend(FILE *file);

Так у меня на этапе malloc возникает

__attribute__((format(printf, 1, 2)))
char *my_asprintf(const char *fmt, ...) {
    va_list list;
    va_start(list, fmt);
    char *str = my_vasprintf(fmt, list);
    va_end(list);
    return str;
}

char *my_vasprintf(const char *fmt, va_list args) {
    va_list copy;
    va_copy(copy, args);
    size_t size = vsnprintf(NULL, 0, fmt, copy);
    va_end(copy);

    char *str = malloc(size + 1);
    // Алсо неплохо было бы проверить malloc
    vsprintf(str, fmt, args);
    return str;
}