LINUX.ORG.RU
ФорумTalks

Undefined behavior в MUSL

 , ,


1

3

Привет, мои любители пердолинга с 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 вообще делают в таких случаях?

Ответ на: комментарий от vodz

Нет, дядя, идите со своими детьми так разговаривать.

Пруфов не будет? Ну вот, один клоун слился :(

kirk_johnson ★☆
() автор топика

Перцы из musl cказали, что в курсе, но не то чтобы много могут сделать. В целом, ожидаемо.

kirk_johnson ★☆
() автор топика
Ответ на: комментарий от utf8nowhere

В каком стандарте описан syscall? В драфте 11-го не нашёл.

Я думал, что в POSIX, но ошибся, его там тоже нет. Он просто примерно одинаково выглядит в linux, openbsd и freebsd.

kirk_johnson ★☆
() автор топика
Последнее исправление: kirk_johnson (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.