Bug Summary

File:src/usr.bin/systat/uvm.c
Warning:line 257, column 3
Value stored to 'maxline' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name uvm.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.bin/systat/obj -resource-dir /usr/local/lib/clang/13.0.0 -D NOKVM -I /usr/src/usr.bin/systat/../../usr.bin/vmstat -I /usr/src/usr.bin/systat/../../sbin/pfctl -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/systat/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/usr.bin/systat/uvm.c
1/* $OpenBSD: uvm.c,v 1.5 2019/06/28 13:35:04 deraadt Exp $ */
2/*
3 * Copyright (c) 2008 Can Erkin Acar <canacar@openbsd.org>
4 * Copyright (c) 2018 Kenneth R Westerback <krw@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/types.h>
20#include <sys/signal.h>
21#include <sys/sysctl.h>
22#include <sys/pool.h>
23#include <ctype.h>
24#include <err.h>
25#include <errno(*__errno()).h>
26#include <stdlib.h>
27#include <string.h>
28#include <limits.h>
29
30#include "systat.h"
31
32#ifndef nitems
33#define nitems(_a)(sizeof((_a)) / sizeof((_a)[0])) (sizeof((_a)) / sizeof((_a)[0]))
34#endif
35
36void print_uvm(void);
37int read_uvm(void);
38int select_uvm(void);
39
40void print_uvmexp_field(field_def *, field_def *, int *, int *, const char *);
41void print_uvmexp_line(int);
42
43struct uvmexp uvmexp;
44struct uvmexp last_uvmexp;
45
46struct uvmline {
47 int *v1;
48 int *ov1;
49 char *n1;
50 int *v2;
51 int *ov2;
52 char *n2;
53 int *v3;
54 int *ov3;
55 char *n3;
56};
57
58struct uvmline uvmline[] = {
59 { NULL((void *)0), NULL((void *)0), "Page Counters",
60 NULL((void *)0), NULL((void *)0), "Stats Counters",
61 NULL((void *)0), NULL((void *)0), "Fault Counters" },
62 { &uvmexp.npages, &last_uvmexp.npages, "npages",
63 &uvmexp.faults, &last_uvmexp.faults, "faults",
64 &uvmexp.fltnoram, &last_uvmexp.fltnoram, "fltnoram" },
65 { &uvmexp.free, &last_uvmexp.free, "free",
66 &uvmexp.traps, &last_uvmexp.traps, "traps",
67 &uvmexp.fltnoanon, &last_uvmexp.fltnoanon, "fltnoanon" },
68 { &uvmexp.active, &last_uvmexp.active, "active",
69 &uvmexp.intrs, &last_uvmexp.intrs, "intrs",
70 &uvmexp.fltnoamap, &last_uvmexp.fltnoamap, "fltnoamap" },
71 { &uvmexp.inactive, &last_uvmexp.inactive, "inactive",
72 &uvmexp.swtch, &last_uvmexp.swtch, "swtch",
73 &uvmexp.fltpgwait, &last_uvmexp.fltpgwait, "fltpgwait" },
74 { &uvmexp.paging, &last_uvmexp.paging, "paging",
75 &uvmexp.softs, &last_uvmexp.softs, "softs",
76 &uvmexp.fltpgrele, &last_uvmexp.fltpgrele, "fltpgrele" },
77 { &uvmexp.wired, &last_uvmexp.wired, "wired",
78 &uvmexp.syscalls, &last_uvmexp.syscalls, "syscalls",
79 &uvmexp.fltrelck, &last_uvmexp.fltrelck, "fltrelck" },
80 { &uvmexp.zeropages, &last_uvmexp.zeropages, "zeropages",
81 &uvmexp.pageins, &last_uvmexp.pageins, "pageins",
82 &uvmexp.fltrelckok, &last_uvmexp.fltrelckok, "fltrelckok" },
83 { &uvmexp.reserve_pagedaemon, &last_uvmexp.reserve_pagedaemon,
84 "reserve_pagedaemon",
85 &uvmexp.pgswapin, &last_uvmexp.pgswapin, "pgswapin",
86 &uvmexp.fltanget, &last_uvmexp.fltanget, "fltanget" },
87 { &uvmexp.reserve_kernel, &last_uvmexp.reserve_kernel, "reserve_kernel",
88 &uvmexp.pgswapout, &last_uvmexp.pgswapout, "pgswapout",
89 &uvmexp.fltanretry, &last_uvmexp.fltanretry, "fltanretry" },
90 { NULL((void *)0), NULL((void *)0), NULL((void *)0),
91 &uvmexp.forks, &last_uvmexp.forks, "forks",
92 &uvmexp.fltamcopy, &last_uvmexp.fltamcopy, "fltamcopy" },
93 { NULL((void *)0), NULL((void *)0), "Pageout Params",
94 &uvmexp.forks_ppwait, &last_uvmexp.forks_ppwait, "forks_ppwait",
95 &uvmexp.fltnamap, &last_uvmexp.fltnamap, "fltnamap" },
96 { &uvmexp.freemin, &last_uvmexp.freemin, "freemin",
97 &uvmexp.forks_sharevm, &last_uvmexp.forks_sharevm, "forks_sharevm",
98 &uvmexp.fltnomap, &last_uvmexp.fltnomap, "fltnomap" },
99 { &uvmexp.freetarg, &last_uvmexp.freetarg, "freetarg",
100 &uvmexp.pga_zerohit, &last_uvmexp.pga_zerohit, "pga_zerohit",
101 &uvmexp.fltlget, &last_uvmexp.fltlget, "fltlget" },
102 { &uvmexp.inactarg, &last_uvmexp.inactarg, "inactarg",
103 &uvmexp.pga_zeromiss, &last_uvmexp.pga_zeromiss, "pga_zeromiss",
104 &uvmexp.fltget, &last_uvmexp.fltget, "fltget" },
105 { &uvmexp.wiredmax, &last_uvmexp.wiredmax, "wiredmax",
106 NULL((void *)0), NULL((void *)0), NULL((void *)0),
107 &uvmexp.flt_anon, &last_uvmexp.flt_anon, "flt_anon" },
108 { &uvmexp.anonmin, &last_uvmexp.anonmin, "anonmin",
109 NULL((void *)0), NULL((void *)0), "Daemon Counters",
110 &uvmexp.flt_acow, &last_uvmexp.flt_acow, "flt_acow" },
111 { &uvmexp.vtextmin, &last_uvmexp.vtextmin, "vtextmin",
112 &uvmexp.pdwoke, &last_uvmexp.pdwoke, "pdwoke",
113 &uvmexp.flt_obj, &last_uvmexp.flt_obj, "flt_obj" },
114 { &uvmexp.vnodemin, &last_uvmexp.vnodemin, "vnodemin",
115 &uvmexp.pdrevs, &last_uvmexp.pdrevs, "pdrevs",
116 &uvmexp.flt_prcopy, &last_uvmexp.flt_prcopy, "flt_prcopy" },
117 { &uvmexp.anonminpct, &last_uvmexp.anonminpct, "anonminpct",
118 &uvmexp.pdswout, &last_uvmexp.pdswout, "pdswout",
119 &uvmexp.flt_przero, &last_uvmexp.flt_przero, "flt_przero" },
120 { &uvmexp.vtextminpct, &last_uvmexp.vtextminpct, "vtextminpct",
121 &uvmexp.swpgonly, &last_uvmexp.swpgonly, "swpgonly",
122 NULL((void *)0), NULL((void *)0), NULL((void *)0) },
123 { &uvmexp.vnodeminpct, &last_uvmexp.vnodeminpct, "vnodeminpct",
124 &uvmexp.pdfreed, &last_uvmexp.pdfreed, "pdfreed",
125 NULL((void *)0), NULL((void *)0), "Swap Counters" },
126 { NULL((void *)0), NULL((void *)0), NULL((void *)0),
127 &uvmexp.pdscans, &last_uvmexp.pdscans, "pdscans",
128 &uvmexp.nswapdev, &last_uvmexp.nswapdev, "nswapdev" },
129 { NULL((void *)0), NULL((void *)0), "Misc Counters",
130 &uvmexp.pdanscan, &last_uvmexp.pdanscan, "pdanscan",
131 &uvmexp.swpages, &last_uvmexp.swpages, "swpages" },
132 { &uvmexp.fpswtch, &last_uvmexp.fpswtch, "fpswtch",
133 &uvmexp.pdobscan, &last_uvmexp.pdobscan, "pdobscan",
134 &uvmexp.swpginuse, &last_uvmexp.swpginuse, "swpginuse" },
135 { &uvmexp.kmapent, &last_uvmexp.kmapent, "kmapent",
136 &uvmexp.pdreact, &last_uvmexp.pdreact, "pdreact",
137 &uvmexp.nswget, &last_uvmexp.nswget, "nswget" },
138 { NULL((void *)0), NULL((void *)0), NULL((void *)0),
139 &uvmexp.pdbusy, &last_uvmexp.pdbusy, "pdbusy",
140 NULL((void *)0), NULL((void *)0), NULL((void *)0) },
141 { NULL((void *)0), NULL((void *)0), "Constants",
142 &uvmexp.pdpageouts, &last_uvmexp.pdpageouts, "pdpageouts",
143 NULL((void *)0), NULL((void *)0), NULL((void *)0) },
144 { &uvmexp.pagesize, &last_uvmexp.pagesize, "pagesize",
145 &uvmexp.pdpending, &last_uvmexp.pdpending, "pdpending",
146 NULL((void *)0), NULL((void *)0), NULL((void *)0) },
147 { &uvmexp.pagemask, &last_uvmexp.pagemask, "pagemask",
148 &uvmexp.pddeact, &last_uvmexp.pddeact, "pddeact",
149 NULL((void *)0), NULL((void *)0), NULL((void *)0) },
150 { &uvmexp.pageshift, &last_uvmexp.pageshift, "pageshift",
151 NULL((void *)0), NULL((void *)0), NULL((void *)0),
152 NULL((void *)0), NULL((void *)0), NULL((void *)0) }
153};
154
155field_def fields_uvm[] = {
156 {"", 5,10,1, FLD_ALIGN_RIGHT1, -1,0,0,0 },
157 {"", 18,19,1, FLD_ALIGN_LEFT0, -1,0,0,0 },
158 {"", 5,10,1, FLD_ALIGN_RIGHT1, -1,0,0,0 },
159 {"", 18,19,1, FLD_ALIGN_LEFT0, -1,0,0,0 },
160 {"", 5,10,1, FLD_ALIGN_RIGHT1, -1,0,0,0 },
161 {"", 18,19,1, FLD_ALIGN_LEFT0, -1,0,0,0 },
162};
163
164#define FLD_VALUE1(&fields_uvm[0]) FIELD_ADDR(fields_uvm, 0)(&fields_uvm[0])
165#define FLD_NAME1(&fields_uvm[1]) FIELD_ADDR(fields_uvm, 1)(&fields_uvm[1])
166#define FLD_VALUE2(&fields_uvm[2]) FIELD_ADDR(fields_uvm, 2)(&fields_uvm[2])
167#define FLD_NAME2(&fields_uvm[3]) FIELD_ADDR(fields_uvm, 3)(&fields_uvm[3])
168#define FLD_VALUE3(&fields_uvm[4]) FIELD_ADDR(fields_uvm, 4)(&fields_uvm[4])
169#define FLD_NAME3(&fields_uvm[5]) FIELD_ADDR(fields_uvm, 5)(&fields_uvm[5])
170
171/* Define views */
172field_def *view_uvm_0[] = {
173 FLD_VALUE1(&fields_uvm[0]), FLD_NAME1(&fields_uvm[1]),
174 FLD_VALUE2(&fields_uvm[2]), FLD_NAME2(&fields_uvm[3]),
175 FLD_VALUE3(&fields_uvm[4]), FLD_NAME3(&fields_uvm[5]),
176 NULL((void *)0)
177};
178
179/* Define view managers */
180struct view_manager uvm_mgr = {
181 "UVM", select_uvm, read_uvm, NULL((void *)0), print_header,
182 print_uvm, keyboard_callback, NULL((void *)0), NULL((void *)0)
183};
184
185field_view uvm_view = {
186 view_uvm_0,
187 "uvm",
188 '5',
189 &uvm_mgr
190};
191
192int
193select_uvm(void)
194{
195 return (0);
196}
197
198int
199read_uvm(void)
200{
201 static int uvmexp_mib[2] = { CTL_VM2, VM_UVMEXP4 };
202 size_t size;
203
204 num_disp = nitems(uvmline)(sizeof((uvmline)) / sizeof((uvmline)[0]));
205 memcpy(&last_uvmexp, &uvmexp, sizeof(uvmexp));
206
207 size = sizeof(uvmexp);
208 if (sysctl(uvmexp_mib, 2, &uvmexp, &size, NULL((void *)0), 0) == -1) {
209 error("Can't get VM_UVMEXP: %s\n", strerror(errno(*__errno())));
210 memset(&uvmexp, 0, sizeof(uvmexp));
211 }
212
213 return 0;
214}
215
216void
217print_uvmexp_field(field_def *fvalue, field_def *fname, int *new, int *old,
218 const char *name)
219{
220 char *uppername;
221 size_t len, i;
222
223 if (new == NULL((void *)0) && name == NULL((void *)0))
224 return;
225
226 if (new == NULL((void *)0)) {
227 print_fld_str(fvalue, "=====");
228 print_fld_str(fname, name);
229 return;
230 }
231
232 if (*new != 0)
233 print_fld_ssize(fvalue, *new);
234 if (*new == *old) {
235 print_fld_str(fname, name);
236 return;
237 }
238 len = strlen(name);
239 uppername = malloc(len + 1);
240 if (uppername == NULL((void *)0))
241 err(1, "malloc");
242 for (i = 0; i < len; i++)
243 uppername[i] = toupper(name[i]);
244 uppername[len] = '\0';
245 print_fld_str(fname, uppername);
246 free(uppername);
247}
248
249void
250print_uvm(void)
251{
252 struct uvmline *l;
253 int i, maxline;
254
255 maxline = nitems(uvmline)(sizeof((uvmline)) / sizeof((uvmline)[0]));
256 if (maxline > (dispstart + maxprint))
257 maxline = dispstart + maxprint;
Value stored to 'maxline' is never read
258
259 for (i = dispstart; i < nitems(uvmline)(sizeof((uvmline)) / sizeof((uvmline)[0])); i++) {
260 l = &uvmline[i];
261 print_uvmexp_field(FLD_VALUE1(&fields_uvm[0]), FLD_NAME1(&fields_uvm[1]), l->v1, l->ov1, l->n1);
262 print_uvmexp_field(FLD_VALUE2(&fields_uvm[2]), FLD_NAME2(&fields_uvm[3]), l->v2, l->ov2, l->n2);
263 print_uvmexp_field(FLD_VALUE3(&fields_uvm[4]), FLD_NAME3(&fields_uvm[5]), l->v3, l->ov3, l->n3);
264 end_line();
265 }
266}
267
268int
269inituvm(void)
270{
271 add_view(&uvm_view);
272 read_uvm();
273
274 return(0);
275}