[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1010458: linux/sysctl.h: unknown type name 'size_t'



Package: linux-libc-dev
Version: 5.17.3-1
Severity: normal
Tags: upstream
X-Debbugs-Cc: alx.manpages@gmail.com


I was cleaning up the example programs in the man-pages by using
iwyu(1), when I found that <linux/sysctl.h> is using 'size_t'
without including any definition for it.

See the following example program:

	$ cat tmp/src/man2/sysctl.2.d/sysctl.c

	#define _GNU_SOURCE
	#include <linux/sysctl.h>
	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	#include <sys/syscall.h>
	#include <unistd.h>

	int _sysctl(struct __sysctl_args *args );

	#define OSNAMESZ 100

	int
	main(void)
	{
	    struct __sysctl_args args;
	    char osname[OSNAMESZ];
	    size_t osnamelth;
	    int name[] = { CTL_KERN, KERN_OSTYPE };

	    memset(&args, 0, sizeof(args));
	    args.name = name;
	    args.nlen = sizeof(name)/sizeof(name[0]);
	    args.oldval = osname;
	    args.oldlenp = &osnamelth;

	    osnamelth = sizeof(osname);

	    if (syscall(SYS__sysctl, &args) == -1) {
		perror("_sysctl");
		exit(EXIT_FAILURE);
	    }
	    printf("This machine is running %*s\n", (int) osnamelth, osname);
	    exit(EXIT_SUCCESS);
	}

for which I get the following errors:

	$ cc -c -std=gnu17 -Wall -Wextra -Werror -Wno-error=unused-parameter \
	     -Wno-error=sign-compare -Wno-error=format \
	     -o tmp/src/man2/sysctl.2.d/sysctl.o \
	     tmp/src/man2/sysctl.2.d/sysctl.c;
	In file included from tmp/src/man2/sysctl.2.d/sysctl.c:3:
	/usr/include/linux/sysctl.h:39:9: error: unknown type name 'size_t'
	   39 |         size_t *oldlenp;
	      |         ^~~~~~
	/usr/include/linux/sysctl.h:41:9: error: unknown type name 'size_t'
	   41 |         size_t newlen;
	      |         ^~~~~~
	tmp/src/man2/sysctl.2.d/sysctl.c: In function 'main':
	tmp/src/man2/sysctl.2.d/sysctl.c:26:18: error: assignment to 'int *' from incompatible pointer type 'size_t *' {aka 'long unsigned int *'} [-Werror=incompatible-pointer-types]
	   26 |     args.oldlenp = &osnamelth;
	      |                  ^
	cc1: all warnings being treated as errors


It seems that it's supposed to know some types, but for some reason
'size_t' is not defined by the included headers:

	$ grep include </usr/include/linux/sysctl.h 
	#include <linux/const.h>
	#include <linux/types.h>


Cheers,

Alex



-- System Information:
Debian Release: bookworm/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 5.16.0-5-amd64 (SMP w/4 CPU threads; PREEMPT)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=C, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

-- no debconf information


Reply to: