Bug Summary

File:src/usr.bin/banner/banner.c
Warning:line 135, column 18
The left operand of '==' is a garbage value

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 banner.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/banner/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/banner/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/banner/banner.c
1/* $OpenBSD: banner.c,v 1.13 2017/05/27 07:55:44 tedu Exp $ */
2/* $NetBSD: banner.c,v 1.2 1995/04/09 06:00:15 cgd Exp $ */
3
4/*
5 * Changes for banner(1)
6 *
7 * @(#)Copyright (c) 1995, Simon J. Gerraty.
8 *
9 * This is free software. It comes with NO WARRANTY.
10 * Permission to use, modify and distribute this source code
11 * is granted subject to the following conditions.
12 * 1/ that the above copyright notice and this notice
13 * are preserved in all copies and that due credit be given
14 * to the author.
15 * 2/ that any changes to this code are clearly commented
16 * as such so that the author does not get blamed for bugs
17 * other than his own.
18 *
19 * Please send copies of changes and bug-fixes to:
20 * sjg@zen.void.oz.au
21 */
22
23/*
24 * Copyright (c) 1983, 1993
25 * The Regents of the University of California. All rights reserved.
26 *
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions
29 * are met:
30 * 1. Redistributions of source code must retain the above copyright
31 * notice, this list of conditions and the following disclaimer.
32 * 2. Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in the
34 * documentation and/or other materials provided with the distribution.
35 * 3. Neither the name of the University nor the names of its contributors
36 * may be used to endorse or promote products derived from this software
37 * without specific prior written permission.
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
40 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
43 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
44 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
45 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
47 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
48 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
49 * SUCH DAMAGE.
50 */
51
52#include <stdio.h>
53#include <unistd.h>
54#include <stdlib.h>
55#include <string.h>
56#include <err.h>
57
58#include "banner.h"
59
60static long PW = LINELEN132;
61
62/* the char gen code below is lifted from lpd */
63
64static char *
65scnline(int key, char *p, int c)
66{
67 int scnwidth;
68
69 /*
70 * <sjg> lpd makes chars out of the letter in question.
71 * the results are somewhat mixed. Sticking to '#' as
72 * banner(1) does is more consistent.
73 */
74 c = '#';
75
76 for (scnwidth = WIDTH8; --scnwidth;) {
77 key <<= 1;
78 *p++ = key & 0200 ? c : BACKGND' ';
79 }
80 return (p);
81}
82
83#define TRC(q)(((q)-' ')&0177) (((q)-' ')&0177)
84
85
86static int
87dropit(int c)
88{
89 switch(c) {
90
91 case TRC('_')((('_')-' ')&0177):
92 case TRC(';')(((';')-' ')&0177):
93 case TRC(',')(((',')-' ')&0177):
94 case TRC('g')((('g')-' ')&0177):
95 case TRC('j')((('j')-' ')&0177):
96 case TRC('p')((('p')-' ')&0177):
97 case TRC('q')((('q')-' ')&0177):
98 case TRC('y')((('y')-' ')&0177):
99 return (DROP0);
100
101 default:
102 return (0);
103 }
104}
105
106static void
107scan_out(int scfd, char *scsp, int dlm)
108{
109 char *strp;
110 int nchrs, j;
111 char outbuf[LINELEN132+1], *sp, c, cc;
112 int d, scnhgt;
113 extern char scnkey[][HEIGHT8]; /* in lpdchar.c */
114
115 for (scnhgt = 0; scnhgt++ < HEIGHT8+DROP0; ) {
5
Loop condition is true. Entering loop body
116 strp = &outbuf[0];
117 sp = scsp;
118 for (nchrs = 0; *sp != dlm && *sp != '\0'; ) {
6
Assuming the condition is false
119 cc = *sp++;
120 if ((unsigned char)cc < ' ' ||
121 (unsigned char)cc > 0x7f)
122 cc = INVALID'_';
123
124 c = TRC(cc)(((cc)-' ')&0177);
125 d = dropit(c);
126 if ((!d && scnhgt > HEIGHT8) || (scnhgt <= DROP0 && d))
127 for (j = WIDTH8; --j;)
128 *strp++ = BACKGND' ';
129 else
130 strp = scnline(scnkey[(int)c][scnhgt-1-d], strp, cc);
131 if (nchrs++ >= PW/(WIDTH8+1)-1)
132 break;
133 *strp++ = BACKGND' ';
134 }
135 while (*--strp == BACKGND' ' && strp >= outbuf)
7
The left operand of '==' is a garbage value
136 ;
137 strp++;
138 *strp++ = '\n';
139 (void) write(scfd, outbuf, strp-outbuf);
140 }
141}
142
143/*
144 * for each word, print up to 10 chars in big letters.
145 */
146int
147main(int argc, char *argv[])
148{
149 char word[10+1]; /* strings limited to 10 chars */
150
151 if (pledge("stdio", NULL((void *)0)) == -1)
1
Assuming the condition is false
2
Taking false branch
152 err(1, "pledge");
153
154 while (*++argv) {
3
Loop condition is true. Entering loop body
155 (void)strlcpy(word, *argv, sizeof (word));
156 scan_out(1, word, '\0');
4
Calling 'scan_out'
157 }
158 exit(0);
159}