From 81b03daad2a4f2571c3c015edb04490680cc22e2 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Tue, 7 Apr 2009 07:39:56 +0300 Subject: [PATCH] Separate the list of freed arguments from decremented args. Signed-off-by: Dan Carpenter --- check_frees_argument.c | 27 -------- check_leaks.c | 33 +++++++++- check_frees_argument.c => check_puts_argument.c | 55 ++++------------ smatch.c | 2 + smatch_data/kernel.frees_argument | 88 +------------------------ smatch_data/kernel.frees_argument.remove | 3 + smatch_data/kernel.puts_argument | 86 ++++++++++++++++++++++++ smatch_scripts/gen_puts_list.sh | 20 ++++++ 8 files changed, 155 insertions(+), 159 deletions(-) copy check_frees_argument.c => check_puts_argument.c (63%) create mode 100644 smatch_data/kernel.puts_argument create mode 100755 smatch_scripts/gen_puts_list.sh diff --git a/check_frees_argument.c b/check_frees_argument.c index 26a2ad2b..708b0fe5 100644 --- a/check_frees_argument.c +++ b/check_frees_argument.c @@ -40,31 +40,6 @@ static int is_arg(char *name, struct symbol *sym) return 0; } -static int parent_is_arg(struct symbol *sym) -{ - struct symbol *arg; - - FOR_EACH_PTR(this_func->ctype.base_type->arguments, arg) { - if (sym == arg) - return 1; - } END_FOR_EACH_PTR(arg); - return 0; -} - -static void match_put(const char *fn, struct expression *expr, void *info) -{ - struct expression *tmp; - struct symbol *sym; - char *name; - - tmp = get_argument_from_call_expr(expr->args, 0); - tmp = strip_expr(tmp); - name = get_variable_from_expr(tmp, &sym); - free_string(name); - if (parent_is_arg(sym) && sym->ident) - set_state(sym->ident->name, my_id, sym, &freed); -} - static void match_kfree(const char *fn, struct expression *expr, void *info) { struct expression *tmp; @@ -140,8 +115,6 @@ void check_frees_argument(int id) my_id = id; add_hook(&match_function_def, FUNC_DEF_HOOK); add_function_hook("kfree", &match_kfree, NULL); - add_function_hook("kobject_put", &match_put, NULL); - add_function_hook("kref_put", &match_put, NULL); add_hook(&match_return, RETURN_HOOK); add_hook(&match_end_func, END_FUNC_HOOK); } diff --git a/check_leaks.c b/check_leaks.c index e90b4c75..a419d050 100644 --- a/check_leaks.c +++ b/check_leaks.c @@ -124,7 +124,7 @@ static void check_slist(struct state_list *slist) FOR_EACH_PTR(sm->possible, poss) { if (poss->state == &allocated) smatch_msg("warn: '%s' possibly leaked on error" - "path (implied from line %d)", + " path (implied from line %d)", sm->name, poss->line); } END_FOR_EACH_PTR(poss); } END_FOR_EACH_PTR(sm); @@ -198,7 +198,7 @@ static void match_end_func(struct symbol *sym) free_trackers_and_list(&arguments); } -static void register_funcs_from_file(void) +static void register_free_funcs(void) { struct token *token; const char *func; @@ -224,6 +224,32 @@ static void register_funcs_from_file(void) clear_token_alloc(); } +static void register_put_funcs(void) +{ + struct token *token; + const char *func; + int arg; + + token = get_tokens_file("kernel.puts_argument"); + if (!token) + return; + if (token_type(token) != TOKEN_STREAMBEGIN) + return; + token = token->next; + while (token_type(token) != TOKEN_STREAMEND) { + if (token_type(token) != TOKEN_IDENT) + return; + func = show_ident(token->ident); + token = token->next; + if (token_type(token) != TOKEN_NUMBER) + return; + arg = atoi(token->number); + add_function_hook(func, &match_free, (void *)arg); + token = token->next; + } + clear_token_alloc(); +} + static void register_allocation_funcs(void) { struct token *token; @@ -255,7 +281,8 @@ void check_leaks(int id) add_hook(&match_return, RETURN_HOOK); add_hook(&match_end_func, END_FUNC_HOOK); add_function_hook("kfree", &match_free, (void *)0); - register_funcs_from_file(); + register_free_funcs(); + register_put_funcs(); for(i = 0; allocation_funcs[i]; i++) { add_function_assign_hook(allocation_funcs[i], &match_allocation, NULL); diff --git a/check_frees_argument.c b/check_puts_argument.c similarity index 63% copy from check_frees_argument.c copy to check_puts_argument.c index 26a2ad2b..74d94169 100644 --- a/check_frees_argument.c +++ b/check_puts_argument.c @@ -1,5 +1,5 @@ /* - * sparse/check_frees_argument.c + * sparse/check_puts_argument.c * * Copyright (C) 2009 Dan Carpenter. * @@ -17,29 +17,16 @@ static int my_id; -STATE(freed); +STATE(putted); static struct symbol *this_func; -static struct tracker_list *freed_args = NULL; +static struct tracker_list *putted_args = NULL; static void match_function_def(struct symbol *sym) { this_func = sym; } -static int is_arg(char *name, struct symbol *sym) -{ - struct symbol *arg; - const char *arg_name; - - FOR_EACH_PTR(this_func->ctype.base_type->arguments, arg) { - arg_name = (arg->ident?arg->ident->name:"-"); - if (sym == arg && !strcmp(name, arg_name)) - return 1; - } END_FOR_EACH_PTR(arg); - return 0; -} - static int parent_is_arg(struct symbol *sym) { struct symbol *arg; @@ -62,22 +49,7 @@ static void match_put(const char *fn, struct expression *expr, void *info) name = get_variable_from_expr(tmp, &sym); free_string(name); if (parent_is_arg(sym) && sym->ident) - set_state(sym->ident->name, my_id, sym, &freed); -} - -static void match_kfree(const char *fn, struct expression *expr, void *info) -{ - struct expression *tmp; - struct symbol *sym; - char *name; - - tmp = get_argument_from_call_expr(expr->args, 0); - tmp = strip_expr(tmp); - name = get_variable_from_expr(tmp, &sym); - if (is_arg(name, sym)) { - set_state(name, my_id, sym, &freed); - } - free_string(name); + set_state(sym->ident->name, my_id, sym, &putted); } static int return_count = 0; @@ -90,16 +62,16 @@ static void match_return(struct statement *stmt) if (!return_count) { slist = get_all_states(my_id); FOR_EACH_PTR(slist, tmp) { - if (tmp->state == &freed) - add_tracker(&freed_args, tmp->name, my_id, + if (tmp->state == &putted) + add_tracker(&putted_args, tmp->name, my_id, tmp->sym); } END_FOR_EACH_PTR(tmp); free_slist(&slist); } else { - FOR_EACH_PTR(freed_args, tracker) { + FOR_EACH_PTR(putted_args, tracker) { tmp = get_sm_state(tracker->name, my_id, tracker->sym); - if (tmp && tmp->state != &freed) - del_tracker(&freed_args, tracker->name, my_id, + if (tmp && tmp->state != &putted) + del_tracker(&putted_args, tracker->name, my_id, tracker->sym); } END_FOR_EACH_PTR(tracker); @@ -113,7 +85,7 @@ static void print_arg(struct symbol *sym) FOR_EACH_PTR(this_func->ctype.base_type->arguments, arg) { if (sym == arg) { - printf("info: free_arg %s %d\n", get_function(), i); + printf("info: puts_arg %s %d\n", get_function(), i); return; } i++; @@ -127,19 +99,18 @@ static void match_end_func(struct symbol *sym) if (is_reachable()) match_return(NULL); - FOR_EACH_PTR(freed_args, tracker) { + FOR_EACH_PTR(putted_args, tracker) { print_arg(tracker->sym); } END_FOR_EACH_PTR(tracker); - free_trackers_and_list(&freed_args); + free_trackers_and_list(&putted_args); return_count = 0; } -void check_frees_argument(int id) +void check_puts_argument(int id) { my_id = id; add_hook(&match_function_def, FUNC_DEF_HOOK); - add_function_hook("kfree", &match_kfree, NULL); add_function_hook("kobject_put", &match_put, NULL); add_function_hook("kref_put", &match_put, NULL); add_hook(&match_return, RETURN_HOOK); diff --git a/smatch.c b/smatch.c index efa1931f..4128ae19 100644 --- a/smatch.c +++ b/smatch.c @@ -25,6 +25,7 @@ void check_overflow(int id); void check_locking(int id); void check_memory(int id); void check_frees_argument(int id); +void check_puts_argument(int id); void check_leaks(int id); void check_type(int id); void check_allocation_funcs(int id); @@ -43,6 +44,7 @@ static const reg_func reg_funcs[] = { // &check_allocation_funcs, // &check_leaks, // &check_frees_argument, + // &check_puts_argument, // &check_err_ptr, /* <- your test goes here */ diff --git a/smatch_data/kernel.frees_argument b/smatch_data/kernel.frees_argument index 5852bbe9..a4e61758 100644 --- a/smatch_data/kernel.frees_argument +++ b/smatch_data/kernel.frees_argument @@ -7,7 +7,6 @@ acpi_ds_delete_walk_state 0 acpi_ev_delete_gpe_xrupt 0 acpi_ut_delete_internal_object_list 0 adapter_remove_and_free_device 1 -add_port 0 adpt_i2o_delete_hba 0 adu_delete 0 aead_geniv_free 0 @@ -29,7 +28,6 @@ ahc_free 0 ahd_alloc 1 ahd_dma_tag_destroy 1 ahd_free 0 -alloc_mad 0 aoedev_freedev 0 ap_free_sta 1 argv_free 0 @@ -49,15 +47,11 @@ b43_destroy_pioqueue_tx 0 b43legacy_destroy_dmaring 0 b43legacy_destroy_pioqueue 0 bcm_remove_op 0 -bd_holder_grab_dirs 1 -bd_holder_release_dirs 0 -bd_release_from_disk 1 bio_free_map_data 0 bio_kmalloc_destructor 0 bioset_free 0 bitmap_free 0 bitmap_free_page 1 -blk_put_queue 0 blk_queue_init_tags 2 blk_trace_cleanup 0 block2mtd_free_device 0 @@ -67,9 +61,6 @@ bridge_slot_remove 0 btrfs_free_fs_root 1 btrfs_parse_options 1 btrfs_recover_log_trees 0 -btrfs_sysfs_del_root 0 -btrfs_sysfs_del_super 0 -bus_remove_driver 0 c101_destroy_card 0 c2_dealloc_pd 0 c2_dealloc_ucontext 0 @@ -81,7 +72,6 @@ cas_page_free 1 cat_destroy 0 cat_destroy 1 cdebbuf_free 0 -cdev_del 0 cfg80211_dev_free 0 cifs_demultiplex_thread 0 cipso_v4_cache_entry_free 0 @@ -100,7 +90,6 @@ clusterip_seq_stop 1 cm109_usb_cleanup 0 cm_create_port_fs 0 cm_free_work 0 -cm_remove_port_fs 0 cn_queue_free_callback 0 cn_queue_free_dev 0 coalesced_mmio_destructor 0 @@ -111,9 +100,7 @@ complete_request_key 0 cond_destroy_bool 0 cond_destroy_bool 1 cond_node_destroy 0 -connect_request_upcall 0 con_unify_unimap 1 -cpufreq_cpu_put 0 cryptd_free 0 crypto_authenc_free 0 crypto_cbc_free 0 @@ -138,12 +125,10 @@ dcookie_unregister 0 delete_adapter 0 __delete_addr 0 delete_attr_set 0 -del_gendisk 0 destroy_8023_client 0 destroy_EII_client 0 destroy_header_iter 0 destroy_log_context 0 -destroy_nbp 0 destroy_rmpp_recv 0 destroy_sv 0 destroy_workqueue 0 @@ -153,11 +138,7 @@ dlm_free_ctxt_mem 0 dlm_free_lvb 0 dlm_free_pagevec 0 dlm_free_rsb 0 -dlm_lock_put 0 -dlm_lockres_put 0 dlm_mig_lockres_worker 1 -dlm_put 0 -__dlm_put_mle 0 dlm_user_cancel 1 dlm_user_convert 1 dlm_user_unlock 1 @@ -175,7 +156,6 @@ DoC2k_init 0 dock_remove 0 DoCMil_init 0 DoCMilPlus_init 0 -drm_master_put 0 drm_mode_destroy 1 drm_mode_remove 1 drm_pci_free 1 @@ -191,20 +171,13 @@ dvb_unregister_device 0 dvb_usb_exit 0 dynamic_kobj_release 0 ebt_unregister_table 0 -edac_device_delete_block 1 -edac_device_unregister_sysfs_main_kobj 0 -edac_mc_unregister_sysfs_main_kobj 0 edac_pci_release_main_kobj 0 -edac_pci_unregister_sysfs_instance_kobj 0 -edac_remove_sysfs_mci_device 0 efx_tsoh_heap_free 1 -elevator_exit 0 ep_free 0 eql_kill_one_slave 1 erase_callback 0 erase_worker 1 evbug_disconnect 0 -export_rdev 0 ext3_htree_free_dir_info 0 ext4_htree_free_dir_info 0 fb_destroy_modedb 0 @@ -234,7 +207,6 @@ free_fs_devices 0 free_keyval 0 free_kmem_cache_cpu 0 free_locked_buffer 0 -free_mad 0 free_msg 0 free_multipath 0 free_ncci 1 @@ -253,34 +225,29 @@ free_proc_entry 0 free_recv_msg 0 free_rootdomain 0 free_sched_group 0 -free_scq 0 -free_scq 1 free_sect_attrs 0 free_sglist 0 free_smi_msg 0 freetgt 1 free_trial_cpuset 0 free_tty_struct 0 -free_urbs 0 free_usb_address 1 free_vm_area 0 free_workspace 0 -ftdi_elan_put_kref 0 ftl_erase_callback 0 ftl_remove_dev 0 fuse_file_free 0 fuse_free_conn 0 fuse_sync_release 1 fw_dev_release 0 +fw_hdrs_free 0 fw_send_response 1 gameport_free_event 0 garp_attr_destroy 1 gc_remove 0 gdlm_delete_lp 0 -gdlm_kobject_release 0 gen_pool_destroy 0 gf128mul_free_64k 0 -gfs2_sys_fs_del 0 gigaset_freedriver 0 groups_free 0 gss_do_free_ctx 0 @@ -301,14 +268,12 @@ hpsb_iso_shutdown 0 hso_free_device 0 hso_free_shared_int 0 htb_destroy_class 1 -hvc_remove 0 i1480u_tx_free 0 i2c_tiny_usb_free 0 i2o_block_device_free 0 i2o_exec_wait_free 0 ib_dealloc_device 0 ib_destroy_fmr_pool 0 -ib_device_unregister_sysfs 0 ibmpex_bmc_delete 0 ibmphp_remove_bus 0 ib_umem_release 0 @@ -326,8 +291,6 @@ inet_frag_destroy 0 intel_i810_free_by_type 0 ioat_dma_remove 0 ioc4_load_modules 0 -ipmi_destroy_user 0 -ipmi_unregister_smi 0 ipoib_cm_tx_destroy 0 ipoib_mcast_free 0 ipoib_neigh_free 1 @@ -361,13 +324,6 @@ kbd_disconnect 0 kfifo_free 0 kfree_sgl 2 kimage_free 0 -klist_dec_and_del 0 -kobject_del 0 -kobject_move 0 -kobject_move 1 -kobject_rename 0 -krealloc 0 -kset_unregister 0 kvm_arch_destroy_vm 0 kvm_free_assigned_device 1 kvm_mmu_free_page 1 @@ -385,7 +341,6 @@ lpfc_els_free_data 1 lpfc_els_hbq_free 1 lpfc_free_ct_rsp 1 lpfc_free_fast_evt 1 -lpfc_nlp_put 0 mac_destroy 0 map_destroy 0 matroxfb_crtc2_remove 1 @@ -403,10 +358,6 @@ mlx4_free_icm 1 mlx4_ib_dealloc_pd 0 mmu_free_pte_chain 0 mmu_free_rmap_desc 0 -mod_kobject_remove 0 -mod_sysfs_fini 0 -mod_sysfs_setup 0 -mon_reader_del 0 mpt_adapter_dispose 0 mptsas_port_delete 1 mtdblock_remove_dev 0 @@ -436,19 +387,16 @@ nfs4_free_lock_state 0 nfs4_free_open_state 0 nfs4_put_state_owner 0 nfs_access_free_entry 0 -nfs_direct_req_release 0 nfs_do_free_delegation 0 nfs_free_client 0 nfs_free_seqid 0 nfs_free_server 0 nfs_free_unlinkdata 0 -nfs_release_request 0 n_hdlc_release 0 nlmclnt_finish_block 0 nlm_destroy_host 0 nlm_put_lockowner 0 nlm_release_call 0 -o2net_handler_put 0 ocfs2_finish_quota_recovery 1 ocfs2_free_alloc_context 0 ocfs2_free_quota_recovery 0 @@ -466,7 +414,6 @@ p9_fid_destroy 0 p9_idpool_destroy 0 parport_unregister_device 0 path_free 1 -pci_destroy_slot 0 pcie_release_ctrl 0 pci_release_bus_bridge_dev 0 pciserial_remove_ports 0 @@ -488,12 +435,8 @@ portman_free 0 ppp_destroy_channel 0 pppol2tp_tunnel_free 0 __put_css_set 0 -put_driver 0 -__put_lkb 1 __put_mnt_ns 0 __put_nfs_open_context 0 -put_rsb 0 -put_uobj 0 pvr2_context_destroy 0 pvr2_dvb_destroy 0 pvr2_hdw_destroy 0 @@ -512,21 +455,16 @@ queue_delete 0 r10bio_pool_free 0 r1bio_pool_free 0 rate_control_pid_free_sta 2 -rate_control_put 0 rb_free_cpu_buffer 0 rdma_destroy_trans 0 realloc_argv 1 recent_entry_remove 1 regulator_put 0 -relay_close 0 -relay_close_buf 0 relay_destroy_buf 0 -release_ep_resources 0 release_hw 0 release_l1 0 release_l2 0 release_l3_process 0 -release_lockspace 0 release_port 1 release_slot 0 remove_from_rx_queue 1 @@ -544,27 +482,20 @@ role_destroy 1 rose_remove_neigh 0 rose_remove_node 0 rose_remove_route 0 -rpc_free_auth 0 rpc_free_iostats 0 -rpc_release_client 0 rxrpc_cleanup_transport 0 rxrpc_destroy_connection 0 saa5249_probe 0 saa7111_probe 0 savemem 1 sbp2_remove_device 0 -sbp2_target_put 0 sb_register_oss 0 sb_unload 0 -sc_put 0 -scsi_cd_put 0 scsi_finish_async_scan 0 -scsi_tape_put 0 sctp_auth_destroy_hmacs 0 sctp_auth_shkey_free 0 sctp_datamsg_destroy 0 sctp_transport_destroy 0 -sdio_uart_port_put 0 selinux_release_secctx 0 selinux_xfrm_policy_free 0 sens_destroy 0 @@ -575,7 +506,6 @@ serio_raw_cleanup 0 sesInfoFree 0 __set_regdom 0 set_regdom 0 -setup_card 0 __sg_remove_sfp 1 skcipher_geniv_free 0 slhc_free 0 @@ -658,7 +588,6 @@ spidev_release 0 squashfs_cache_delete 0 srp_free_iu 1 __sta_info_free 1 -stop_ep_timer 0 st_release_request 0 subscr_del 0 subscr_terminate 0 @@ -666,10 +595,6 @@ subscr_timeout 0 sv11_shutdown 0 svc_destroy 0 svc_exit_thread 0 -svc_xprt_put 0 -sysdev_unregister 0 -sysfs_slab_add 0 -sysfs_slab_remove 0 t1_espi_destroy 0 t1_sge_destroy 0 t1_tp_destroy 0 @@ -690,10 +615,8 @@ tipc_zone_delete 0 tlv320aic23_codec_probe 0 try_smi_init 0 tty_audit_buf_free 0 -tty_driver_kref_put 0 type_destroy 0 type_destroy 1 -u132_ring_requeue_work 0 u32_destroy_hnode 1 u32_destroy_key 1 ub_cleanup 0 @@ -703,41 +626,32 @@ ubifs_scan_destroy 0 ubi_scan_destroy_si 0 ubi_scan_rm_volume 1 ucma_free_ctx 0 -uio_dev_del_attributes 0 -unhold_rsb 0 unregister_8022_client 0 unregister_mad_agent 0 unregister_mad_snoop 0 unregister_snap_client 0 unx_free_cred 0 urb_free_priv 1 -usbatm_put_instance 0 usb_cleanup 0 usblp_cleanup 0 usb_se401_remove_disconnected 0 -usb_serial_put 0 usbvision_release 0 user_destroy 0 user_destroy 1 -uwb_rc_neh_put 0 -uwb_rsv_put 0 video_device_release 0 vlan_group_free 0 vlsi_free_ring 0 __vmalloc_area_node 0 vx_free_pipe 1 w1_slave_detach 0 -wa_xfer_put 0 wear_leveling_worker 1 wl_del_wavepoint 0 __wlp_neighbor_release 0 -wlp_wss_sysfs_add 0 wm8350_i2c_probe 0 wm8775_detach 0 xcbc_free 0 xfrm_policy_destroy 0 xfrm_state_gc_destroy 0 -xprt_put 0 xprt_rdma_destroy 0 xs_destroy 0 xt_free_table_info 0 diff --git a/smatch_data/kernel.frees_argument.remove b/smatch_data/kernel.frees_argument.remove index 16a840c3..148543a7 100644 --- a/smatch_data/kernel.frees_argument.remove +++ b/smatch_data/kernel.frees_argument.remove @@ -1,3 +1,6 @@ free_cell 0 free_scq 0 free_scq 1 +setup_card 0 +krealloc 0 +free_urbs 0 diff --git a/smatch_data/kernel.puts_argument b/smatch_data/kernel.puts_argument new file mode 100644 index 00000000..0b4743bc --- /dev/null +++ b/smatch_data/kernel.puts_argument @@ -0,0 +1,86 @@ +// list of functions and the argument they decrement the ref of. +// generated by `gen_puts_list.sh` +add_port 0 +alloc_mad 0 +bd_holder_grab_dirs 1 +bd_holder_release_dirs 0 +bd_release_from_disk 1 +blk_put_queue 0 +btrfs_sysfs_del_root 0 +btrfs_sysfs_del_super 0 +bus_remove_driver 0 +cdev_del 0 +cm_create_port_fs 0 +cm_remove_port_fs 0 +connect_request_upcall 0 +cpufreq_cpu_put 0 +del_gendisk 0 +destroy_foo_obj 0 +destroy_nbp 0 +dlm_lock_put 0 +dlm_lockres_put 0 +dlm_put 0 +__dlm_put_mle 0 +drm_master_put 0 +edac_device_delete_block 1 +edac_device_unregister_sysfs_main_kobj 0 +edac_mc_unregister_sysfs_main_kobj 0 +edac_pci_unregister_sysfs_instance_kobj 0 +edac_remove_sysfs_mci_device 0 +elevator_exit 0 +export_rdev 0 +free_mad 0 +ftdi_elan_put_kref 0 +gdlm_kobject_release 0 +gfs2_sys_fs_del 0 +hvc_remove 0 +ib_device_unregister_sysfs 0 +ipmi_destroy_user 0 +ipmi_unregister_smi 0 +klist_dec_and_del 0 +kobject_del 0 +kobject_move 0 +kobject_move 1 +kobject_rename 0 +kset_unregister 0 +lpfc_nlp_put 0 +mod_kobject_remove 0 +mod_sysfs_fini 0 +mod_sysfs_setup 0 +mon_reader_del 0 +nfs_direct_req_release 0 +nfs_release_request 0 +o2net_handler_put 0 +pci_destroy_slot 0 +put_driver 0 +__put_lkb 1 +put_rsb 0 +put_uobj 0 +rate_control_put 0 +relay_close 0 +relay_close_buf 0 +release_ep_resources 0 +release_lockspace 0 +rpc_free_auth 0 +rpc_release_client 0 +sbp2_target_put 0 +sc_put 0 +scsi_cd_put 0 +scsi_tape_put 0 +sdio_uart_port_put 0 +stop_ep_timer 0 +svc_xprt_put 0 +sysdev_unregister 0 +sysfs_slab_add 0 +sysfs_slab_remove 0 +tty_driver_kref_put 0 +u132_ring_requeue_work 0 +uio_dev_del_attributes 0 +unhold_rsb 0 +usbatm_put_instance 0 +usb_serial_put 0 +uwb_rc_neh_put 0 +uwb_rsv_put 0 +wa_xfer_put 0 +wlp_wss_sysfs_add 0 +xprt_put 0 diff --git a/smatch_scripts/gen_puts_list.sh b/smatch_scripts/gen_puts_list.sh new file mode 100755 index 00000000..1071b4af --- /dev/null +++ b/smatch_scripts/gen_puts_list.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +file=$1 + +if [[ "$file" = "" ]] ; then + echo "Usage: $0 " + exit 1 +fi + +bin_dir=$(dirname $0) +remove=$(echo ${bin_dir}/../smatch_data/kernel.puts_argument.remove) +tmp=$(mktemp /tmp/smatch.XXXX) + +echo "// list of functions and the argument they decrement the ref of." > kernel.puts_argument +echo '// generated by `gen_puts_list.sh`' >> kernel.puts_argument +grep -w puts_arg $file | cut -d ' ' -f 3- >> $tmp +cat $tmp $remove $remove 2> /dev/null | sort | uniq -u >> kernel.puts_argument +rm $tmp +echo "Done. List saved as 'kernel.puts_argument'" + -- 2.11.4.GIT