To support my understanding (and probably to reasonify the understanding in first place), let me add my two cents.
一会儿,让我们看看脚注 282,如引用中所述。它说,
见“未来图书馆方向”(7.31.11)。
并在 §7.31.11
小写字母可以添加到 和 中的转换说明符和长度
fprintf
修饰符fscanf
。其他字符可以在扩展中使用。
其中没有提到 CS 与其论点(如果有的话)之间的关系。因此,CS 的“有效性”不依赖于提供的参数。
现在,也就是说,还有几个指针
第 1 点 :: 请注意引用中提到的短语“转换规范”,而不是 转换说明符。根据第 7.21.6.1/P4 章,
每个转换规范都由字符引入%
。之后%
,依次出现以下内容:
零个或多个标志 [...]
可选的最小字段宽度 [...]
可选精度 [...]
可选的长度修饰符 [...]
转换说明符字符 [...]
我们有明确的清单,列出所有提到的元素
- P5,场宽和精度
- P6,旗帜
- P7,长度修饰符
- P8,转换说明符
因此,与提供的参数没有(或应该)没有关系来识别转换规范的“有效性”。
为了补充这种理解,借用Ajay Brahmakshatriya 的评论
“我认为这里的操作词是“对应”。第一句话说如果字符串中存在一个无效的说明符。如果没有,那么每个说明符与其对应的参数匹配。然后第二个语句说关于类型匹配.....我认为第二个例子不属于第一类,因为没有使用“对应””
第 2 点 ::另一方面,规范对于 CS 和提供的相应参数类型之间的“不匹配”非常明确和清楚。所以,这是完全不同的情况。
现在,例如,如果两种情况结合在一起,很难判断是哪种情况导致了 UB,但肯定是 UB,原因不止一个。
例子:
printf("%D", str);
跟随问题。