Bug Summary

File:soltools/mkdepend/pr.c
Location:line 94, column 30
Description:Array access (via field 'i_list') results in a null pointer dereference

Annotated Source Code

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* $XConsortium: pr.c,v 1.17 94/04/17 20:10:38 gildea Exp $ */
3/*
4
5Copyright (c) 1993, 1994 X Consortium
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in
15all copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
24Except as contained in this notice, the name of the X Consortium shall not be
25used in advertising or otherwise to promote the sale, use or other dealings
26in this Software without prior written authorization from the X Consortium.
27
28*/
29
30#include "def.h"
31#include <string.h>
32size_t pr( struct inclist *ip, char *file,char *base);
33
34extern struct inclist inclist[ MAXFILES65536 ],
35 *inclistp;
36extern char *objprefix;
37extern char *objsuffix;
38extern int width;
39extern boolean printed;
40extern boolean verbose;
41extern boolean show_where_not;
42
43void add_include(struct filepointer *filep, struct inclist *file, struct inclist *file_red, char *include, boolean dot, boolean failOK, struct IncludesCollection* incCollection, struct symhash *symbols)
44{
45 register struct inclist *newfile;
46 register struct filepointer *content;
47
48 /*
49 * First decide what the pathname of this include file really is.
50 */
51 newfile = inc_path(file->i_file, include, dot, incCollection);
52 if (newfile == NULL((void*)0)) {
53 if (failOK)
54 return;
55 if (file != file_red)
56 warning("%s (reading %s, line %d): ",
57 file_red->i_file, file->i_file, filep->f_line);
58 else
59 warning("%s, line %d: ", file->i_file, filep->f_line);
60 warning1("cannot find include file \"%s\"\n", include);
61 show_where_not = TRUE1;
62 newfile = inc_path(file->i_file, include, dot, incCollection);
63 show_where_not = FALSE0;
64 }
65
66 if (newfile) {
67
68 /* Only add new dependency files if they don't have "/usr/include" in them. */
69 if (!(newfile && newfile->i_file && strstr(newfile->i_file, "/usr/"))) {
70 included_by(file, newfile);
71 }
72
73 if (!newfile->i_searched) {
74 newfile->i_searched = TRUE1;
75 content = getfile(newfile->i_file);
76 find_includes(content, newfile, file_red, 0, failOK, incCollection, symbols);
77 freefile(content);
78 }
79 }
80}
81
82void recursive_pr_include(head, file, base)
83 register struct inclist *head;
84 register char *file, *base;
85{
86 register int i;
87
88 if (head->i_marked)
1
Taking false branch
8
Taking false branch
12
Taking false branch
89 return;
90 head->i_marked = TRUE1;
91 if (head->i_file != file)
2
Taking false branch
9
Taking false branch
13
Taking true branch
92 pr(head, file, base);
93 for (i=0; i<head->i_listlen; i++)
3
Loop condition is true. Entering loop body
4
Loop condition is true. Entering loop body
5
Loop condition is true. Entering loop body
6
Loop condition is true. Entering loop body
10
Loop condition is true. Entering loop body
14
Loop condition is true. Entering loop body
94 recursive_pr_include(head->i_list[ i ], file, base);
7
Calling 'recursive_pr_include'
11
Calling 'recursive_pr_include'
15
Array access (via field 'i_list') results in a null pointer dereference
95}
96
97size_t pr(ip, file, base)
98 register struct inclist *ip;
99 char *file, *base;
100{
101 size_t ret;
102 static char *lastfile;
103 static int current_len;
104 register int len, i;
105 char buf[ BUFSIZ8192 ];
106
107 printed = TRUE1;
108 len = (int)strlen(ip->i_file)+1;
109 if (current_len + len > width || file != lastfile) {
110 lastfile = file;
111 sprintf(buf, "\n%s%s%s: %s", objprefix, base, objsuffix,
112 ip->i_file);
113 len = current_len = (int)strlen(buf);
114 }
115 else {
116 buf[0] = ' ';
117 strcpy(buf+1, ip->i_file);
118 current_len += len;
119 }
120 ret = fwrite(buf, len, 1, stdoutstdout);
121
122 /*
123 * If verbose is set, then print out what this file includes.
124 */
125 if (! verbose || ip->i_list == NULL((void*)0) || ip->i_notified)
126 return ret;
127 ip->i_notified = TRUE1;
128 lastfile = NULL((void*)0);
129 printf("\n# %s includes:", ip->i_file);
130 for (i=0; i<ip->i_listlen; i++)
131 printf("\n#\t%s", ip->i_list[ i ]->i_incstring);
132 return ret;
133}
134
135/* vim:set shiftwidth=4 softtabstop=4 expandtab: */