int32 len = va_args (va, int32) дает очень большое значение в x86_64 GNU / Linux - PullRequest
0 голосов
/ 19 июля 2011
void AppBuf(message_id_type msgID, int32 numPairs, va_list va)

{
int32 len = va_args(va, int32);
....
}

Приведенный выше фрагмент кода прекрасно работает на Windows (32- и 64-битной), а также на 32-битном компиляторе Linux.Значение 'len' составляет 10 для всего вышеперечисленного.

Но в linux 64 bit (x86_64 GNU / Linux) я получаю очень большое значение для len (50462976), которое портит остальную часть кода и приводит к сбою.

Я читал, что что-то изменилось в 64-битных компиляторах Linux по отношению к va_lists, но я не смог понять это изменение и поэтому не смог исправить свою проблему.

МожетКто-нибудь, пожалуйста, помогите мне с этой проблемой?

Спасибо.

Солнечный

Хорошо, вот подробности всего кода, приводящего к этому вопросу: Может кто-нибудь помочь с этим?Заранее спасибо.

Стек вызовов:

AppendBuffers (int msgID = 0x00000001, int numPairs = 0x00000001, char * va = 0x0007fcb0) {ПРИМЕЧАНИЕ: этопроблема возникает, как указано выше (длина = очень большая)}

LogMsg (int msgID = 0x00000001, int numPairs = 0x00000001, char * arguments = 0x0007fcb0)

LogMsgBuffersV(int msgID = 0x00000001, int numPairs = 0x00000001, char * arguments = 0x0007fcb0)

LogMsgBuffersV (int msgID = 0x00000001, int numPairs = 0x00000001, char * аргументы = 0x0007fMBS 0 * 10 * 10)msgID = 0x00000001, int numPairs = 0x00000001, ...)

Фактический код:

void LogMsgBuffers(message_id_type msgID, int32 numPairs, ...)
{

    va_list arguments;
    va_start(arguments, numPairs);

    filter_status_type msgStatus = FilterMsg(msgID);

    if (msgStatus == FILTER_ACCEPT)
    {
        LogMsg(msgID, numPairs, arguments);
    }

    if ((_parentLogger != NULL) && (_oAppenderInheritance))
    {
        //Pass the msg to the parent
        _parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);
    }

    return;
}

void LogMsgBuffersV(message_id_type msgID, int32 numPairs, va_list arguments)
{

    filter_status_type msgStatus = FilterMsg(msgID);

    if (msgStatus == FILTER_ACCEPT)
    {
        //Log msg to the current node
        LogMsg(msgID, numPairs, arguments);
    }

    if ((_parentLogger != NULL) && (_oAppenderInheritance))
    {
        //Pass the msg to the parent
        _parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);

    }
    return;
}

void LogMsgBuffersV(message_id_type msgID, int32 numPairs, va_list arguments)
{
    filter_status_type msgStatus = FilterMsg(msgID);

    if (msgStatus == FILTER_ACCEPT)
    {
        //Log msg to the current node
        LogMsg(msgID, numPairs, arguments);
    }

    if ((_parentLogger != NULL) && (_oAppenderInheritance))
    {
        //Pass the msg to the parent
        _parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);

    }
    return;
}

void LogMsg(message_id_type msgID, int32 numPairs, va_list arguments)
{
    uint32 i;

    for (i = 0; i < _pOwnAppenderVec.size(); i++)
    {
        LoggerAppender *appender = _pOwnAppenderVec[i];
        appender->AppendBuffers(msgID, numPairs, arguments);
    }
    return;
}

void AppendBuffers(message_id_type msgID, int32 numPairs, va_list va)
        {

            for (int32 i = 0; i < numPairs; i++)
            {
                int32 length = va_arg(va, int32);
                uint8* buffer = va_arg(va, uint8*);

                int32 jj;
                for (jj = 10; jj < length; jj += 10)
                {
                    AppendStringA(0, "  %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]);
                    buffer += 10;
                }

                uint8 remainderbuf[10];
                uint32 remainder = length - (jj - 10);
                if (remainder > 0 && remainder <= 10)
                {
                    oscl_memcpy(remainderbuf, buffer, remainder);
                    oscl_memset(remainderbuf + remainder, 0, 10 - remainder);
                    buffer = remainderbuf;
                    AppendStringA(0, "  %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]);
                }
            }
            va_end(va);
        }

1 Ответ

5 голосов
/ 19 июля 2011

AFACIT, va_args не является стандартной функцией.На самом деле, Google рассматривает этот вопрос как один из своих лучших ответов, помимо __VA_ARGS__ макросов.

На самом деле нет никакого стандартного способа определить, сколько va_arg аргументов содержится в данном va_list на странице GCC также не указан какой-либо метод.

...