Skip to content

Commit c40b98c

Browse files
authored
fix: Detection of having reached the end of file was not done correctly. (#232)
* fix: Detection of having reached the end of file was not done correctly. All changes revolve around the fact that the last address of any input file is baseAddress + fileSize - 1 when size > 0 and baseAddress when size == 0 * Adjust past eof check to occur in the byte after the input file's last. * Adjust past eof check to occur in the byte after the input file's last. * Reverted unnecessary changes and rewrote for efficiency (no storage)
1 parent f690fea commit c40b98c

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

lib/source/pl/core/ast/ast_node_array_variable_decl.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ namespace pl::core::ast {
184184
} else if (auto whileStatement = dynamic_cast<ASTNodeWhileStatement *>(sizeNode.get())) {
185185
while (whileStatement->evaluateCondition(evaluator)) {
186186
if (templatePattern->getSection() == ptrn::Pattern::MainSectionId)
187-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
187+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
188188
err::E0004.throwError("Array expanded past end of the data before termination condition was met.", { }, this->getLocation());
189189

190190
evaluator->handleAbort();
@@ -199,7 +199,7 @@ namespace pl::core::ast {
199199
std::vector<u8> buffer(templatePattern->getSize());
200200
while (true) {
201201
if (templatePattern->getSection() == ptrn::Pattern::MainSectionId)
202-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
202+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
203203
err::E0004.throwError("Array expanded past end of the data before a null-entry was found.", "Try using a while-sized array instead to limit the size of the array.", this->getLocation());
204204

205205
evaluator->readData(evaluator->getReadOffset(), buffer.data(), buffer.size(), templatePattern->getSection());
@@ -246,7 +246,7 @@ namespace pl::core::ast {
246246
evaluator->setReadOffset(startOffset + outputPattern->getSize());
247247

248248
if (outputPattern->getSection() == ptrn::Pattern::MainSectionId)
249-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
249+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
250250
err::E0004.throwError("Array expanded past end of the data.", { }, this->getLocation());
251251
}
252252

@@ -327,7 +327,7 @@ namespace pl::core::ast {
327327
size_t patternCount = patterns.size();
328328

329329
if (arrayPattern->getSection() == ptrn::Pattern::MainSectionId)
330-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
330+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
331331
err::E0004.throwError("Array expanded past end of the data.", fmt::format("Entry {} exceeded data by {} bytes.", i, evaluator->getReadOffset() - evaluator->getDataSize()), this->getLocation());
332332

333333
if (!patterns.empty())
@@ -360,7 +360,7 @@ namespace pl::core::ast {
360360
size_t patternCount = patterns.size();
361361

362362
if (arrayPattern->getSection() == ptrn::Pattern::MainSectionId)
363-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
363+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
364364
err::E0004.throwError("Array expanded past end of the data before termination condition was met.", { }, this->getLocation());
365365

366366
if (!patterns.empty())
@@ -398,7 +398,7 @@ namespace pl::core::ast {
398398
std::vector<u8> buffer(pattern->getSize());
399399

400400
if (arrayPattern->getSection() == ptrn::Pattern::MainSectionId)
401-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
401+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
402402
err::E0004.throwError("Array expanded past end of the data before a null-entry was found.", "Try using a while-sized array instead to limit the size of the array.", this->getLocation());
403403

404404
const auto patternSize = pattern->getSize();

lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ namespace pl::core::ast {
150150
this->m_type->createPatterns(evaluator, patterns);
151151

152152
if (arrayPattern->getSection() == ptrn::Pattern::MainSectionId)
153-
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize() + 1))
153+
if ((evaluator->getReadOffset() - evaluator->getDataBaseAddress()) > (evaluator->getDataSize()))
154154
err::E0004.throwError("Bitfield array expanded past end of the data.", fmt::format("Entry {} exceeded data by {} bytes.", dataIndex, evaluator->getReadOffset() - evaluator->getDataSize()), this->getLocation());
155155

156156
auto ctrlFlow = evaluator->getCurrentControlFlowStatement();

0 commit comments

Comments
 (0)