Fix undefined behaviors discovered in tests

This change removes the following UBs:
- calling std::vector::insert() with source range, which comes
from the destination vector; when vector needs to grow then
the source iterators are invalid
- comparison of singular (default-constructed) iterators is
disallowed

Signed-off-by: Wrobel, Patryk <patryk.wrobel@intel.com>
This commit is contained in:
Wrobel, Patryk
2022-09-05 14:21:49 +00:00
committed by Compute-Runtime-Automation
parent 57da7ad307
commit a8db8b852a
3 changed files with 29 additions and 11 deletions

View File

@@ -1018,8 +1018,11 @@ TEST(ProgramDecoder, GivenValidProgramWithConstantSurfacesThenDecodingSucceedsAn
decodedProgram = {};
auto inlineSize = programToEncode.programScopeTokens.allocateConstantMemorySurface[0]->InlineDataSize;
auto secondConstantSurfaceOff = programToEncode.storage.size();
programToEncode.storage.insert(programToEncode.storage.end(), reinterpret_cast<uint8_t *>(programToEncode.constSurfMutable),
reinterpret_cast<uint8_t *>(programToEncode.constSurfMutable + 1));
std::vector<uint8_t> copiedConstSurfMutable(reinterpret_cast<uint8_t *>(programToEncode.constSurfMutable),
reinterpret_cast<uint8_t *>(programToEncode.constSurfMutable + 1));
programToEncode.storage.insert(programToEncode.storage.end(), copiedConstSurfMutable.begin(), copiedConstSurfMutable.end());
programToEncode.storage.resize(programToEncode.storage.size() + inlineSize);
programToEncode.recalcTokPtr();
decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.blobs.programInfo, decodedProgram);
@@ -1064,8 +1067,11 @@ TEST(ProgramDecoder, GivenValidProgramWithGlobalSurfacesThenDecodingSucceedsAndT
decodedProgram = {};
auto inlineSize = programToEncode.programScopeTokens.allocateGlobalMemorySurface[0]->InlineDataSize;
auto secondGlobalSurfaceOff = programToEncode.storage.size();
programToEncode.storage.insert(programToEncode.storage.end(), reinterpret_cast<uint8_t *>(programToEncode.globalSurfMutable),
reinterpret_cast<uint8_t *>(programToEncode.globalSurfMutable + 1));
std::vector<uint8_t> copiedGlobalSurfMutable(reinterpret_cast<uint8_t *>(programToEncode.globalSurfMutable),
reinterpret_cast<uint8_t *>(programToEncode.globalSurfMutable + 1));
programToEncode.storage.insert(programToEncode.storage.end(), copiedGlobalSurfMutable.begin(), copiedGlobalSurfMutable.end());
programToEncode.storage.resize(programToEncode.storage.size() + inlineSize);
programToEncode.recalcTokPtr();
decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.blobs.programInfo, decodedProgram);
@@ -1155,7 +1161,10 @@ TEST(ProgramDecoder, GivenValidProgramWithKernelThenDecodingSucceedsAndTokensAre
TEST(ProgramDecoder, GivenValidProgramWithTwoKernelsWhenThenDecodingSucceeds) {
PatchTokensTestData::ValidProgramWithKernelUsingSlm programToEncode;
programToEncode.headerMutable->NumberOfKernels = 2;
programToEncode.storage.insert(programToEncode.storage.end(), programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
std::vector<uint8_t> copiedKernelInfo(programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
programToEncode.storage.insert(programToEncode.storage.end(), copiedKernelInfo.begin(), copiedKernelInfo.end());
NEO::PatchTokenBinary::ProgramFromPatchtokens decodedProgram;
bool decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.storage, decodedProgram);
EXPECT_TRUE(decodeSuccess);
@@ -1188,7 +1197,10 @@ TEST(ProgramDecoder, GivenProgramWithMultipleKernelsWhenFailsToDecodeKernelThenD
PatchTokensTestData::ValidProgramWithKernelUsingSlm programToEncode;
programToEncode.slmMutable->Size = 0U;
programToEncode.headerMutable->NumberOfKernels = 2;
programToEncode.storage.insert(programToEncode.storage.end(), programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
std::vector<uint8_t> copiedKernelInfo(programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
programToEncode.storage.insert(programToEncode.storage.end(), copiedKernelInfo.begin(), copiedKernelInfo.end());
NEO::PatchTokenBinary::ProgramFromPatchtokens decodedProgram;
bool decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.storage, decodedProgram);
EXPECT_FALSE(decodeSuccess);
@@ -1220,4 +1232,4 @@ TEST(ProgramDecoder, givenPatchTokenInterfaceDescriptorDataWhenFlagPrintDebugMes
EXPECT_TRUE(decodeSuccess);
EXPECT_EQ(NEO::DecodeError::Success, decodedKernel.decodeStatus);
EXPECT_EQ("Ignored kernel-scope Patch Token: 21\n", output);
}
}

View File

@@ -17,8 +17,11 @@ HWTEST_F(HwParseTest, WhenEmptyBufferThenDontExpectCommands) {
using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
bool cmdBuffOk = false;
GenCmdList::iterator beg, end;
end = beg;
GenCmdList cmdList;
auto beg = cmdList.begin();
auto end = cmdList.end();
cmdBuffOk = expectCmdBuff<FamilyType>(beg, end,
std::vector<MatchCmd *>{});
EXPECT_TRUE(cmdBuffOk);

View File

@@ -302,7 +302,10 @@ TEST(PopulateProgramInfoFromPatchtokensTests, GivenProgramWithKernelsWhenKernelH
TEST(PopulateProgramInfoFromPatchtokensTests, givenProgramWithKernelWhenKernelHasHostAccessTableThenPopulateDeviceHostNameMapCorrectly) {
PatchTokensTestData::ValidProgramWithKernelUsingHostAccessTable programToEncode;
programToEncode.headerMutable->NumberOfKernels = 1;
programToEncode.storage.insert(programToEncode.storage.end(), programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
std::vector<uint8_t> copiedKernelInfo(programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
programToEncode.storage.insert(programToEncode.storage.end(), copiedKernelInfo.begin(), copiedKernelInfo.end());
NEO::PatchTokenBinary::ProgramFromPatchtokens decodedProgram;
bool decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.storage, decodedProgram);
EXPECT_TRUE(decodeSuccess);
@@ -312,4 +315,4 @@ TEST(PopulateProgramInfoFromPatchtokensTests, givenProgramWithKernelWhenKernelHa
EXPECT_EQ(2u, programInfo.globalsDeviceToHostNameMap.size());
EXPECT_STREQ("hostNameOne", programInfo.globalsDeviceToHostNameMap["deviceNameOne"].c_str());
EXPECT_STREQ("hostNameTwo", programInfo.globalsDeviceToHostNameMap["deviceNameTwo"].c_str());
}
}