From f3e8f9617365f129a0e9876fc3d38f15d6f2d4fd Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Fri, 19 Jun 2020 16:08:34 +0100 Subject: [PATCH] [ADT] Fix itostr handling of min int64_t value Summary: UBSan buildbot caught an undefined behavior in itostr with INT64_MIN. The negation cannot be represented in the promoted operand (long long). Negation is well defined on unsigned value though so this commit does the negation after the static cast. Reviewers: jhenderson, chandlerc, lattner Reviewed By: lattner Subscribers: dexonsmith, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D82200 --- llvm/include/llvm/ADT/StringExtras.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/include/llvm/ADT/StringExtras.h b/llvm/include/llvm/ADT/StringExtras.h index 56d5f3d05857..990a3054a9d2 100644 --- a/llvm/include/llvm/ADT/StringExtras.h +++ b/llvm/include/llvm/ADT/StringExtras.h @@ -245,7 +245,7 @@ inline std::string utostr(uint64_t X, bool isNeg = false) { inline std::string itostr(int64_t X) { if (X < 0) - return utostr(static_cast(-X), true); + return utostr(-static_cast(X), true); else return utostr(static_cast(X)); }