Bug Summary

File:src/games/backgammon/teachgammon/../common_source/table.c
Warning:line 146, column 9
Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'

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 table.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/games/backgammon/teachgammon/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/games/backgammon/teachgammon/../common_source -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/games/backgammon/teachgammon/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/games/backgammon/teachgammon/../common_source/table.c
1/* $OpenBSD: table.c,v 1.9 2015/11/30 08:19:25 tb Exp $ */
2
3/*
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <ctype.h>
33#include "back.h"
34
35const char *const help2[] = {
36 " Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
37 "position, <f> is the finishing position, and <r> is the roll.",
38 "Remember, each die roll must be moved separately.",
39 0
40};
41
42struct state {
43 char ch;
44 int fcode;
45 int newst;
46};
47
48static const struct state atmata[] = {
49
50 {'R', 1, 0}, {'?', 7, 0}, {'Q', 0, -3}, {'B', 8, 25},
51 {'9', 2, 25}, {'8', 2, 25}, {'7', 2, 25}, {'6', 2, 25},
52 {'5', 2, 25}, {'4', 2, 25}, {'3', 2, 25}, {'2', 2, 19},
53 {'1', 2, 15}, {'0', 2, 25}, {'.', 0, 0}, {'9', 2, 25},
54 {'8', 2, 25}, {'7', 2, 25}, {'6', 2, 25}, {'5', 2, 25},
55
56 {'4', 2, 25}, {'3', 2, 25}, {'2', 2, 25}, {'1', 2, 25},
57 {'0', 2, 25}, {'/', 0, 32}, {'-', 0, 39}, {'.', 0, 0},
58 {'/', 5, 32}, {' ', 6, 3}, {',', 6, 3}, {'\n', 0, -1},
59 {'6', 3, 28}, {'5', 3, 28}, {'4', 3, 28}, {'3', 3, 28},
60 {'2', 3, 28}, {'1', 3, 28}, {'.', 0, 0}, {'H', 9, 61},
61
62 {'9', 4, 61}, {'8', 4, 61}, {'7', 4, 61}, {'6', 4, 61},
63 {'5', 4, 61}, {'4', 4, 61}, {'3', 4, 61}, {'2', 4, 53},
64 {'1', 4, 51}, {'0', 4, 61}, {'.', 0, 0}, {'9', 4, 61},
65 {'8', 4, 61}, {'7', 4, 61}, {'6', 4, 61}, {'5', 4, 61},
66 {'4', 4, 61}, {'3', 4, 61}, {'2', 4, 61}, {'1', 4, 61},
67
68 {'0', 4, 61}, {' ', 6, 3}, {',', 6, 3}, {'-', 5, 39},
69 {'\n', 0, -1}, {'.', 0, 0}
70};
71
72int
73checkmove(int ist)
74{
75 int curr, curc;
76 int j, n;
77 int c;
78
79domove:
80 getyx(stdscr, curr, curc)(curr = ((stdscr) ? (stdscr)->_cury : (-1)), curc = ((stdscr
) ? (stdscr)->_curx : (-1)))
;
81 if (ist == 0)
82 mvprintw(curr, 32, "Move: ");
83 ist = mvl = ncin = 0;
84 for (j = 0; j < 5; j++)
85 p[j] = g[j] = -1;
86
87dochar:
88 c = readc();
89
90 if (c == 'S') {
91 raflag = 0;
92 save(1);
93 move(cturn == -1 ? 18 : 19, 39)wmove(stdscr,cturn == -1 ? 18 : 19,39);
94 ist = -1;
95 goto domove;
96 }
97 if ((c == KEY_BACKSPACE0407 || c == 0177) && ncin > 0) {
98 getyx(stdscr, curr, curc)(curr = ((stdscr) ? (stdscr)->_cury : (-1)), curc = ((stdscr
) ? (stdscr)->_curx : (-1)))
;
99 move(curr, curc - 1)wmove(stdscr,curr,curc - 1);
100 ncin--;
101 n = rsetbrd();
102 if (n == 0) {
103 n = -1;
104 refresh()wrefresh(stdscr);
105 }
106 if ((ist = n) > 0)
107 goto dochar;
108 getyx(stdscr, curr, curc)(curr = ((stdscr) ? (stdscr)->_cury : (-1)), curc = ((stdscr
) ? (stdscr)->_curx : (-1)))
;
109 move(curr, 39)wmove(stdscr,curr,39);
110 clrtoeol()wclrtoeol(stdscr);
111 goto domove;
112 } else if (c == KEY_DL0510 && ncin > 0) {
113 getyx(stdscr, curr, curc)(curr = ((stdscr) ? (stdscr)->_cury : (-1)), curc = ((stdscr
) ? (stdscr)->_curx : (-1)))
;
114 move(curr, 39)wmove(stdscr,curr,39);
115 clrtoeol()wclrtoeol(stdscr);
116 ist = -1;
117 refresh()wrefresh(stdscr);
118 goto domove;
119 }
120 if (!isascii(c) || (ncin >= CIN_SIZE40 - 1)) {
121 beep();
122 goto domove;
123 }
124 n = dotable(c, ist);
125 if (n >= 0) {
126 cin[ncin++] = c;
127 if (n > 2)
128 if (c != '\n')
129 addch(c)waddch(stdscr,c);
130 ist = n;
131 if (n)
132 goto dochar;
133 else
134 goto domove;
135 }
136 if (n == -1 && mvl >= mvlim)
137 return(0);
138 if (n == -1 && mvl < mvlim-1)
139 return(-4);
140 if (n == -6) {
141 if (movokay(mvl + 1)) {
142 moveplayers();
143 movback(mvl + 1);
144 } else
145 move(cturn == -1 ? 18 : 19, ncin + 39)wmove(stdscr,cturn == -1 ? 18 : 19,ncin + 39);
146 ist = n = rsetbrd();
Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
147 goto dochar;
148 }
149 if (n != -5)
150 return(n);
151 beep();
152 goto dochar;
153}
154
155int
156dotable(char c, int i)
157{
158 int a;
159 int test;
160
161 test = (c == 'R');
162
163 while ((a = atmata[i].ch) != '.') {
164 if (a == c || (test && a == '\n')) {
165 switch (atmata[i].fcode) {
166 case 1:
167 wrboard();
168 move(cturn == -1 ? 18 : 19, 0)wmove(stdscr,cturn == -1 ? 18 : 19,0);
169 proll();
170 addstr("\t\t")waddnstr(stdscr,"\t\t",-1);
171 break;
172
173 case 2:
174 if (p[mvl] == -1)
175 p[mvl] = c - '0';
176 else
177 p[mvl] = p[mvl] * 10 + c - '0';
178 break;
179
180 case 3:
181 if (g[mvl] != -1) {
182 if (mvl < mvlim)
183 mvl++;
184 p[mvl] = p[mvl - 1];
185 }
186 g[mvl] = p[mvl] + cturn * (c - '0');
187 if (g[mvl] < 0)
188 g[mvl] = 0;
189 if (g[mvl] > 25)
190 g[mvl] = 25;
191 break;
192
193 case 4:
194 if (g[mvl] == -1)
195 g[mvl] = c - '0';
196 else
197 g[mvl] = g[mvl] * 10 + c - '0';
198 break;
199
200 case 5:
201 if (mvl < mvlim)
202 mvl++;
203 p[mvl] = g[mvl - 1];
204 break;
205
206 case 6:
207 if (mvl < mvlim)
208 mvl++;
209 break;
210
211 case 7:
212 move(20, 0)wmove(stdscr,20,0);
213 text(help2);
214 move(cturn == -1 ? 18 : 19, 39)wmove(stdscr,cturn == -1 ? 18 : 19,39);
215 break;
216
217 case 8:
218 p[mvl] = bar;
219 break;
220
221 case 9:
222 g[mvl] = home;
223 }
224
225 if (!test || a != '\n')
226 return(atmata[i].newst);
227 else
228 return(-6);
229 }
230 i++;
231 }
232 return (-5);
233}
234
235int
236rsetbrd(void)
237{
238 int i, j, n;
239
240 n = 0;
241 mvl = 0;
242 for (i = 0; i < 4; i++)
243 p[i] = g[i] = -1;
244 for (j = 0; j < ncin; j++)
245 if ((n = dotable(cin[j], n)) < 0)
246 return (n);
247 return(n);
248}