Привет, мои любители пердолинга с C и C++. Я вчера наткнулся на забавный пассаж в MUSL:
$ cat src/misc/syscall.c
#define _BSD_SOURCE
#include <unistd.h>
#include "syscall.h"
#include <stdarg.h>
#undef syscall
long syscall(long n, ...)
{
va_list ap;
syscall_arg_t a,b,c,d,e,f;
va_start(ap, n);
a=va_arg(ap, syscall_arg_t);
b=va_arg(ap, syscall_arg_t);
c=va_arg(ap, syscall_arg_t);
d=va_arg(ap, syscall_arg_t);
e=va_arg(ap, syscall_arg_t);
f=va_arg(ap, syscall_arg_t);
va_end(ap);
return __syscall_ret(__syscall(n,a,b,c,d,e,f));
}
Как вы наверное понимаете, вызовы syscall() сильно различаются по количеству аргументов. Все стандарты C, что я видел, говорят, что вызывать va_arg, если аргумента нет — злостное UB. Поскольку мне лень ковыряться в кишках компиляторов, я решил аппелировать к массовому сознанию LOR — а что GCC и clang вообще делают в таких случаях?