Bug Summary

File:home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Init/Memory.c
Warning:line 67, column 13
Value stored to 'foundBlock' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Memory.c -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 2 -fhalf-no-semantic-interposition -fno-jump-tables -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -ffreestanding -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/build/StmPkg/Core -resource-dir /opt/xgcc/lib/clang/17 -include PcdData.h -D COREBOOT32 -D RELEASE -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/EDKII/BaseTools/Source/C/Include/X64 -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/EdkII/MdePkg/Include -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/EdkII/MdePkg/Include/X64 -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Include -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Include/x64 -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Runtime -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Runtime/../Init -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Runtime/. -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Init -I /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Init/../Runtime -internal-isystem /opt/xgcc/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -source-date-epoch 1714465709 -Os -fdebug-compilation-dir=/home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/build/StmPkg/Core -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-max-loop 10 -analyzer-output=plist-html -faddrsig -o /cb-build/coreboot_scanbuild.0/PURISM_LIBREM15_V4_STM-scanbuildtmp/2024-05-02-081243-2232343-1/report-UgOn01.plist -x c /home/coreboot/node-root/workspace/coreboot_scanbuild/3rdparty/stm/Stm/StmPkg/Core/Init/Memory.c
1/** @file
2 STM memory management
3
4 Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13**/
14
15#include "StmInit.h"
16#include "PeStm.h"
17
18void HeapList(int id);
19//#define HEAPCHECK
20
21/**
22
23 This function allocate pages in MSEG.
24
25 @param Pages the requested pages number
26
27 @return pages address
28
29**/
30
31VOIDvoid *
32AllocatePages (
33 IN UINTN Pages
34 )
35{
36 UINT64 Address;
37 HEAP_HEADER * BlockHeader;
38 HEAP_HEADER * PrevBlock;
39 HEAP_HEADER * NewBlock;
40 BOOLEAN foundBlock;
41 BOOLEAN endList;
42
43 // implements a first fit algorithm
44
45 // find the first block that fits
46
47 AcquireSpinLock (&mHostContextCommon.MemoryLock);
48
49 Address = mHostContextCommon.HeapFree; // get begining of freelist
50
51 PrevBlock = (HEAP_HEADER *) NULL((void *) 0);
52 BlockHeader = (HEAP_HEADER *)(UINTN)Address;
53
54 foundBlock = FALSE((BOOLEAN)(0==1));
55 if(BlockHeader == 0)
56 {
57 endList = TRUE((BOOLEAN)(1==1)); // we are totally out of space
58 }
59 else
60 {
61 endList = FALSE((BOOLEAN)(0==1));
62 }
63 while(!endList)
64 {
65 if(BlockHeader->BlockLength >= Pages)
66 {
67 foundBlock = TRUE((BOOLEAN)(1==1));
Value stored to 'foundBlock' is never read
68 Address = (UINT64) (UINTN) BlockHeader; // begining of block to return
69 break;
70 }
71
72 if(BlockHeader->NextBlock == 0)
73 {
74 endList = TRUE((BOOLEAN)(1==1));
75 break;
76 }
77 PrevBlock = BlockHeader; // remember the previous block;
78 BlockHeader = BlockHeader->NextBlock;
79 }
80
81 if(endList)
82 {
83 DEBUG((EFI_D_ERROR, "AllocatePages(0x%x) fail - no freeblock of the correct size\n", Pages))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "AllocatePages(0x%x) fail - no freeblock of the correct size\n"
, Pages); } } while (((BOOLEAN)(0==1)))
;
84#ifdef HEAPCHECK
85 // ReleaseSpinLock (&mHostContextCommon.MemoryLock);
86 HeapList(1);
87#endif
88 ReleaseSpinLock (&mHostContextCommon.MemoryLock);
89 return NULL((void *) 0);
90 }
91
92 // found a block that fits - now need to make adjustments
93
94 // cases 1 - first in list == change HeapFree
95 // 2 - middle of list == change previous pointer
96 // 3 - released block at end of list == change previous pointer
97 // subcases - block is completely consumed - need to change pointer in previous block
98 // - block has leftover space
99
100 //if (mHostContextCommon.HeapBottom + STM_PAGES_TO_SIZE(Pages) > mHostContextCommon.HeapTop) {
101 // DEBUG ((EFI_D_ERROR, "AllocatePages(%x) fail\n", Pages));
102 // ReleaseSpinLock (&mHostContextCommon.MemoryLock);
103 // //CpuDeadLoop ();
104 // return NULL;
105 //}
106
107 // (1) breakup block (if necessary)
108 // (2) point HeapFree to the new block (or to the next block in the event the current block is consumed
109
110 if(BlockHeader->BlockLength == Pages)
111 {
112 NewBlock = (BlockHeader->NextBlock); // get next block in the list
113 }
114 else // need to break the block up
115 {
116 NewBlock = (HEAP_HEADER *)(UINTN)(Address + ((UINT64)(UINTN)STM_PAGES_TO_SIZE(Pages)( (Pages) << 12))); // second half of block
117 NewBlock->NextBlock = BlockHeader->NextBlock;
118 NewBlock->BlockLength = BlockHeader->BlockLength - Pages;
119 }
120
121 if(BlockHeader == (HEAP_HEADER *)(UINTN) mHostContextCommon.HeapFree)
122 {
123 mHostContextCommon.HeapFree = (UINT64) NewBlock;
124 }
125 else
126 {
127 PrevBlock->NextBlock = NewBlock;
128 }
129
130 //Address = mHostContextCommon.HeapTop - STM_PAGES_TO_SIZE(Pages);
131 //mHostContextCommon.HeapTop = Address;
132#ifdef HEAPCHECK
133 HeapList(2);
134#endif
135 ReleaseSpinLock (&mHostContextCommon.MemoryLock);
136 ZeroMem ((VOIDvoid *)(UINTN)Address, STM_PAGES_TO_SIZE (Pages)( (Pages) << 12));
137#ifdef HEAPCHECK
138 DEBUG((EFI_D_ERROR, "****Allocating 0x%x pages at 0x%016llx - %d Cleared\n", Pages, Address, STM_PAGES_TO_SIZE (Pages)))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "****Allocating 0x%x pages at 0x%016llx - %d Cleared\n"
, Pages, Address, ( (Pages) << 12)); } } while (((BOOLEAN
)(0==1)))
;
139#endif
140 return (VOIDvoid *)(UINTN)Address;
141}
142
143/**
144
145This function free pages in MSEG.
146
147@param Address pages address
148@param Pages pages number
149
150**/
151VOIDvoid
152FreePages (
153 IN VOIDvoid *Address,
154 IN UINTN Pages
155 )
156{
157 HEAP_HEADER * CurrentBlock;
158 HEAP_HEADER * PreviousBlock;
159#ifdef HEAPCHECK
160 DEBUG((EFI_D_ERROR, "****Freeing 0x%x pages at 0x%016llx\n", Pages, (UINTN) Address))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "****Freeing 0x%x pages at 0x%016llx\n"
, Pages, (UINTN) Address); } } while (((BOOLEAN)(0==1)))
;
161#endif
162 AcquireSpinLock (&mHostContextCommon.MemoryLock);
163
164 // (1) Set header
165 // (2) find place in buffer chain
166 // (3) coalese(sp?)
167
168 Address = (void *)((UINTN) Address & ~0xfff); // mask out the lower 12 bits
169
170 ((HEAP_HEADER *)Address)->NextBlock = 0L;
171 ((HEAP_HEADER *)Address)->BlockLength = Pages;
172
173#ifdef HEAPCHECK
174 DEBUG((EFI_D_ERROR, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n",do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
175 ((HEAP_HEADER *)Address)->NextBlock,do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
176 ((HEAP_HEADER *)Address)->BlockLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
;
177#endif
178 PreviousBlock = 0L;
179 CurrentBlock = (HEAP_HEADER *)(UINTN) mHostContextCommon.HeapFree;
180
181 // find where it belongs
182 while( CurrentBlock != 0L)
183 {
184 if((UINTN)CurrentBlock > (UINTN)Address)
185 {
186 break;
187 }
188
189 PreviousBlock = CurrentBlock;
190 CurrentBlock = CurrentBlock->NextBlock;
191 }
192
193 //link it in
194 if(PreviousBlock == 0L)
195 {
196 // at beginning of list
197 ((HEAP_HEADER *)Address)->NextBlock = CurrentBlock;
198 mHostContextCommon.HeapFree = (UINT64)Address;
199 }
200 else
201 {
202 // somewhere in list
203 ((HEAP_HEADER *)Address)->NextBlock = CurrentBlock;
204 PreviousBlock->NextBlock = (HEAP_HEADER *)Address;
205 }
206#ifdef HEAPCHECK
207 DEBUG((EFI_D_ERROR, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n",do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
208 ((HEAP_HEADER *)Address)->NextBlock,do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
209 ((HEAP_HEADER *)Address)->BlockLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
;
210#endif
211 // coalesce
212
213 // First check the block after
214 if(CurrentBlock != 0L)
215 {
216 if(((UINT64)Address + STM_PAGES_TO_SIZE(Pages)( (Pages) << 12)) == (UINT64)(UINTN)CurrentBlock)
217 {
218#ifdef HEAPCHECK
219 DEBUG((EFI_D_ERROR, "Combined with block after\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Combined with block after\n"
); } } while (((BOOLEAN)(0==1)))
;
220#endif
221 ((HEAP_HEADER *)Address)->NextBlock = CurrentBlock->NextBlock;
222 ((HEAP_HEADER *)Address)->BlockLength = ((HEAP_HEADER *)Address)->BlockLength + CurrentBlock->BlockLength;
223#ifdef HEAPCHECK
224 DEBUG((EFI_D_ERROR, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n",do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
225 ((HEAP_HEADER *)Address)->NextBlock,do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
226 ((HEAP_HEADER *)Address)->BlockLength))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Address->NextBlock: 0x%016llx Address->BlockLength: 0x%016llx\n"
, ((HEAP_HEADER *)Address)->NextBlock, ((HEAP_HEADER *)Address
)->BlockLength); } } while (((BOOLEAN)(0==1)))
;
227#endif
228 }
229 }
230
231 // then then block before
232 if(PreviousBlock != 0L)
233 {
234 if(((UINT64)PreviousBlock + STM_PAGES_TO_SIZE((UINT64)PreviousBlock->BlockLength)( ((UINT64)PreviousBlock->BlockLength) << 12)) == (UINT64)Address)
235 {
236#ifdef HEAPCHECK
237 DEBUG((EFI_D_ERROR, "Combined with block before\n"))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "Combined with block before\n"
); } } while (((BOOLEAN)(0==1)))
;
238
239 DEBUG((EFI_D_ERROR, "PreviousBlock: 0x%016llx BlockLength: 0x%016llx Add: 0x%016llx\n",do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "PreviousBlock: 0x%016llx BlockLength: 0x%016llx Add: 0x%016llx\n"
, PreviousBlock, ( ((UINT64)PreviousBlock->BlockLength) <<
12), ((HEAP_HEADER*) Address)); } } while (((BOOLEAN)(0==1))
)
240 PreviousBlock,do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "PreviousBlock: 0x%016llx BlockLength: 0x%016llx Add: 0x%016llx\n"
, PreviousBlock, ( ((UINT64)PreviousBlock->BlockLength) <<
12), ((HEAP_HEADER*) Address)); } } while (((BOOLEAN)(0==1))
)
241 STM_PAGES_TO_SIZE((UINT64)PreviousBlock->BlockLength),do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "PreviousBlock: 0x%016llx BlockLength: 0x%016llx Add: 0x%016llx\n"
, PreviousBlock, ( ((UINT64)PreviousBlock->BlockLength) <<
12), ((HEAP_HEADER*) Address)); } } while (((BOOLEAN)(0==1))
)
242 ((HEAP_HEADER*) Address)))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, "PreviousBlock: 0x%016llx BlockLength: 0x%016llx Add: 0x%016llx\n"
, PreviousBlock, ( ((UINT64)PreviousBlock->BlockLength) <<
12), ((HEAP_HEADER*) Address)); } } while (((BOOLEAN)(0==1))
)
;
243#endif
244 PreviousBlock->NextBlock = ((HEAP_HEADER *)Address)->NextBlock;
245 PreviousBlock->BlockLength += ((HEAP_HEADER *) Address)->BlockLength;
246 }
247 }
248
249 // if ((UINT64)(UINTN)Address == mHostContextCommon.HeapTop) {
250 // mHostContextCommon.HeapTop += STM_PAGES_TO_SIZE(Pages);
251 // }
252#ifdef HEAPCHECK
253 HeapList(3);
254#endif
255 ReleaseSpinLock (&mHostContextCommon.MemoryLock);
256 return ;
257}
258
259void HeapList(int id)
260{
261 HEAP_HEADER * CurrentBlock = (HEAP_HEADER *)(UINTN) mHostContextCommon.HeapFree;
262
263 DEBUG((EFI_D_ERROR, " ***HeapList %d Start***\n", id))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, " ***HeapList %d Start***\n"
, id); } } while (((BOOLEAN)(0==1)))
;
264
265 while(CurrentBlock != 0L)
266 {
267 DEBUG((EFI_D_ERROR, " Block: 0x%llx BlockLength: 0x%x NextBlock: 0x%llx\n", CurrentBlock, CurrentBlock->BlockLength, CurrentBlock->NextBlock))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, " Block: 0x%llx BlockLength: 0x%x NextBlock: 0x%llx\n"
, CurrentBlock, CurrentBlock->BlockLength, CurrentBlock->
NextBlock); } } while (((BOOLEAN)(0==1)))
;
268 CurrentBlock = CurrentBlock->NextBlock;
269 }
270
271 DEBUG((EFI_D_ERROR, " ***HeapList %d Done***\n", id))do { if (DebugPrintEnabled ()) { DebugPrint (0x80000000, " ***HeapList %d Done***\n"
, id); } } while (((BOOLEAN)(0==1)))
;
272}