了解一些导致崩溃的代码。它很古老(从90年代或更早),但是最近开始使用更新的编译器来体现。其中一些代码将sprintf与格式说明符结合使用,例如:
sprintf(buf, "here is some stuff %ld pieces of %ld samples from %Fs", someIntValue, someOtherIntValue, someCharStarPointer);
第三个参数是导致崩溃的原因...根据文档,%F用于浮点数,它将仅在浮点数之后打印s。
我的问题是,%Fs是否曾经是旧版Microsoft编译器的有效格式?就像当存在混合内存模型时,F可能已经表明它是一个遥远的指针了吗? IDK,抓着稻草。显然,我们将修复%F使其仅使用%s,但我想知道旧计时器是否还记得这样的东西?
答案 0 :(得分:1)
STATIC void do_printf(CONST BYTE FAR * fmt, va_list arg)
{
...
case 's':
p = va_arg(arg, char *);
break;
case 'F':
fmt++;
/* we assume %Fs here */
case 'S':
p = va_arg(arg, char FAR *);
break;
因此,将%Fs
用于FAR指针是正确的。