diff options
| -rw-r--r-- | pkg/ast/ast.go | 2 | ||||
| -rw-r--r-- | pkg/compiler/check.go | 38 | ||||
| -rw-r--r-- | pkg/compiler/consts.go | 13 | ||||
| -rw-r--r-- | pkg/declextract/declextract.go | 15 | ||||
| -rw-r--r-- | sys/linux/auto.txt | 151 | ||||
| -rw-r--r-- | sys/linux/auto.txt.const | 48 | ||||
| -rw-r--r-- | tools/syz-declextract/declextract.go | 21 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/file_operations.c | 14 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/file_operations.c.json | 41 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/file_operations.c.txt | 1 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/functions.c.txt | 4 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/include/uapi/unused_ioctl.h | 6 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/io_uring.c.txt | 5 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/netlink.c.txt | 3 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/syscall.c.txt | 4 | ||||
| -rw-r--r-- | tools/syz-declextract/testdata/types.c.txt | 4 |
16 files changed, 138 insertions, 232 deletions
diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go index bd2d97c23..7c1db28ea 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -71,7 +71,7 @@ type Include struct { } func (n *Include) Info() (Pos, string, string) { - return n.Pos, tok2str[tokInclude], "" + return n.Pos, tok2str[tokInclude], n.File.Value } type Incdir struct { diff --git a/pkg/compiler/check.go b/pkg/compiler/check.go index 92e3e5e03..fbf84857d 100644 --- a/pkg/compiler/check.go +++ b/pkg/compiler/check.go @@ -676,6 +676,44 @@ func CollectUnused(desc *ast.Description, target *targets.Target, eh ast.ErrorHa return nodes, nil } +// CollectUnusedConsts returns unused defines/includes. This is used only for auto-generated descriptions. +func CollectUnusedConsts(desc *ast.Description, target *targets.Target, includeUse map[string]string, + eh ast.ErrorHandler) ([]ast.Node, error) { + comp := createCompiler(desc, target, eh) + comp.typecheck() + if comp.errors > 0 { + return nil, errors.New("typecheck failed") + } + + var unused []ast.Node + for file, info := range comp.extractConsts() { + if !comp.fileMeta(ast.Pos{File: file}).Automatic { + continue + } + usedDefines := make(map[string]bool) + usedIncludes := make(map[string]bool) + for _, c := range info.Consts { + if c.Used { + usedDefines[c.Name] = true + usedIncludes[includeUse[c.Name]] = true + } + } + for _, decl := range comp.desc.Nodes { + switch n := decl.(type) { + case *ast.Define: + if n.Pos.File == file && !usedDefines[n.Name.Name] { + unused = append(unused, n) + } + case *ast.Include: + if n.Pos.File == file && !usedIncludes[n.File.Value] { + unused = append(unused, n) + } + } + } + } + return unused, nil +} + func (comp *compiler) collectUnused() []ast.Node { var unused []ast.Node diff --git a/pkg/compiler/consts.go b/pkg/compiler/consts.go index bcbd40e52..6ce3f81f1 100644 --- a/pkg/compiler/consts.go +++ b/pkg/compiler/consts.go @@ -23,6 +23,7 @@ type ConstInfo struct { type Const struct { Name string Pos ast.Pos + Used bool // otherwise only defined } func ExtractConsts(desc *ast.Description, target *targets.Target, eh ast.ErrorHandler) map[string]*ConstInfo { @@ -86,7 +87,7 @@ func (comp *compiler) extractConsts() map[string]*ConstInfo { comp.error(pos, "redefining builtin const %v", name) } info.defines[name] = v - comp.addConst(ctx, pos, name) + ctx.addConst(pos, name, false) case *ast.Call: if comp.target.HasCallNumber(n.CallName) { comp.addConst(ctx, pos, comp.target.SyscallPrefix+n.CallName) @@ -178,10 +179,10 @@ func (comp *compiler) addConst(ctx *constContext, pos ast.Pos, name string) { if _, isFlag := comp.intFlags[name]; isFlag { return } - ctx.addConst(pos, name) + ctx.addConst(pos, name, true) for _, instantions := range ctx.instantionStack { for _, pos1 := range instantions { - ctx.addConst(pos1, name) + ctx.addConst(pos1, name, true) } } } @@ -193,11 +194,15 @@ type constInfo struct { incdirArray []string } -func (ctx *constContext) addConst(pos ast.Pos, name string) { +func (ctx *constContext) addConst(pos ast.Pos, name string, used bool) { info := ctx.getConstInfo(pos) + if c := info.consts[name]; c != nil && c.Used { + used = true + } info.consts[name] = &Const{ Pos: pos, Name: name, + Used: used, } } diff --git a/pkg/declextract/declextract.go b/pkg/declextract/declextract.go index fdf06b373..9df449b63 100644 --- a/pkg/declextract/declextract.go +++ b/pkg/declextract/declextract.go @@ -16,7 +16,7 @@ import ( ) func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string, trace io.Writer) ( - []byte, []*Interface, error) { + []byte, []*Interface, map[string]string, error) { ctx := &context{ Output: out, probe: probe, @@ -29,7 +29,7 @@ func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string, } ctx.processFunctions() ctx.processTypingFacts() - ctx.processConsts() + includeUse := ctx.processConsts() ctx.processEnums() ctx.processStructs() ctx.processSyscalls() @@ -37,7 +37,7 @@ func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string, ctx.serialize() ctx.finishInterfaces() - return ctx.descriptions.Bytes(), ctx.interfaces, errors.Join(ctx.errs...) + return ctx.descriptions.Bytes(), ctx.interfaces, includeUse, errors.Join(ctx.errs...) } type context struct { @@ -75,7 +75,7 @@ func (ctx *context) trace(msg string, args ...any) { } } -func (ctx *context) processConsts() { +func (ctx *context) processConsts() map[string]string { replaces := map[string]string{ // Arches may use some includes from asm-generic and some from arch/arm. // If the arch used for extract used asm-generic for a header, @@ -85,6 +85,7 @@ func (ctx *context) processConsts() { "include/uapi/asm-generic/sockios.h": "asm/sockios.h", } defineDedup := make(map[string]bool) + includeUse := make(map[string]string) for _, ci := range ctx.Consts { if strings.Contains(ci.Filename, "/uapi/") && !strings.Contains(ci.Filename, "arch/x86/") && strings.HasSuffix(ci.Filename, ".h") { @@ -93,6 +94,7 @@ func (ctx *context) processConsts() { filename = replace } ctx.includes = append(ctx.includes, filename) + includeUse[ci.Name] = filename continue } // Remove duplicate defines (even with different values). Unfortunately we get few of these. @@ -118,6 +120,11 @@ func (ctx *context) processConsts() { "linux/types.h", "net/netlink.h", }, ctx.includes...) + // Also pretend they are used. + includeUse["__NR_read"] = "vdso/bits.h" + includeUse["__NR_write"] = "linux/types.h" + includeUse["__NR_close"] = "net/netlink.h" + return includeUse } func (ctx *context) processEnums() { diff --git a/sys/linux/auto.txt b/sys/linux/auto.txt index f2e97b77d..2e5f8bc3e 100644 --- a/sys/linux/auto.txt +++ b/sys/linux/auto.txt @@ -12,166 +12,65 @@ type auto_union[INFERRED, RAW] [ include <vdso/bits.h> include <linux/types.h> include <net/netlink.h> -include <arch/x86/include/uapi/asm/msr.h> -include <arch/x86/include/uapi/asm/sgx.h> include <asm/ioctls.h> -include <asm/sockios.h> include <include/uapi/asm-generic/termbits-common.h> include <include/uapi/linux/android/binderfs.h> include <include/uapi/linux/batman_adv.h> include <include/uapi/linux/btrfs.h> -include <include/uapi/linux/caif/if_caif.h> -include <include/uapi/linux/can/gw.h> -include <include/uapi/linux/can/netlink.h> -include <include/uapi/linux/can/vxcan.h> -include <include/uapi/linux/cdrom.h> include <include/uapi/linux/cec.h> include <include/uapi/linux/cgroupstats.h> include <include/uapi/linux/cifs/cifs_netlink.h> include <include/uapi/linux/comedi.h> -include <include/uapi/linux/counter.h> -include <include/uapi/linux/cryptouser.h> -include <include/uapi/linux/dcbnl.h> -include <include/uapi/linux/devlink.h> -include <include/uapi/linux/dma-buf.h> include <include/uapi/linux/dma-heap.h> include <include/uapi/linux/ethtool_netlink.h> -include <include/uapi/linux/eventpoll.h> -include <include/uapi/linux/exfat.h> -include <include/uapi/linux/fib_rules.h> -include <include/uapi/linux/fou.h> include <include/uapi/linux/fs.h> include <include/uapi/linux/fuse.h> include <include/uapi/linux/genetlink.h> include <include/uapi/linux/gtp.h> include <include/uapi/linux/handshake.h> -include <include/uapi/linux/hiddev.h> -include <include/uapi/linux/hidraw.h> include <include/uapi/linux/hsr_netlink.h> include <include/uapi/linux/i2c-dev.h> -include <include/uapi/linux/if_addr.h> -include <include/uapi/linux/if_addrlabel.h> -include <include/uapi/linux/if_bridge.h> -include <include/uapi/linux/if_link.h> include <include/uapi/linux/if_macsec.h> -include <include/uapi/linux/if_team.h> include <include/uapi/linux/if_tun.h> -include <include/uapi/linux/if_tunnel.h> -include <include/uapi/linux/iio/buffer.h> include <include/uapi/linux/ila.h> -include <include/uapi/linux/inotify.h> -include <include/uapi/linux/io_uring.h> include <include/uapi/linux/ioam6_genl.h> include <include/uapi/linux/ip_vs.h> -include <include/uapi/linux/joystick.h> -include <include/uapi/linux/kcov.h> include <include/uapi/linux/kvm.h> include <include/uapi/linux/l2tp.h> include <include/uapi/linux/landlock.h> include <include/uapi/linux/loop.h> -include <include/uapi/linux/lp.h> -include <include/uapi/linux/lwtunnel.h> -include <include/uapi/linux/media.h> -include <include/uapi/linux/mei.h> -include <include/uapi/linux/mpls_iptunnel.h> -include <include/uapi/linux/mptcp_pm.h> -include <include/uapi/linux/msdos_fs.h> include <include/uapi/linux/nbd-netlink.h> include <include/uapi/linux/ncsi.h> -include <include/uapi/linux/neighbour.h> include <include/uapi/linux/net_dropmon.h> -include <include/uapi/linux/net_namespace.h> include <include/uapi/linux/net_shaper.h> -include <include/uapi/linux/netconf.h> include <include/uapi/linux/netdev.h> -include <include/uapi/linux/netfilter/ipset/ip_set.h> -include <include/uapi/linux/netfilter/nf_tables.h> -include <include/uapi/linux/netfilter/nf_tables_compat.h> -include <include/uapi/linux/netfilter/nfnetlink.h> -include <include/uapi/linux/netfilter/nfnetlink_acct.h> -include <include/uapi/linux/netfilter/nfnetlink_conntrack.h> -include <include/uapi/linux/netfilter/nfnetlink_cthelper.h> -include <include/uapi/linux/netfilter/nfnetlink_cttimeout.h> -include <include/uapi/linux/netfilter/nfnetlink_log.h> -include <include/uapi/linux/netfilter/nfnetlink_osf.h> -include <include/uapi/linux/netfilter/nfnetlink_queue.h> -include <include/uapi/linux/nexthop.h> include <include/uapi/linux/nfc.h> include <include/uapi/linux/nfsd_netlink.h> include <include/uapi/linux/nl80211.h> include <include/uapi/linux/nsfs.h> include <include/uapi/linux/nvram.h> include <include/uapi/linux/openvswitch.h> -include <include/uapi/linux/pidfd.h> -include <include/uapi/linux/pkt_cls.h> -include <include/uapi/linux/pkt_sched.h> include <include/uapi/linux/ppp-ioctl.h> include <include/uapi/linux/ppp_defs.h> -include <include/uapi/linux/pps.h> include <include/uapi/linux/psample.h> include <include/uapi/linux/random.h> include <include/uapi/linux/rfkill.h> -include <include/uapi/linux/rpl_iptunnel.h> include <include/uapi/linux/rtc.h> -include <include/uapi/linux/rtnetlink.h> -include <include/uapi/linux/seccomp.h> include <include/uapi/linux/seg6_genl.h> -include <include/uapi/linux/seg6_iptunnel.h> -include <include/uapi/linux/seg6_local.h> include <include/uapi/linux/smc.h> include <include/uapi/linux/sockios.h> include <include/uapi/linux/soundcard.h> include <include/uapi/linux/suspend_ioctls.h> -include <include/uapi/linux/sync_file.h> include <include/uapi/linux/taskstats.h> -include <include/uapi/linux/tc_act/tc_bpf.h> -include <include/uapi/linux/tc_act/tc_connmark.h> -include <include/uapi/linux/tc_act/tc_csum.h> -include <include/uapi/linux/tc_act/tc_ct.h> -include <include/uapi/linux/tc_act/tc_ctinfo.h> -include <include/uapi/linux/tc_act/tc_defact.h> -include <include/uapi/linux/tc_act/tc_gact.h> -include <include/uapi/linux/tc_act/tc_gate.h> -include <include/uapi/linux/tc_act/tc_ife.h> -include <include/uapi/linux/tc_act/tc_mirred.h> -include <include/uapi/linux/tc_act/tc_mpls.h> -include <include/uapi/linux/tc_act/tc_nat.h> -include <include/uapi/linux/tc_act/tc_pedit.h> -include <include/uapi/linux/tc_act/tc_sample.h> -include <include/uapi/linux/tc_act/tc_skbedit.h> -include <include/uapi/linux/tc_act/tc_skbmod.h> -include <include/uapi/linux/tc_act/tc_tunnel_key.h> -include <include/uapi/linux/tc_act/tc_vlan.h> -include <include/uapi/linux/tc_ematch/tc_em_ipt.h> -include <include/uapi/linux/tc_ematch/tc_em_meta.h> include <include/uapi/linux/tcp_metrics.h> -include <include/uapi/linux/tee.h> include <include/uapi/linux/thermal.h> -include <include/uapi/linux/timerfd.h> include <include/uapi/linux/tipc_netlink.h> -include <include/uapi/linux/udf_fs_i.h> include <include/uapi/linux/udmabuf.h> -include <include/uapi/linux/usb/cdc-wdm.h> -include <include/uapi/linux/usb/functionfs.h> -include <include/uapi/linux/usb/g_hid.h> -include <include/uapi/linux/usb/g_printer.h> -include <include/uapi/linux/usb/gadgetfs.h> include <include/uapi/linux/usb/raw_gadget.h> -include <include/uapi/linux/usb/tmc.h> -include <include/uapi/linux/userfaultfd.h> include <include/uapi/linux/vdpa.h> -include <include/uapi/linux/vduse.h> -include <include/uapi/linux/veth.h> -include <include/uapi/linux/vfio.h> include <include/uapi/linux/vhost.h> -include <include/uapi/linux/watch_queue.h> -include <include/uapi/linux/watchdog.h> include <include/uapi/linux/wireguard.h> -include <include/uapi/linux/wwan.h> -include <include/uapi/linux/xfrm.h> include <include/uapi/mtd/ubi-user.h> -include <include/uapi/rdma/rdma_netlink.h> -include <include/uapi/rdma/rdma_user_ioctl.h> include <include/uapi/sound/asound.h> NPmode$auto = NPMODE_PASS, NPMODE_DROP, NPMODE_ERROR, NPMODE_QUEUE @@ -6797,16 +6696,7 @@ define IEEE802154_SET_MACPARAMS 35 define IEEE802154_START_REQ 13 define IMADDTIMER 2147764544 define IMDELTIMER 2147764545 -define IOCNR_GET_BUS_ADDRESS 5 -define IOCNR_GET_DEVICE_ID 1 -define IOCNR_GET_PROTOCOLS 2 -define IOCNR_GET_VID_PID 6 -define IOCNR_HP_SET_CHANNEL 4 -define IOCNR_SET_PROTOCOL 3 -define IOCNR_SOFT_RESET 7 define IOCTL_CONFIG_SYS_RESOURCE_PARAMETERS 1074356480 -define IOCTL_GET_DRV_VERSION 2 -define IOCTL_GET_HARD_VERSION 1 define IOCTL_GET_NUM_DEVICES 1074028804 define IOCTL_START_ACCEL_DEV 1074356482 define IOCTL_STATUS_ACCEL_DEV 1074028803 @@ -6828,9 +6718,6 @@ define IOCTL_VMCI_QUEUEPAIR_SETVA 1956 define IOCTL_VMCI_SET_NOTIFY 1995 define IOCTL_VMCI_VERSION 1951 define IOCTL_VMCI_VERSION2 1959 -define IOW_GETINFO 2150154243 -define IOW_READ 1074315266 -define IOW_WRITE 1074315265 define MAC802154_HWSIM_ATTR_RADIO_EDGE 2 define MAC802154_HWSIM_ATTR_RADIO_EDGES 3 define MAC802154_HWSIM_ATTR_RADIO_ID 1 @@ -6840,8 +6727,6 @@ define MAC802154_HWSIM_CMD_GET_RADIO 1 define MAC802154_HWSIM_CMD_NEW_EDGE 8 define MAC802154_HWSIM_CMD_NEW_RADIO 3 define MAC802154_HWSIM_CMD_SET_EDGE 6 -define MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID 1 -define MAC802154_HWSIM_EDGE_ATTR_LQI 2 define MON_IOCG_STATS 2148045315 define MON_IOCH_MFLUSH 37384 define MON_IOCQ_RING_SIZE 37381 @@ -6875,8 +6760,6 @@ define NL802154_ATTR_PID 28 define NL802154_ATTR_SCAN_CHANNELS 33 define NL802154_ATTR_SCAN_DONE_REASON 37 define NL802154_ATTR_SCAN_DURATION 36 -define NL802154_ATTR_SCAN_MEAN_PRF 35 -define NL802154_ATTR_SCAN_PREAMBLE_CODES 34 define NL802154_ATTR_SCAN_TYPE 31 define NL802154_ATTR_SEC_DEVICE 46 define NL802154_ATTR_SEC_DEVKEY 47 @@ -6931,32 +6814,6 @@ define NL802154_CMD_SET_TX_POWER 12 define NL802154_CMD_SET_WPAN_PHY_NETNS 20 define NL802154_CMD_STOP_BEACONS 39 define NL802154_CMD_TRIGGER_SCAN 35 -define NL802154_DEVKEY_ATTR_EXTENDED_ADDR 2 -define NL802154_DEVKEY_ATTR_FRAME_COUNTER 1 -define NL802154_DEVKEY_ATTR_ID 3 -define NL802154_DEV_ADDR_ATTR_EXTENDED 4 -define NL802154_DEV_ADDR_ATTR_MODE 2 -define NL802154_DEV_ADDR_ATTR_PAN_ID 1 -define NL802154_DEV_ADDR_ATTR_SHORT 3 -define NL802154_DEV_ATTR_EXTENDED_ADDR 4 -define NL802154_DEV_ATTR_FRAME_COUNTER 1 -define NL802154_DEV_ATTR_KEY_MODE 6 -define NL802154_DEV_ATTR_PAN_ID 2 -define NL802154_DEV_ATTR_SECLEVEL_EXEMPT 5 -define NL802154_DEV_ATTR_SHORT_ADDR 3 -define NL802154_KEY_ATTR_BYTES 4 -define NL802154_KEY_ATTR_ID 1 -define NL802154_KEY_ATTR_USAGE_CMDS 3 -define NL802154_KEY_ATTR_USAGE_FRAMES 2 -define NL802154_KEY_ID_ATTR_IMPLICIT 3 -define NL802154_KEY_ID_ATTR_INDEX 2 -define NL802154_KEY_ID_ATTR_MODE 1 -define NL802154_KEY_ID_ATTR_SOURCE_EXTENDED 5 -define NL802154_KEY_ID_ATTR_SOURCE_SHORT 4 -define NL802154_SECLEVEL_ATTR_CMD_FRAME 3 -define NL802154_SECLEVEL_ATTR_DEV_OVERRIDE 4 -define NL802154_SECLEVEL_ATTR_FRAME 2 -define NL802154_SECLEVEL_ATTR_LEVELS 1 define NLBL_CALIPSO_A_DOI 1 define NLBL_CALIPSO_A_MTYPE 2 define NLBL_CALIPSO_C_ADD 1 @@ -7008,12 +6865,9 @@ define NLBL_UNLABEL_C_STATICLIST 5 define NLBL_UNLABEL_C_STATICLISTDEF 8 define NLBL_UNLABEL_C_STATICREMOVE 4 define NLBL_UNLABEL_C_STATICREMOVEDEF 7 -define QCA_WLAN_VENDOR_ATTR_MAX 8 -define ROCCATIOCGREPSIZE 2147764465 define SCSI_IOCTL_GET_BUS_NUMBER 21382 define SCSI_IOCTL_GET_IDLUN 21378 define SCSI_IOCTL_SEND_COMMAND 1 -define SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR 2148016386 define SG_EMULATED_HOST 8707 define SG_GET_COMMAND_Q 8816 define SG_GET_RESERVED_SIZE 8818 @@ -7023,11 +6877,10 @@ define SG_IO 8837 define SG_SET_COMMAND_Q 8817 define SG_SET_RESERVED_SIZE 8821 define SG_SET_TIMEOUT 8705 -define SISUSB_COMMAND 3222074173 -define SISUSB_GET_CONFIG 2152002367 -define SISUSB_GET_CONFIG_SIZE 2147808062 define SNDRV_RAWMIDI_IOCTL_STATUS32 3223607072 define SNDRV_RAWMIDI_IOCTL_STATUS64 3224917792 define SW_SYNC_GET_DEADLINE 3222296322 define SW_SYNC_IOC_CREATE_FENCE 3223869184 define SW_SYNC_IOC_INC 1074026241 +define X86_IOC_RDMSR_REGS 3223348128 +define X86_IOC_WRMSR_REGS 3223348129 diff --git a/sys/linux/auto.txt.const b/sys/linux/auto.txt.const index 9c0077ba4..9d1a9bcc6 100644 --- a/sys/linux/auto.txt.const +++ b/sys/linux/auto.txt.const @@ -509,16 +509,7 @@ IOAM6_CMD_DEL_SCHEMA = 5 IOAM6_CMD_DUMP_NAMESPACES = 3 IOAM6_CMD_DUMP_SCHEMAS = 6 IOAM6_CMD_NS_SET_SCHEMA = 7 -IOCNR_GET_BUS_ADDRESS = 5 -IOCNR_GET_DEVICE_ID = 1 -IOCNR_GET_PROTOCOLS = 2 -IOCNR_GET_VID_PID = 6 -IOCNR_HP_SET_CHANNEL = 4 -IOCNR_SET_PROTOCOL = 3 -IOCNR_SOFT_RESET = 7 IOCTL_CONFIG_SYS_RESOURCE_PARAMETERS = 1074356480 -IOCTL_GET_DRV_VERSION = 2 -IOCTL_GET_HARD_VERSION = 1 IOCTL_GET_NUM_DEVICES = 1074028804 IOCTL_START_ACCEL_DEV = 1074356482 IOCTL_STATUS_ACCEL_DEV = 1074028803 @@ -540,9 +531,6 @@ IOCTL_VMCI_QUEUEPAIR_SETVA = 1956 IOCTL_VMCI_SET_NOTIFY = 1995 IOCTL_VMCI_VERSION = 1951 IOCTL_VMCI_VERSION2 = 1959 -IOW_GETINFO = 2150154243 -IOW_READ = 1074315266 -IOW_WRITE = 1074315265 IPVS_CMD_ATTR_DAEMON = 3 IPVS_CMD_ATTR_DEST = 2 IPVS_CMD_ATTR_SERVICE = 1 @@ -625,8 +613,6 @@ MAC802154_HWSIM_CMD_GET_RADIO = 1 MAC802154_HWSIM_CMD_NEW_EDGE = 8 MAC802154_HWSIM_CMD_NEW_RADIO = 3 MAC802154_HWSIM_CMD_SET_EDGE = 6 -MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID = 1 -MAC802154_HWSIM_EDGE_ATTR_LQI = 2 MACSEC_ATTR_IFINDEX = 1 MACSEC_ATTR_OFFLOAD = 9 MACSEC_ATTR_RXSC_CONFIG = 2 @@ -1283,8 +1269,6 @@ NL802154_ATTR_PID = 28 NL802154_ATTR_SCAN_CHANNELS = 33 NL802154_ATTR_SCAN_DONE_REASON = 37 NL802154_ATTR_SCAN_DURATION = 36 -NL802154_ATTR_SCAN_MEAN_PRF = 35 -NL802154_ATTR_SCAN_PREAMBLE_CODES = 34 NL802154_ATTR_SCAN_TYPE = 31 NL802154_ATTR_SEC_DEVICE = 46 NL802154_ATTR_SEC_DEVKEY = 47 @@ -1339,32 +1323,6 @@ NL802154_CMD_SET_TX_POWER = 12 NL802154_CMD_SET_WPAN_PHY_NETNS = 20 NL802154_CMD_STOP_BEACONS = 39 NL802154_CMD_TRIGGER_SCAN = 35 -NL802154_DEVKEY_ATTR_EXTENDED_ADDR = 2 -NL802154_DEVKEY_ATTR_FRAME_COUNTER = 1 -NL802154_DEVKEY_ATTR_ID = 3 -NL802154_DEV_ADDR_ATTR_EXTENDED = 4 -NL802154_DEV_ADDR_ATTR_MODE = 2 -NL802154_DEV_ADDR_ATTR_PAN_ID = 1 -NL802154_DEV_ADDR_ATTR_SHORT = 3 -NL802154_DEV_ATTR_EXTENDED_ADDR = 4 -NL802154_DEV_ATTR_FRAME_COUNTER = 1 -NL802154_DEV_ATTR_KEY_MODE = 6 -NL802154_DEV_ATTR_PAN_ID = 2 -NL802154_DEV_ATTR_SECLEVEL_EXEMPT = 5 -NL802154_DEV_ATTR_SHORT_ADDR = 3 -NL802154_KEY_ATTR_BYTES = 4 -NL802154_KEY_ATTR_ID = 1 -NL802154_KEY_ATTR_USAGE_CMDS = 3 -NL802154_KEY_ATTR_USAGE_FRAMES = 2 -NL802154_KEY_ID_ATTR_IMPLICIT = 3 -NL802154_KEY_ID_ATTR_INDEX = 2 -NL802154_KEY_ID_ATTR_MODE = 1 -NL802154_KEY_ID_ATTR_SOURCE_EXTENDED = 5 -NL802154_KEY_ID_ATTR_SOURCE_SHORT = 4 -NL802154_SECLEVEL_ATTR_CMD_FRAME = 3 -NL802154_SECLEVEL_ATTR_DEV_OVERRIDE = 4 -NL802154_SECLEVEL_ATTR_FRAME = 2 -NL802154_SECLEVEL_ATTR_LEVELS = 1 NLBL_CALIPSO_A_DOI = 1 NLBL_CALIPSO_A_MTYPE = 2 NLBL_CALIPSO_C_ADD = 1 @@ -1509,7 +1467,6 @@ PPPIOCSPASS = 1074820167, 386:arm:1074295879, mips64le:ppc64le:2148561991 PPPIOCUNBRIDGECHAN = 29748, mips64le:ppc64le:536900660 PROCMAP_QUERY = 3228067345 PSAMPLE_CMD_GET_GROUP = 1 -QCA_WLAN_VENDOR_ATTR_MAX = 8 RFKILL_IOC_MAX_SIZE = 2 RFKILL_IOC_NOINPUT = 1 RNDADDENTROPY = 1074287107, mips64le:ppc64le:2148028931 @@ -1518,7 +1475,6 @@ RNDCLEARPOOL = 20998, mips64le:ppc64le:536891910 RNDGETENTCNT = 2147766784, mips64le:ppc64le:1074024960 RNDRESEEDCRNG = 20999, mips64le:ppc64le:536891911 RNDZAPENTCNT = 20996, mips64le:ppc64le:536891908 -ROCCATIOCGREPSIZE = 2147764465 RTC_AIE_OFF = 28674, mips64le:ppc64le:536899586 RTC_AIE_ON = 28673, mips64le:ppc64le:536899585 RTC_ALM_READ = 2149871624, mips64le:ppc64le:1076129800 @@ -1541,7 +1497,6 @@ RTC_WKALM_SET = 1076391951, mips64le:ppc64le:2150133775 SCSI_IOCTL_GET_BUS_NUMBER = 21382 SCSI_IOCTL_GET_IDLUN = 21378 SCSI_IOCTL_SEND_COMMAND = 1 -SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR = 2148016386 SEG6_ATTR_ALGID = 6 SEG6_ATTR_DST = 1 SEG6_ATTR_DSTLEN = 2 @@ -1564,9 +1519,6 @@ SG_SET_RESERVED_SIZE = 8821 SG_SET_TIMEOUT = 8705 SIOCGIFHWADDR = 35111 SIOCSIFHWADDR = 35108 -SISUSB_COMMAND = 3222074173 -SISUSB_GET_CONFIG = 2152002367 -SISUSB_GET_CONFIG_SIZE = 2147808062 SMC_NETLINK_ADD_UEID = 10 SMC_NETLINK_DISABLE_HS_LIMITATION = 18 SMC_NETLINK_DISABLE_SEID = 15 diff --git a/tools/syz-declextract/declextract.go b/tools/syz-declextract/declextract.go index 0853756bf..7d85adaf8 100644 --- a/tools/syz-declextract/declextract.go +++ b/tools/syz-declextract/declextract.go @@ -62,7 +62,7 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c if err != nil { return err } - descriptions, interfaces, err := declextract.Run(out, probeInfo, syscallRename, cfg.DebugTrace) + descriptions, interfaces, includeUse, err := declextract.Run(out, probeInfo, syscallRename, cfg.DebugTrace) if err != nil { return err } @@ -94,6 +94,20 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c if err := osutil.WriteFile(autoFile+".info", serialize(interfaces)); err != nil { return err } + removeUnused(desc, "", unusedNodes) + // Second pass to remove unused defines/includes. This needs to be done after removing + // other garbage b/c they may be used by other garbage. + unusedConsts, err := compiler.CollectUnusedConsts(desc.Clone(), target, includeUse, eh) + if err != nil { + return fmt.Errorf("failed to typecheck descriptions: %w\n%s", err, errors.Bytes()) + } + removeUnused(desc, autoFile, unusedConsts) + // We need re-parse them again b/c new lines are fixed up during parsing. + formatted := ast.Format(ast.Parse(ast.Format(desc), autoFile, nil)) + return osutil.WriteFile(autoFile, formatted) +} + +func removeUnused(desc *ast.Description, autoFile string, unusedNodes []ast.Node) { unused := make(map[string]bool) for _, n := range unusedNodes { _, typ, name := n.Info() @@ -101,11 +115,8 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c } desc.Nodes = slices.DeleteFunc(desc.Nodes, func(n ast.Node) bool { pos, typ, name := n.Info() - return pos.File != autoFile || unused[typ+name] + return autoFile != "" && pos.File != autoFile || unused[typ+name] }) - // We need re-parse them again b/c new lines are fixed up during parsing. - formatted := ast.Format(ast.Parse(ast.Format(desc), autoFile, nil)) - return osutil.WriteFile(autoFile, formatted) } func prepare(loadProbeInfo func() (*ifaceprobe.Info, error), cfg *clangtool.Config) ( diff --git a/tools/syz-declextract/testdata/file_operations.c b/tools/syz-declextract/testdata/file_operations.c index 04d548f98..0dd8b9b21 100644 --- a/tools/syz-declextract/testdata/file_operations.c +++ b/tools/syz-declextract/testdata/file_operations.c @@ -3,6 +3,7 @@ #include "include/fs.h" #include "include/uapi/file_operations.h" +#include "include/uapi/unused_ioctl.h" static void foo_open() {} static void foo_read() {} @@ -43,3 +44,16 @@ const struct file_operations proc_ops[] = { .unlocked_ioctl = proc_ioctl, }, }; + +#define UNUSED_IOCTL2 _IO('c', 2) + +static void unused_ioctl(unsigned int cmd) { + switch (cmd) { + case UNUSED_IOCTL1: + case UNUSED_IOCTL2: + } +} + +const struct file_operations unused = { + .unlocked_ioctl = unused_ioctl, +}; diff --git a/tools/syz-declextract/testdata/file_operations.c.json b/tools/syz-declextract/testdata/file_operations.c.json index df1c9a20f..716dbec38 100644 --- a/tools/syz-declextract/testdata/file_operations.c.json +++ b/tools/syz-declextract/testdata/file_operations.c.json @@ -45,6 +45,12 @@ "name": "proc_write", "file": "file_operations.c", "is_static": true + }, + { + "name": "unused_ioctl", + "file": "file_operations.c", + "is_static": true, + "loc": 4 } ], "consts": [ @@ -72,6 +78,16 @@ "name": "FOO_IOCTL5", "filename": "include/uapi/file_operations.h", "value": 3221775109 + }, + { + "name": "UNUSED_IOCTL1", + "filename": "include/uapi/unused_ioctl.h", + "value": 25345 + }, + { + "name": "UNUSED_IOCTL2", + "filename": "file_operations.c", + "value": 25346 } ], "structs": [ @@ -185,6 +201,31 @@ "mmap": "proc_open", "ioctl": "proc_ioctl", "source_file": "file_operations.c" + }, + { + "name": "unused_file_operations", + "ioctl": "unused_ioctl", + "ioctl_cmds": [ + { + "name": "UNUSED_IOCTL2", + "type": { + "int": { + "byte_size": 1, + "is_const": true + } + } + }, + { + "name": "UNUSED_IOCTL1", + "type": { + "int": { + "byte_size": 1, + "is_const": true + } + } + } + ], + "source_file": "file_operations.c" } ] }
\ No newline at end of file diff --git a/tools/syz-declextract/testdata/file_operations.c.txt b/tools/syz-declextract/testdata/file_operations.c.txt index f2a0455bc..e94856980 100644 --- a/tools/syz-declextract/testdata/file_operations.c.txt +++ b/tools/syz-declextract/testdata/file_operations.c.txt @@ -6,7 +6,6 @@ type auto_todo int8 include <vdso/bits.h> include <linux/types.h> -include <net/netlink.h> include <include/uapi/file_operations.h> resource fd_foo_file_operations[fd] diff --git a/tools/syz-declextract/testdata/functions.c.txt b/tools/syz-declextract/testdata/functions.c.txt index 6dc51303b..8bd11c8fc 100644 --- a/tools/syz-declextract/testdata/functions.c.txt +++ b/tools/syz-declextract/testdata/functions.c.txt @@ -4,8 +4,4 @@ meta automatic type auto_todo int8 -include <vdso/bits.h> -include <linux/types.h> -include <net/netlink.h> - functions$auto(x fd) fd diff --git a/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h b/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h new file mode 100644 index 000000000..6c3dbb036 --- /dev/null +++ b/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h @@ -0,0 +1,6 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +#include "ioctl.h" + +#define UNUSED_IOCTL1 _IO('c', 1) diff --git a/tools/syz-declextract/testdata/io_uring.c.txt b/tools/syz-declextract/testdata/io_uring.c.txt index 77183198f..2829bcbf1 100644 --- a/tools/syz-declextract/testdata/io_uring.c.txt +++ b/tools/syz-declextract/testdata/io_uring.c.txt @@ -3,8 +3,3 @@ meta automatic type auto_todo int8 - -include <vdso/bits.h> -include <linux/types.h> -include <net/netlink.h> -include <include/uapi/io_uring.h> diff --git a/tools/syz-declextract/testdata/netlink.c.txt b/tools/syz-declextract/testdata/netlink.c.txt index e61244406..6ceb9111e 100644 --- a/tools/syz-declextract/testdata/netlink.c.txt +++ b/tools/syz-declextract/testdata/netlink.c.txt @@ -4,9 +4,6 @@ meta automatic type auto_todo int8 -include <vdso/bits.h> -include <linux/types.h> -include <net/netlink.h> include <include/uapi/netlink_family.h> resource genl_bar_family_id$auto[int16] diff --git a/tools/syz-declextract/testdata/syscall.c.txt b/tools/syz-declextract/testdata/syscall.c.txt index de87f1866..bb0cad8c4 100644 --- a/tools/syz-declextract/testdata/syscall.c.txt +++ b/tools/syz-declextract/testdata/syscall.c.txt @@ -4,9 +4,5 @@ meta automatic type auto_todo int8 -include <vdso/bits.h> -include <linux/types.h> -include <net/netlink.h> - chmod$auto(filename ptr[in, filename], mode int32) open$auto(filename ptr[in, filename], flags int32, mode int32) diff --git a/tools/syz-declextract/testdata/types.c.txt b/tools/syz-declextract/testdata/types.c.txt index 45d451d8a..04a160771 100644 --- a/tools/syz-declextract/testdata/types.c.txt +++ b/tools/syz-declextract/testdata/types.c.txt @@ -4,10 +4,6 @@ meta automatic type auto_todo int8 -include <vdso/bits.h> -include <linux/types.h> -include <net/netlink.h> - bitfield_enum$auto = a, b, c types_syscall$auto(p ptr[inout, anon_struct$auto], y ptr[inout, void], b ptr[inout, bitfields$auto], pid pid, f int32, v ptr[inout, various$auto]) |
