Ошибка сегментации (Core Dumped): ошибка при возврате из функции

У меня есть две функции.

struct logger_message vget_log_msg(enum LogStatus log_status, const char* format, va_list args) {    
    struct logger_message log_msg;
    log_msg.status = log_status;
    log_msg.timestamp = get_current_timestamp();

    memset(log_msg.message_buffer, 0, MESSAGE_SIZE);
    if(format){    
        vsprintf(log_msg.message_buffer, format, args);
    }
    return log_msg;
}

а также

int send_log_message_to_mqueue(mqd_t mqd, enum LogStatus log_status, const char* format, ...) {
    struct logger_message msg;
    va_list argp;
    va_start(argp, format); 
    msg = vget_log_msg(log_status, format, argp);
    va_end(argp);
    int res; 
    res = send_message_to_mqueue(mqd, (char *)&msg, sizeof(msg));
    return res;
}

Итак, я получаю сообщение об ошибке «Сегментационная ошибка (Core dumped)» при возврате из vget_log_msg в строке:

msg = vget_log_msg(log_status, format, argp);

EDIT: Возможно, эта информация может быть полезна

struct logger_message{
    enum LogStatus status;
    time_t timestamp;
    char message_buffer[MESSAGE_SIZE];    
};

Кто-нибудь знает, почему я получаю эту ошибку? как исправить?

0
nl ja de
Да, конечно. При составлении проекта я не получаю никаких предупреждений или эров.
добавлено автор Tural Gurbanov, источник
Возможно ли, что вы vsprintf() уходит с конца буфера сообщений? Если да, рассмотрели ли вы использование vsnprintf() вместо? Так как у вас есть размер буфера, почему бы не использовать его. Надеемся, что ваша инструментальная цепочка и среда исполнения совместимы с C99 или более поздними версиями, поскольку я считаю, что это было тогда, когда оно впервые появилось к нам.
добавлено автор WhozCraig, источник
Используете ли вы -Wall при компиляции? Вы получаете предупреждения?
добавлено автор Dolda2000, источник

2 ответы

Что такое MESSAGE_SIZE? насколько большой это? Можете ли вы проверить, уменьшив его размер, или вместо этого верните, используя указатель вместо всей структуры.

3
добавлено
Это верно. К сожалению, MESSAGE_SIZE был равен 24, что было слишком маленьким. Спасибо.
добавлено автор Tural Gurbanov, источник

Я предполагаю, что вы использовали vget_log_msg без фактического объявления своего прототипа в файле, содержащем send_log_message_to_mqueue . например, не включая заголовочный файл, который определяет vget_log_msg , или, если оба находятся в одном файле, не определяя vget_log_msg до send_log_message_to_mqueue ,

В этом случае компилятор предположил бы, что vget_log_msg возвращает int и не использует правильное соглашение о вызове для функции, возвращающей структуру. Такие структуры возвращаются вызывающим абонентом, распределяющим буфер для возвращенной структуры на своей стороне стека и передающей указатель на этот буфер как неявный параметр вызываемой функции; используя неправильное соглашение о вызове, то это приведет к тому, что неявный указатель будет отсутствовать и, следовательно, ошибочен, а затем возвращающая функция, чтобы записать возвращенную структуру в недопустимое местоположение.

В качестве альтернативы, они могли бы быть использованы для использования различных версий struct logger_message , например, включая различные файлы заголовков, которые объявляют это по-другому.

0
добавлено
Прототип декларируется в заголовочном файле, а заголовочный файл включен. Поэтому предложение не работает.
добавлено автор Tural Gurbanov, источник
Я пытаюсь думать о любом современном компиляторе (за последнее десятилетие или около того), который делает not флаг такого назначения из необъявленной функции (тем самым предполагая возвращаемое значение int ) в качестве ошибки при возврате чего-либо помимо значения, которое может по крайней мере попытаться как удерживать , так и принудительно использовать int для используемого значения l. Пример: без объявления функции код OP приведет к ошибке компиляции с указанием «error: struct logger_message и int ) несовместимые типы." В то время как вы являетесь точкой very , допустимой для допустимых типов из int (особенно указателей), я не уверен, что она действительна здесь.
добавлено автор WhozCraig, источник
Достаточно. Я добавил альтернативное объяснение.
добавлено автор Dolda2000, источник
Нет. Любой достойный компилятор ошибся вам, если вы попробуете присвоить 'int' структуре.
добавлено автор user529758, источник