Это похоже на ошибку в clang, связанную со списками аргументов переменных с нулевым символом в конце.
Ожидаемое поведение - va_arg () вернет 0 на первой итерации, поскольку аргумент, следующий за псевдонимом, равен 0.
Полный код ниже. В main () удаление "void * map = 0;" или вызов foo () устраняет ошибку.
#include <stdio.h>
#include <stdarg.h>
/*
clang --version:
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
*/
void *foo(char *a, char *b, char *c, ...) {
return 0;
}
void *bar(char *a, char *b, char *c, char *d, char *e, char *f, char *alias, ...) {
char *arg;
va_list ap;
va_start(ap, alias);
printf("alias = %s\n", alias);
while((arg = va_arg(ap, char *))) {
printf("arg = %p\n", arg);
printf("BUG!\n");
return 0;
}
va_end(ap);
printf("NO BUG\n");
return 0;
}
int main() {
void *map = 0; // removing this statement hides bug
foo(0, 0, 0, 0);// removing this statement hides bug
bar("a", "b", "c", "d", "e", "f", "b", 0);
}
Вывод:
alias = b
arg = 0x100000000
BUG!