File: stream-note.c

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-11
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,418,840 kB
  • sloc: cpp: 5,290,826; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,898; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,913; xml: 953; cs: 573; fortran: 539
file content (147 lines) | stat: -rw-r--r-- 5,447 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.unix.Stream -analyzer-output text -verify %s

#include "Inputs/system-header-simulator.h"

void check_note_at_correct_open() {
  FILE *F1 = tmpfile(); // expected-note {{Stream opened here}}
  if (!F1)
    // expected-note@-1 {{'F1' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    return;
  FILE *F2 = tmpfile();
  if (!F2) {
    // expected-note@-1 {{'F2' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    fclose(F1);
    return;
  }
  rewind(F2);
  fclose(F2);
  rewind(F1);
}
// expected-warning@-1 {{Opened stream never closed. Potential resource leak}}
// expected-note@-2 {{Opened stream never closed. Potential resource leak}}

void check_note_fopen() {
  FILE *F = fopen("file", "r"); // expected-note {{Stream opened here}}
  if (!F)
    // expected-note@-1 {{'F' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    return;
}
// expected-warning@-1 {{Opened stream never closed. Potential resource leak}}
// expected-note@-2 {{Opened stream never closed. Potential resource leak}}

void check_note_freopen() {
  FILE *F = fopen("file", "r"); // expected-note {{Stream opened here}}
  if (!F)
    // expected-note@-1 {{'F' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    return;
  F = freopen(0, "w", F); // expected-note {{Stream reopened here}}
  if (!F)
    // expected-note@-1 {{'F' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    return;
}
// expected-warning@-1 {{Opened stream never closed. Potential resource leak}}
// expected-note@-2 {{Opened stream never closed. Potential resource leak}}

void check_note_leak_2(int c) {
  FILE *F1 = fopen("foo1.c", "r"); // expected-note {{Stream opened here}}
  if (!F1)
    // expected-note@-1 {{'F1' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    // expected-note@-3 {{'F1' is non-null}}
    // expected-note@-4 {{Taking false branch}}
    return;
  FILE *F2 = fopen("foo2.c", "r"); // expected-note {{Stream opened here}}
  if (!F2) {
    // expected-note@-1 {{'F2' is non-null}}
    // expected-note@-2 {{Taking false branch}}
    // expected-note@-3 {{'F2' is non-null}}
    // expected-note@-4 {{Taking false branch}}
    fclose(F1);
    return;
  }
  if (c)
    // expected-note@-1 {{Assuming 'c' is not equal to 0}}
    // expected-note@-2 {{Taking true branch}}
    // expected-note@-3 {{Assuming 'c' is not equal to 0}}
    // expected-note@-4 {{Taking true branch}}
    return;
  // expected-warning@-1 {{Opened stream never closed. Potential resource leak}}
  // expected-note@-2 {{Opened stream never closed. Potential resource leak}}
  // expected-warning@-3 {{Opened stream never closed. Potential resource leak}}
  // expected-note@-4 {{Opened stream never closed. Potential resource leak}}
  fclose(F1);
  fclose(F2);
}

void check_track_null() {
  FILE *F;
  F = fopen("foo1.c", "r"); // expected-note {{Value assigned to 'F'}} expected-note {{Assuming pointer value is null}}
  if (F != NULL) {          // expected-note {{Taking false branch}} expected-note {{'F' is equal to NULL}}
    fclose(F);
    return;
  }
  fclose(F); // expected-warning {{Stream pointer might be NULL}}
  // expected-note@-1 {{Stream pointer might be NULL}}
}

void check_eof_notes_feof_after_feof() {
  FILE *F;
  char Buf[10];
  F = fopen("foo1.c", "r");
  if (F == NULL) { // expected-note {{Taking false branch}} expected-note {{'F' is not equal to NULL}}
    return;
  }
  fread(Buf, 1, 1, F);
  if (feof(F)) { // expected-note {{Taking true branch}}
    clearerr(F);
    fread(Buf, 1, 1, F);   // expected-note {{Assuming stream reaches end-of-file here}}
    if (feof(F)) {         // expected-note {{Taking true branch}}
      fread(Buf, 1, 1, F); // expected-warning {{Read function called when stream is in EOF state. Function has no effect}}
      // expected-note@-1 {{Read function called when stream is in EOF state. Function has no effect}}
    }
  }
  fclose(F);
}

void check_eof_notes_feof_after_no_feof() {
  FILE *F;
  char Buf[10];
  F = fopen("foo1.c", "r");
  if (F == NULL) { // expected-note {{Taking false branch}} expected-note {{'F' is not equal to NULL}}
    return;
  }
  fread(Buf, 1, 1, F);
  if (feof(F)) { // expected-note {{Taking false branch}}
    fclose(F);
    return;
  } else if (ferror(F)) { // expected-note {{Taking false branch}}
    fclose(F);
    return;
  }
  fread(Buf, 1, 1, F);   // expected-note {{Assuming stream reaches end-of-file here}}
  if (feof(F)) {         // expected-note {{Taking true branch}}
    fread(Buf, 1, 1, F); // expected-warning {{Read function called when stream is in EOF state. Function has no effect}}
    // expected-note@-1 {{Read function called when stream is in EOF state. Function has no effect}}
  }
  fclose(F);
}

void check_eof_notes_feof_or_no_error() {
  FILE *F;
  char Buf[10];
  F = fopen("foo1.c", "r");
  if (F == NULL) // expected-note {{Taking false branch}} expected-note {{'F' is not equal to NULL}}
    return;
  int RRet = fread(Buf, 1, 1, F); // expected-note {{Assuming stream reaches end-of-file here}}
  if (ferror(F)) {                // expected-note {{Taking false branch}}
  } else {
    fread(Buf, 1, 1, F); // expected-warning {{Read function called when stream is in EOF state. Function has no effect}}
    // expected-note@-1 {{Read function called when stream is in EOF state. Function has no effect}}
  }
  fclose(F);
}