Bug Summary

File:src/gnu/usr.bin/binutils/gdb/scm-exp.c
Warning:line 403, column 14
Although the value stored to 'c' is used in the enclosing expression, the value is never actually read from 'c'

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 scm-exp.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/gnu/usr.bin/binutils/obj/gdb -resource-dir /usr/local/lib/clang/13.0.0 -D PIE_DEFAULT=1 -I . -I /usr/src/gnu/usr.bin/binutils/gdb -I /usr/src/gnu/usr.bin/binutils/gdb/config -D LOCALEDIR="/usr/share/locale" -D HAVE_CONFIG_H -I /usr/src/gnu/usr.bin/binutils/gdb/../include/opcode -I ../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../include -I ../intl -I /usr/src/gnu/usr.bin/binutils/gdb/../intl -D MI_OUT=1 -D TUI=1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/gnu/usr.bin/binutils/obj/gdb -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -fcommon -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/gnu/usr.bin/binutils/gdb/scm-exp.c
1/* Scheme/Guile language support routines for GDB, the GNU debugger.
2
3 Copyright 1995, 1996, 2000, 2003 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include "defs.h"
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "parser-defs.h"
27#include "language.h"
28#include "value.h"
29#include "c-lang.h"
30#include "scm-lang.h"
31#include "scm-tags.h"
32
33#define USE_EXPRSTRING0 0
34
35static void scm_lreadparen (int);
36static int scm_skip_ws (void);
37static void scm_read_token (int, int);
38static LONGESTlong scm_istring2number (char *, int, int);
39static LONGESTlong scm_istr2int (char *, int, int);
40static void scm_lreadr (int);
41
42static LONGESTlong
43scm_istr2int (char *str, int len, int radix)
44{
45 int i = 0;
46 LONGESTlong inum = 0;
47 int c;
48 int sign = 0;
49
50 if (0 >= len)
51 return SCM_BOOL_F(((16 +0)<<9)+0x174L); /* zero scm_length */
52 switch (str[0])
53 { /* leading sign */
54 case '-':
55 case '+':
56 sign = str[0];
57 if (++i == len)
58 return SCM_BOOL_F(((16 +0)<<9)+0x174L); /* bad if lone `+' or `-' */
59 }
60 do
61 {
62 switch (c = str[i++])
63 {
64 case '0':
65 case '1':
66 case '2':
67 case '3':
68 case '4':
69 case '5':
70 case '6':
71 case '7':
72 case '8':
73 case '9':
74 c = c - '0';
75 goto accumulate;
76 case 'A':
77 case 'B':
78 case 'C':
79 case 'D':
80 case 'E':
81 case 'F':
82 c = c - 'A' + 10;
83 goto accumulate;
84 case 'a':
85 case 'b':
86 case 'c':
87 case 'd':
88 case 'e':
89 case 'f':
90 c = c - 'a' + 10;
91 accumulate:
92 if (c >= radix)
93 return SCM_BOOL_F(((16 +0)<<9)+0x174L); /* bad digit for radix */
94 inum *= radix;
95 inum += c;
96 break;
97 default:
98 return SCM_BOOL_F(((16 +0)<<9)+0x174L); /* not a digit */
99 }
100 }
101 while (i < len);
102 if (sign == '-')
103 inum = -inum;
104 return SCM_MAKINUM (inum)(((inum)<<2)+2L);
105}
106
107static LONGESTlong
108scm_istring2number (char *str, int len, int radix)
109{
110 int i = 0;
111 char ex = 0;
112 char ex_p = 0, rx_p = 0; /* Only allow 1 exactness and 1 radix prefix */
113#if 0
114 SCM res;
115#endif
116 if (len == 1)
117 if (*str == '+' || *str == '-') /* Catches lone `+' and `-' for speed */
118 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
119
120 while ((len - i) >= 2 && str[i] == '#' && ++i)
121 switch (str[i++])
122 {
123 case 'b':
124 case 'B':
125 if (rx_p++)
126 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
127 radix = 2;
128 break;
129 case 'o':
130 case 'O':
131 if (rx_p++)
132 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
133 radix = 8;
134 break;
135 case 'd':
136 case 'D':
137 if (rx_p++)
138 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
139 radix = 10;
140 break;
141 case 'x':
142 case 'X':
143 if (rx_p++)
144 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
145 radix = 16;
146 break;
147 case 'i':
148 case 'I':
149 if (ex_p++)
150 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
151 ex = 2;
152 break;
153 case 'e':
154 case 'E':
155 if (ex_p++)
156 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
157 ex = 1;
158 break;
159 default:
160 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
161 }
162
163 switch (ex)
164 {
165 case 1:
166 return scm_istr2int (&str[i], len - i, radix);
167 case 0:
168 return scm_istr2int (&str[i], len - i, radix);
169#if 0
170 if NFALSEP
171 (res) return res;
172#ifdef FLOATS
173 case 2:
174 return scm_istr2flo (&str[i], len - i, radix);
175#endif
176#endif
177 }
178 return SCM_BOOL_F(((16 +0)<<9)+0x174L);
179}
180
181static void
182scm_read_token (int c, int weird)
183{
184 while (1)
185 {
186 c = *lexptr++;
187 switch (c)
188 {
189 case '[':
190 case ']':
191 case '(':
192 case ')':
193 case '\"':
194 case ';':
195 case ' ':
196 case '\t':
197 case '\r':
198 case '\f':
199 case '\n':
200 if (weird)
201 goto default_case;
202 case '\0': /* End of line */
203 eof_case:
204 --lexptr;
205 return;
206 case '\\':
207 if (!weird)
208 goto default_case;
209 else
210 {
211 c = *lexptr++;
212 if (c == '\0')
213 goto eof_case;
214 else
215 goto default_case;
216 }
217 case '}':
218 if (!weird)
219 goto default_case;
220
221 c = *lexptr++;
222 if (c == '#')
223 return;
224 else
225 {
226 --lexptr;
227 c = '}';
228 goto default_case;
229 }
230
231 default:
232 default_case:
233 ;
234 }
235 }
236}
237
238static int
239scm_skip_ws (void)
240{
241 int c;
242 while (1)
243 switch ((c = *lexptr++))
244 {
245 case '\0':
246 goteof:
247 return c;
248 case ';':
249 lp:
250 switch ((c = *lexptr++))
251 {
252 case '\0':
253 goto goteof;
254 default:
255 goto lp;
256 case '\n':
257 break;
258 }
259 case ' ':
260 case '\t':
261 case '\r':
262 case '\f':
263 case '\n':
264 break;
265 default:
266 return c;
267 }
268}
269
270static void
271scm_lreadparen (int skipping)
272{
273 for (;;)
274 {
275 int c = scm_skip_ws ();
276 if (')' == c || ']' == c)
277 return;
278 --lexptr;
279 if (c == '\0')
280 error ("missing close paren");
281 scm_lreadr (skipping);
282 }
283}
284
285static void
286scm_lreadr (int skipping)
287{
288 int c, j;
289 struct stoken str;
290 LONGESTlong svalue = 0;
291tryagain:
292 c = *lexptr++;
293 switch (c)
294 {
295 case '\0':
296 lexptr--;
297 return;
298 case '[':
299 case '(':
300 scm_lreadparen (skipping);
301 return;
302 case ']':
303 case ')':
304 error ("unexpected #\\%c", c);
305 goto tryagain;
306 case '\'':
307 case '`':
308 str.ptr = lexptr - 1;
309 scm_lreadr (skipping);
310 if (!skipping)
311 {
312 struct value *val = scm_evaluate_string (str.ptr, lexptr - str.ptr);
313 if (!is_scmvalue_type (VALUE_TYPE (val)(val)->type))
314 error ("quoted scm form yields non-SCM value");
315 svalue = extract_signed_integer (VALUE_CONTENTS (val)((void)((val)->lazy && value_fetch_lazy(val)), ((char
*) (val)->aligner.contents + (val)->embedded_offset))
,
316 TYPE_LENGTH (VALUE_TYPE (val))((val)->type)->length);
317 goto handle_immediate;
318 }
319 return;
320 case ',':
321 c = *lexptr++;
322 if ('@' != c)
323 lexptr--;
324 scm_lreadr (skipping);
325 return;
326 case '#':
327 c = *lexptr++;
328 switch (c)
329 {
330 case '[':
331 case '(':
332 scm_lreadparen (skipping);
333 return;
334 case 't':
335 case 'T':
336 svalue = SCM_BOOL_T(((16 +1)<<9)+0x174L);
337 goto handle_immediate;
338 case 'f':
339 case 'F':
340 svalue = SCM_BOOL_F(((16 +0)<<9)+0x174L);
341 goto handle_immediate;
342 case 'b':
343 case 'B':
344 case 'o':
345 case 'O':
346 case 'd':
347 case 'D':
348 case 'x':
349 case 'X':
350 case 'i':
351 case 'I':
352 case 'e':
353 case 'E':
354 lexptr--;
355 c = '#';
356 goto num;
357 case '*': /* bitvector */
358 scm_read_token (c, 0);
359 return;
360 case '{':
361 scm_read_token (c, 1);
362 return;
363 case '\\': /* character */
364 c = *lexptr++;
365 scm_read_token (c, 0);
366 return;
367 case '|':
368 j = 1; /* here j is the comment nesting depth */
369 lp:
370 c = *lexptr++;
371 lpc:
372 switch (c)
373 {
374 case '\0':
375 error ("unbalanced comment");
376 default:
377 goto lp;
378 case '|':
379 if ('#' != (c = *lexptr++))
380 goto lpc;
381 if (--j)
382 goto lp;
383 break;
384 case '#':
385 if ('|' != (c = *lexptr++))
386 goto lpc;
387 ++j;
388 goto lp;
389 }
390 goto tryagain;
391 case '.':
392 default:
393#if 0
394 callshrp:
395#endif
396 scm_lreadr (skipping);
397 return;
398 }
399 case '\"':
400 while ('\"' != (c = *lexptr++))
401 {
402 if (c == '\\')
403 switch (c = *lexptr++)
Although the value stored to 'c' is used in the enclosing expression, the value is never actually read from 'c'
404 {
405 case '\0':
406 error ("non-terminated string literal");
407 case '\n':
408 continue;
409 case '0':
410 case 'f':
411 case 'n':
412 case 'r':
413 case 't':
414 case 'a':
415 case 'v':
416 break;
417 }
418 }
419 return;
420 case '0':
421 case '1':
422 case '2':
423 case '3':
424 case '4':
425 case '5':
426 case '6':
427 case '7':
428 case '8':
429 case '9':
430 case '.':
431 case '-':
432 case '+':
433 num:
434 {
435 str.ptr = lexptr - 1;
436 scm_read_token (c, 0);
437 if (!skipping)
438 {
439 svalue = scm_istring2number (str.ptr, lexptr - str.ptr, 10);
440 if (svalue != SCM_BOOL_F(((16 +0)<<9)+0x174L))
441 goto handle_immediate;
442 goto tok;
443 }
444 }
445 return;
446 case ':':
447 scm_read_token ('-', 0);
448 return;
449#if 0
450 do_symbol:
451#endif
452 default:
453 str.ptr = lexptr - 1;
454 scm_read_token (c, 0);
455 tok:
456 if (!skipping)
457 {
458 str.length = lexptr - str.ptr;
459 if (str.ptr[0] == '$')
460 {
461 write_dollar_variable (str);
462 return;
463 }
464 write_exp_elt_opcode (OP_NAME);
465 write_exp_string (str);
466 write_exp_elt_opcode (OP_NAME);
467 }
468 return;
469 }
470handle_immediate:
471 if (!skipping)
472 {
473 write_exp_elt_opcode (OP_LONG);
474 write_exp_elt_type (builtin_type_scm);
475 write_exp_elt_longcst (svalue);
476 write_exp_elt_opcode (OP_LONG);
477 }
478}
479
480int
481scm_parse (void)
482{
483 char *start;
484 while (*lexptr == ' ')
485 lexptr++;
486 start = lexptr;
487 scm_lreadr (USE_EXPRSTRING0);
488#if USE_EXPRSTRING0
489 str.length = lexptr - start;
490 str.ptr = start;
491 write_exp_elt_opcode (OP_EXPRSTRING);
492 write_exp_string (str);
493 write_exp_elt_opcode (OP_EXPRSTRING);
494#endif
495 return 0;
496}