Bug Summary

File:src/usr.bin/lastcomm/lastcomm.c
Warning:line 84, column 2
Value stored to 'argc' 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 lastcomm.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/lastcomm/obj -resource-dir /usr/local/lib/clang/13.0.0 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/lastcomm/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/lastcomm/lastcomm.c
1/* $OpenBSD: lastcomm.c,v 1.30 2021/12/13 16:37:37 deraadt Exp $ */
2/* $NetBSD: lastcomm.c,v 1.9 1995/10/22 01:43:42 ghudson Exp $ */
3
4/*
5 * Copyright (c) 1980, 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/types.h>
34#include <sys/stat.h>
35#include <sys/acct.h>
36
37#include <ctype.h>
38#include <err.h>
39#include <fcntl.h>
40#include <math.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44#include <unistd.h>
45#include <utmp.h>
46#include <pwd.h>
47#include "pathnames.h"
48
49time_t expand(u_int);
50char *flagbits(int);
51char *getdev(dev_t);
52int requested(char *[], struct acct *);
53void usage(void);
54
55#define SECSPERMIN(60) (60)
56#define SECSPERHOUR(60 * 60) (60 * 60)
57
58int
59main(int argc, char *argv[])
60{
61 char *p;
62 struct acct ab;
63 struct stat sb;
64 FILE *fp;
65 off_t size;
66 time_t t;
67 double delta;
68 int ch;
69 char *acctfile;
70
71 if (pledge("stdio rpath getpw", NULL((void *)0)) == -1)
72 err(1, "pledge");
73
74 acctfile = _PATH_ACCT"/var/account/acct";
75 while ((ch = getopt(argc, argv, "f:")) != -1)
76 switch(ch) {
77 case 'f':
78 acctfile = optarg;
79 break;
80 case '?':
81 default:
82 usage();
83 }
84 argc -= optind;
Value stored to 'argc' is never read
85 argv += optind;
86
87 /* Open the file. */
88 if ((fp = fopen(acctfile, "r")) == NULL((void *)0) || fstat(fileno(fp)(!__isthreaded ? ((fp)->_file) : (fileno)(fp)), &sb))
89 err(1, "%s", acctfile);
90
91 /*
92 * Round off to integral number of accounting records, probably
93 * not necessary, but it doesn't hurt.
94 */
95 size = sb.st_size - sb.st_size % sizeof(struct acct);
96
97 /* Check if any records to display. */
98 if (size < sizeof(struct acct))
99 exit(0);
100
101 /*
102 * Seek to before the last entry in the file; use lseek(2) in case
103 * the file is bigger than a "long".
104 */
105 size -= sizeof(struct acct);
106 if (lseek(fileno(fp)(!__isthreaded ? ((fp)->_file) : (fileno)(fp)), size, SEEK_SET0) == -1)
107 err(1, "%s", acctfile);
108
109 for (;;) {
110 if (fread(&ab, sizeof(struct acct), 1, fp) != 1)
111 err(1, "%s", acctfile);
112
113 if (ab.ac_comm[0] == '\0') {
114 ab.ac_comm[0] = '?';
115 ab.ac_comm[1] = '\0';
116 } else
117 for (p = &ab.ac_comm[0];
118 p < &ab.ac_comm[sizeof ab.ac_comm] && *p; ++p)
119 if (!isprint((unsigned char)*p))
120 *p = '?';
121 if (!*argv || requested(argv, &ab)) {
122 t = expand(ab.ac_utime) + expand(ab.ac_stime);
123 (void)printf("%-*.*s %-7s %-*.*s %-*.*s %6.2f secs %.16s",
124 (int)sizeof ab.ac_comm,
125 (int)sizeof ab.ac_comm,
126 ab.ac_comm, flagbits(ab.ac_flag), UT_NAMESIZE32,
127 UT_NAMESIZE32, user_from_uid(ab.ac_uid, 0),
128 UT_LINESIZE8, UT_LINESIZE8, getdev(ab.ac_tty),
129 t / (double)AHZ64, ctime(&ab.ac_btime));
130 delta = expand(ab.ac_etime) / (double)AHZ64;
131 printf(" (%1.0f:%02.0f:%05.2f)\n",
132 delta / SECSPERHOUR(60 * 60),
133 fmod(delta, (double)SECSPERHOUR(60 * 60)) / SECSPERMIN(60),
134 fmod(delta, (double)SECSPERMIN(60)));
135 }
136
137 if (size == 0)
138 break;
139 /* seek to previous entry */
140 if (fseek(fp, 2 * -(long)sizeof(struct acct), SEEK_CUR1) == -1)
141 err(1, "%s", acctfile);
142 size -= sizeof(struct acct);
143 }
144 exit(0);
145}
146
147time_t
148expand(u_int t)
149{
150 time_t nt;
151
152 nt = t & 017777;
153 t >>= 13;
154 while (t) {
155 t--;
156 nt <<= 3;
157 }
158 return (nt);
159}
160
161char *
162flagbits(int f)
163{
164 static char flags[20] = "-";
165 char *p;
166
167#define BIT(flag, ch)if (f & flag) *p++ = ch if (f & flag) *p++ = ch
168
169 p = flags + 1;
170 BIT(AFORK, 'F')if (f & 0x01) *p++ = 'F';
171 BIT(AMAP, 'M')if (f & 0x04) *p++ = 'M';
172 BIT(ACORE, 'D')if (f & 0x08) *p++ = 'D';
173 BIT(AXSIG, 'X')if (f & 0x10) *p++ = 'X';
174 BIT(APLEDGE, 'P')if (f & 0x20) *p++ = 'P';
175 BIT(ATRAP, 'T')if (f & 0x40) *p++ = 'T';
176 BIT(AUNVEIL, 'U')if (f & 0x80) *p++ = 'U';
177 *p = '\0';
178 return (flags);
179}
180
181int
182requested(char *argv[], struct acct *acp)
183{
184 do {
185 if (!strcmp(user_from_uid(acp->ac_uid, 0), *argv))
186 return (1);
187 if (!strcmp(getdev(acp->ac_tty), *argv))
188 return (1);
189 if (!strncmp(acp->ac_comm, *argv, sizeof acp->ac_comm))
190 return (1);
191 } while (*++argv);
192 return (0);
193}
194
195char *
196getdev(dev_t dev)
197{
198 static dev_t lastdev = (dev_t)-1;
199 static char *lastname;
200
201 if (dev == -1) /* Special case. */
202 return ("__");
203 if (dev == lastdev) /* One-element cache. */
204 return (lastname);
205 lastdev = dev;
206 if ((lastname = devname(dev, S_IFCHR0020000)) == NULL((void *)0))
207 lastname = "??";
208 return (lastname);
209}
210
211void
212usage(void)
213{
214 (void)fprintf(stderr(&__sF[2]),
215 "usage: lastcomm [-f file] [command ...] [user ...] [terminal ...]\n");
216 exit(1);
217}