summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/dist/s_void
blob: 9dd52648142b8b5d379e7b8eb1a4d4eeff6ac03e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#! /bin/sh

t=__wt.$$
trap 'rm -f $t' 0 1 2 3 13 15

cd ..

# Parse a C file, discarding functions that don't return an int, and formatting
# the remaining functions as a single line.
file_parse()
{
    sed -n \
        -e '/^int$/b loop' \
        -e '/^static int$/b loop' \
        -e '/^static inline int$/b loop' \
        -e 'd' \
        -e ': loop' \
        -e 'H' \
        -e 'n' \
        -e '/^}$/!b loop' \
        -e 'H' \
        -e 'x' \
        -e 's/\n/ /g' \
        -e 'p' \
        -e 's/.*//' \
        -e 'x' \
        -e 'd' $1
}

# Strip out a list of functions that will be flagged, but are OK.
func_ok()
{
    sed \
        -e '/int __bm_stat$/d' \
        -e '/int __checkpoint_presync$/d' \
        -e '/int __compact_uri_analyze$/d' \
        -e '/int __compact_walk_page_skip$/d' \
        -e '/int __config_parser_close$/d' \
        -e '/int __curlog_reset$/d' \
        -e '/int __cursor_fix_implicit$/d' \
        -e '/int __delete_redo_window_cleanup_skip$/d' \
        -e '/int __handle_close_default$/d' \
        -e '/int __handle_general_default$/d' \
        -e '/int __handle_progress_default$/d' \
        -e '/int __im_file_close$/d' \
        -e '/int __im_file_lock$/d' \
        -e '/int __im_file_size$/d' \
        -e '/int __im_file_sync$/d' \
        -e '/int __im_fs_directory_list_free$/d' \
        -e '/int __im_fs_exist$/d' \
        -e '/int __log_record_verify$/d' \
        -e '/int __log_salvage_message$/d' \
        -e '/int __page_write_gen_wrapped_check$/d' \
        -e '/int __posix_terminate$/d' \
        -e '/int __rec_destroy_session$/d' \
        -e '/int __time_aggregate_validate_parent$/d' \
        -e '/int __time_aggregate_validate_parent_stable$/d' \
        -e '/int __time_value_validate_parent$/d' \
        -e '/int __time_value_validate_parent_stable$/d' \
        -e '/int __tree_walk_skip_count_callback$/d' \
        -e '/int __txn_rollback_to_stable_custom_skip$/d' \
        -e '/int __win_terminate$/d' \
        -e '/int __wt_block_compact_end$/d' \
        -e '/int __wt_block_compact_start$/d' \
        -e '/int __wt_block_manager_size$/d' \
        -e '/int __wt_block_tiered_load$/d' \
        -e '/int __wt_block_write_size$/d' \
        -e '/int __wt_btcur_skip_page$/d' \
        -e '/int __wt_buf_catfmt$/d' \
        -e '/int __wt_buf_fmt$/d' \
        -e '/int __wt_count_birthmarks$/d' \
        -e '/int __wt_curjoin_joined$/d' \
        -e '/int __wt_cursor_noop$/d' \
        -e '/int __wt_epoch$/d' \
        -e '/int __wt_errno$/d' \
        -e '/int __wt_get_vm_pagesize$/d' \
        -e '/int __wt_lsm_manager_pop_entry$/d' \
        -e '/int __wt_once$/d' \
        -e '/int __wt_posix_directory_list_free$/d' \
        -e '/int __wt_session_breakpoint$/d' \
        -e '/int __wt_set_return_func$/d' \
        -e '/int __wt_spin_init$/d' \
        -e '/int __wt_spin_trylock$/d' \
        -e '/int __wt_stat_connection_desc$/d' \
        -e '/int __wt_stat_dsrc_desc$/d' \
        -e '/int __wt_stat_join_desc$/d' \
        -e '/int __wt_stat_session_desc/d' \
        -e '/int __wt_txn_read_upd_list$/d' \
        -e '/int __wt_txn_rollback_required$/d' \
        -e '/int __wt_win_directory_list_free$/d' \
        -e '/int __ut_ckpt_add_blkmod_entry$/d' \
        -e '/int __ut_ovfl_discard_verbose$/d' \
        -e '/int __ut_ovfl_discard_wrapup$/d' \
        -e '/int LLVMFuzzerTestOneInput$/d' \
        -e '/int bdb_compare_reverse$/d' \
        -e '/int check_timing$/d' \
        -e '/int copyout_val$/d' \
        -e '/int csv_error$/d' \
        -e '/int csv_terminate$/d' \
        -e '/int demo_file_close$/d' \
        -e '/int demo_file_lock$/d' \
        -e '/int demo_file_size$/d' \
        -e '/int demo_file_sync$/d' \
        -e '/int demo_fs_directory_list_free$/d' \
        -e '/int demo_fs_exist$/d' \
        -e '/int error_handler$/d' \
        -e '/int fail_file_lock$/d' \
        -e '/int fail_file_sync$/d' \
        -e '/int fail_fs_directory_list_free$/d' \
        -e '/int fail_fs_exist$/d' \
        -e '/int fail_fs_simulate_fail$/d' \
        -e '/int fail_fs_terminate$/d' \
        -e '/int handle_general$/d' \
        -e '/int handle_message$/d' \
        -e '/int handle_progress$/d' \
        -e '/int index_compare_S$/d' \
        -e '/int index_compare_primary$/d' \
        -e '/int index_compare_u$/d' \
        -e '/int index_extractor_u$/d' \
        -e '/int iaa_error$/d' \
        -e '/int iaa_pre_size$/d' \
        -e '/int iaa_terminate$/d' \
        -e '/int dir_store_directory_list_free$/d' \
        -e '/int dir_store_err$/d' \
        -e '/int dir_store_file_lock$/d' \
        -e '/int dir_store_file_sync$/d' \
        -e '/int dir_store_fs_terminate$/d' \
        -e '/int log_print_err_worker$/d' \
        -e '/int lz4_error$/d' \
        -e '/int lz4_pre_size$/d' \
        -e '/int lz4_terminate$/d' \
        -e '/int main$/d' \
        -e '/int message_handler$/d' \
        -e '/int nop_decompress$/d' \
        -e '/int nop_decrypt$/d' \
        -e '/int nop_error$/d' \
        -e '/int nop_pre_size$/d' \
        -e '/int nop_sizing$/d' \
        -e '/int nop_terminate$/d' \
        -e '/int os_errno$/d' \
        -e '/int revint_terminate$/d' \
        -e '/int rotn_error$/d' \
        -e '/int rotn_sizing$/d' \
        -e '/int rotn_terminate$/d' \
        -e '/int snappy_pre_size$/d' \
        -e '/int snappy_terminate$/d' \
        -e '/int sodium_configure$/d' \
        -e '/int sodium_error$/d' \
        -e '/int sodium_sizing$/d' \
        -e '/int sodium_terminate$/d' \
        -e '/int subtest_error_handler$/d' \
        -e '/int test_hs_workload$/d' \
        -e '/int uri2name$/d' \
        -e '/int usage$/d' \
        -e '/int util_err$/d' \
        -e '/int wiredtiger_calc_modify/d' \
        -e '/int wiredtiger_extension_init$/d' \
        -e '/int wiredtiger_extension_terminate$/d' \
        -e '/int wiredtiger_pack_close$/d' \
        -e '/int zlib_error$/d' \
        -e '/int zlib_terminate$/d' \
        -e '/int zstd_error$/d' \
        -e '/int zstd_pre_size$/d' \
        -e '/int zstd_terminate$/d' \
        -e '/int __wt_curhs_search_near_after$/d' \
        -e '/int __wt_curhs_search_near_before$/d'
}

for f in `find bench ext src test -name '*.c' -o -name '*_inline.h'`; do
    if expr "$f" : '.*/windows_shim.c' > /dev/null; then
        continue
    fi

    # Complain about functions which return an "int" but which don't return
    # except at the end of the function.
    #
    # Turn each function into a single line, then discard the function's
    # final "return" call, then discard any function that still has some
    # form of return assignment or call.
    file_parse $f |
    sed -e 's/return ([^)]*); }$//' \
        -e '/[_A-Z]*_API_CALL[_A-Z]*(/d' \
        -e '/WT_CURSOR_NEEDKEY(/d' \
        -e '/WT_CURSOR_NEEDVALUE(/d' \
        -e '/WT_ERR[A-Z_]*(/d' \
        -e '/WT_PAGE_ALLOC_AND_SWAP(/d' \
        -e '/WT_PANIC[A-Z_]*(/d' \
        -e '/WT_RET[A-Z_]*(/d' \
        -e '/WT_SIZE_CHECK_PACK(/d' \
        -e '/WT_SIZE_CHECK_UNPACK(/d' \
        -e '/WT_SYSCALL(/d' \
        -e '/WT_TRET(/d' \
        -e '/[^a-z_]ret = /d' \
        -e '/[^a-z_]return (/d' \
        -e 's/^\([^(]*\).*/\1/' \
        -e 's/^ *//' |
    func_ok > $t
    test -s $t && {
        echo "=============================================="
        echo "$f:"
        cat $t | sed 's/^/	/'
        echo "Function could return void instead of int."
        echo "Add false positives to the list in dist/s_void."
        echo "=============================================="
    }

    # Complain about functions which declare a "ret" value but never use it.
    file_parse $f |
    grep 'WT_DECL_RET' |
    sed -e '/ret =/d' \
        -e '/[_A-Z]*_API_CALL[_A-Z]*(/d' \
        -e '/WT_CURSOR_NEEDKEY/d' \
        -e '/WT_CURSOR_NEEDVALUE/d' \
        -e '/WT_PAGE_ALLOC_AND_SWAP(/d' \
        -e '/WT_ERR/d' \
        -e '/WT_SYSCALL.*ret/d' \
        -e '/WT_TRET/d' \
        -e '/__wt_buf_catfmt/d' \
        -e '/__wt_buf_fmt/d' \
        -e 's/^\([^(]*\).*/\1/' \
        -e 's/^ *//' > $t
    test -s $t && {
        echo "=============================================="
        echo "$f:"
        cat $t | sed 's/^/	/'
        echo "Function declares ret without using it."
        echo "Add false positives to the list in dist/s_void."
        echo "=============================================="
    }
done

exit 0