From 306868b91c00a1a2dd7e94462d6aa9b72496dfec Mon Sep 17 00:00:00 2001 From: James Henderson Date: Wed, 24 Oct 2018 13:16:16 +0000 Subject: [PATCH] Fix llvm-strings crash for negative char values On Windows at least, llvm-strings was crashing if it encountered bytes that mapped to negative chars, as it was passing these into std::isgraph and std::isblank functions, resulting in undefined behaviour. On debug builds using MSVC, these functions verfiy that the value passed in is representable as an unsigned char. Since the char is promoted to an int, a value greater than 127 would turn into a negative integer value, and fail the check. Using the llvm::isPrint function is sufficient to solve the issue. Reviewed by: ruiu, mstorsjo Differential Revision: https://reviews.llvm.org/D53509 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@345137 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-strings/negative-char.test | 3 +++ tools/llvm-strings/llvm-strings.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 test/tools/llvm-strings/negative-char.test diff --git a/test/tools/llvm-strings/negative-char.test b/test/tools/llvm-strings/negative-char.test new file mode 100644 index 00000000000..331dde47078 --- /dev/null +++ b/test/tools/llvm-strings/negative-char.test @@ -0,0 +1,3 @@ +# RUN: echo -e "z\0\x80\0a\0" | llvm-strings --bytes 1 - | FileCheck %s +# CHECK: z{{$}} +# CHECK-NEXT: {{^}} a diff --git a/tools/llvm-strings/llvm-strings.cpp b/tools/llvm-strings/llvm-strings.cpp index 8e2d213bcc7..c355caf899d 100644 --- a/tools/llvm-strings/llvm-strings.cpp +++ b/tools/llvm-strings/llvm-strings.cpp @@ -80,7 +80,7 @@ static void strings(raw_ostream &OS, StringRef FileName, StringRef Contents) { const char *B = Contents.begin(); const char *P = nullptr, *E = nullptr, *S = nullptr; for (P = Contents.begin(), E = Contents.end(); P < E; ++P) { - if (std::isgraph(*P) || std::isblank(*P)) { + if (isPrint(*P) || *P == '\t') { if (S == nullptr) S = P; } else if (S) {