[Lldb-commits] [lldb] 4b074b4 - [lldb] Fix UB in half2float and add some more tests.
Shafik Yaghmour via lldb-commits
lldb-commits at lists.llvm.org
Wed May 19 14:27:08 PDT 2021
*sigh*I wish we had std::bit_cast instead of using union based type punning, we do have __builtin_bit_cast but it is different enough that replacing it later on w/ std::bit_cast wouldn’t just be search/replace.
> On May 19, 2021, at 12:37 PM, Raphael Isemann via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>
>
> Author: Raphael Isemann
> Date: 2021-05-19T21:37:10+02:00
> New Revision: 4b074b49be206306330076b9fa40632ef1960823
>
> URL: https://github.com/llvm/llvm-project/commit/4b074b49be206306330076b9fa40632ef1960823
> DIFF: https://github.com/llvm/llvm-project/commit/4b074b49be206306330076b9fa40632ef1960823.diff
>
> LOG: [lldb] Fix UB in half2float and add some more tests.
>
> The added DumpDataExtractorTest uncovered that this is lshifting a negative
> integer which upsets ubsan and breaks the sanitizer bot. This patch just
> changes the variable we shift to be unsigned and adds a bunch of tests to make
> sure this function does what it promises.
>
> Added:
>
>
> Modified:
> lldb/source/Core/DumpDataExtractor.cpp
> lldb/unittests/Core/DumpDataExtractorTest.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/lldb/source/Core/DumpDataExtractor.cpp b/lldb/source/Core/DumpDataExtractor.cpp
> index ec44e3481c1e5..34c9353c9feaa 100644
> --- a/lldb/source/Core/DumpDataExtractor.cpp
> +++ b/lldb/source/Core/DumpDataExtractor.cpp
> @@ -52,7 +52,9 @@ static float half2float(uint16_t half) {
> float f;
> uint32_t u;
> } u;
> - int32_t v = (int16_t)half;
> + // Sign extend to 4 byte.
> + int32_t sign_extended = static_cast<int16_t>(half);
> + uint32_t v = static_cast<uint32_t>(sign_extended);
>
> if (0 == (v & 0x7c00)) {
> u.u = v & 0x80007FFFU;
>
> diff --git a/lldb/unittests/Core/DumpDataExtractorTest.cpp b/lldb/unittests/Core/DumpDataExtractorTest.cpp
> index c4ec5f2e9a35b..05cd13add1e99 100644
> --- a/lldb/unittests/Core/DumpDataExtractorTest.cpp
> +++ b/lldb/unittests/Core/DumpDataExtractorTest.cpp
> @@ -174,8 +174,30 @@ TEST(DumpDataExtractorTest, Formats) {
> "{0x0000000000000000 0xaaaabbbbccccdddd}");
>
> // See half2float for format details.
> + // Test zeroes.
> + TestDump(std::vector<uint16_t>{0x0000, 0x8000},
> + lldb::Format::eFormatVectorOfFloat16, "{0 -0}");
> + // Some subnormal numbers.
> + TestDump(std::vector<uint16_t>{0x0001, 0x8001},
> + lldb::Format::eFormatVectorOfFloat16, "{5.96046e-08 -5.96046e-08}");
> + // A full mantisse and empty expontent.
> + TestDump(std::vector<uint16_t>{0x83ff, 0x03ff},
> + lldb::Format::eFormatVectorOfFloat16, "{-6.09756e-05 6.09756e-05}");
> + // Some normal numbers.
> + TestDump(std::vector<uint16_t>{0b0100001001001000},
> + lldb::Format::eFormatVectorOfFloat16, "{3.14062}");
> TestDump(std::vector<uint16_t>{0xabcd, 0x1234},
> lldb::Format::eFormatVectorOfFloat16, "{-0.0609436 0.000757217}");
> + // Largest and smallest normal number.
> + TestDump(std::vector<uint16_t>{0x0400, 0x7bff},
> + lldb::Format::eFormatVectorOfFloat16, "{6.10352e-05 65504}");
> + // quiet/signaling NaNs.
> + TestDump(std::vector<uint16_t>{0xffff, 0xffc0, 0x7fff, 0x7fc0},
> + lldb::Format::eFormatVectorOfFloat16, "{nan nan nan nan}");
> + // +/-Inf.
> + TestDump(std::vector<uint16_t>{0xfc00, 0x7c00},
> + lldb::Format::eFormatVectorOfFloat16, "{-inf inf}");
> +
> TestDump(std::vector<float>{std::numeric_limits<float>::min(),
> std::numeric_limits<float>::max()},
> lldb::Format::eFormatVectorOfFloat32, "{1.17549e-38 3.40282e+38}");
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list