void AppBuf(message_id_type msgID, int32 numPairs, va_list va)
{
int32 len = va_args(va, int32);
....
}
上面一段代码非常大的值上运行的窗口(32位和64位)完全正常,并且还在Linux 32位编译器。 'len'的值为10以上所有。但是在Linux 64位(x86_64 GNU/Linux)上,我得到了一个非常大的值len
(50462976
),它弄乱了代码的其余部分,并在崩溃中结束了ups。INT32 LEN = va_args(VA,INT32)给出在x86_64 GNU/Linux的
我读过linux 64位编译器相对于va_lists
的一些变化,但我无法理解这个变化,所以我无法解决我的问题。
有人可以帮我解决这个问题吗?
谢谢。
阳光
好吧,这里是整个代码领先高达这点的细节: 可能有人请帮助这个?提前致谢。
调用堆栈:
AppendBuffers(INT MSGID = 00000001,INT numPairs = 00000001,字符* VA = 0x0007fcb0){注意:这是在上述(长度=非常大如提到的问题是发生)}
LogMsg(INT MSGID = 00000001,INT numPairs = 00000001,字符*参数= 0x0007fcb0)
LogMsgBuffersV(INT MSGID = 00000001,INT numPairs = 00000001,字符*参数= 0x0007fcb0)
LogMsgBuffersV(INT MSGID = 00000001,INT numPairs = 00000001,字符*参数= 0x0007fcb0)
LogMsgBuffers(INT MSGID = 00000001,INT numPairs = 00000001,...)
实际代码:
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);
}
你怎么称呼上面的代码? – ybungalobill
可能是调用代码在该特定配置上错误地填充了列表?例如,它可能会传递非POD类型。 – sharptooth
请勿使用'va_list'。如果您需要可变参数,请使用可变参数模板,生成的重载或其他类型安全的方法。 –