我注意到一些潛在的問題va_arg
宏,用於從可變參數函數接收未命名的參數。考慮以下,簡化的示例:當va_arg收到指針參數時,const不匹配會調用UB嗎?
#include <stdio.h>
#include <stdarg.h>
void foo(int n, ...)
{
va_list ap;
const char *s;
va_start(ap, n);
for (s = va_arg(ap, const char *); *s != '\0'; s++)
putchar(*s);
va_end(ap);
}
int main(void)
{
char str[] = "xyz";
foo(1, str);
return 0;
}
爲va_arg
宏狀態的引用,(重點煤礦):
如果當在AP沒有更多的參數的va_arg被調用,或者如果 類型的在AP(促銷後)下一個參數不兼容 與T,該行爲是未定義(...)
我ü理解是const char *
和char *
類型是不是兼容。當char
數組傳遞到foo
,在char
指針的形式(即默認參數提升不變),則表達式,即假定常量限定指針:
s = va_arg(ap, const char *)
可以調用「技術」 UB。當arr
被定義爲const
數組,並且該參數被接收爲char *
以及其他類型例如int *
和const int *
。
在這種情況下,不兼容是尺寸問題,而不是'const'問題。當大小不正確時,您將移動va_args掃描並嚴重崩潰。在64位機器上傳遞0而不是'NULL'時曾經有過。 –