C++ sprintf未定义的行为
我似乎找不到这方面的信息:在C++ sprintf未定义的行为,c++,c,C++,C,我似乎找不到这方面的信息:在sprintf中使用错误的格式说明符是否会导致printf中出现UB-like 我也会问,这里有没有以下UB unsigned int x = 5; printf("%d",x); unsigned int x = 5; printf("%d",x); 或者这个: unsigned char x = 5; printf("%d",x); unsigned char x = 5; printf("%d",x); 在spri
sprintf
中使用错误的格式说明符是否会导致printf
中出现UB-like
我也会问,这里有没有以下UB
unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
或者这个:
unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);
在sprintf
中使用错误的格式说明符是否会导致printf
中出现UB-like
对。所有*printf
说明符的定义都相同(实际上在fprintf
部分)
我也会问,这里有没有以下UB
unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
从技术上讲,这是一个错误<代码>%d需要一个int
参数,并且“如果任何参数不是相应转换规范的正确类型,则行为是未定义的。”(WG14 N1570,7.21.6.1/p9;我认为C11与C99相比没有任何变化)unsigned int
不是int
。在实践中,你可能会侥幸逃脱
或者这个:
unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);
当且仅当unsigned char
通过整数提升提升为int
时(通常情况下),这不是UB
在sprintf
中使用错误的格式说明符是否会导致printf
中出现UB-like
对。所有*printf
说明符的定义都相同(实际上在fprintf
部分)
我也会问,这里有没有以下UB
unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
从技术上讲,这是一个错误<代码>%d需要一个int
参数,并且“如果任何参数不是相应转换规范的正确类型,则行为是未定义的。”(WG14 N1570,7.21.6.1/p9;我认为C11与C99相比没有任何变化)unsigned int
不是int
。在实践中,你可能会侥幸逃脱
或者这个:
unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);
这不是UB,当且仅当
无符号字符
通过整数提升提升为int
,通常是这样。请一次提一个问题。在sprintf()
中使用错误的格式说明符会导致UB,就像在printf()
中一样,对于printf
函数系列的所有其他成员也是如此。请每次提问一个问题。在sprintf()
中使用错误的格式说明符会导致UB,就像在printf()
中一样,printf
函数族的所有其他成员也是如此。unsigned char
被提升为int
@KerrekSB“,这通常是这样的情况,“@T.C.:这让人困惑,似乎你提供了与Kerrek SB不同的答案above@dmcr_code:我删除了我的答案;T.C.对必须精确匹配的类型有正确的引用。此外,您可以静态测试无符号字符
是如何提升的(例如,通过检查限制)。@dmcr\u code:只是为了记录我答案的要点:当您有一个带有变量参数(…
)的函数,并且您使用任何类型的int
调用它时,然后,您可以使用va_arg
从参数列表中读取任何其他类型的int
,它不是UB。(与C中没有原型的函数类似),但是printf
的限制性更大。unsigned char
被提升为int
@KerrekSB”这一点并不一定正确。@T.C.:这让人困惑,似乎你提供的答案与Kerrek SB不同above@dmcr_code:我删除了我的答案;T.C.对必须精确匹配的类型有正确的引用。此外,您可以静态测试无符号字符
是如何提升的(例如,通过检查限制)。@dmcr\u code:只是为了记录我答案的要点:当您有一个带有变量参数(…
)的函数,并且您使用任何类型的int
调用它时,然后,您可以使用va_arg
从参数列表中读取任何其他类型的int
,它不是UB。(与C中没有原型的函数类似),但是printf
的限制性更大。