diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-04-26 18:16:49 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-04-26 18:16:49 +0000 |
commit | 8cd77baebc7620b18b4b830d52416762860c291b (patch) | |
tree | 6ff39c3a0577f18f5783d0817c69a994328d8077 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | |
parent | 1c3f65a18cad4d46e8683e47430694c8d8f2ccbe (diff) | |
download | llvm-8cd77baebc7620b18b4b830d52416762860c291b.zip llvm-8cd77baebc7620b18b4b830d52416762860c291b.tar.gz llvm-8cd77baebc7620b18b4b830d52416762860c291b.tar.bz2 |
[SimplifyLibCalls] sprintf doesn't copy null bytes
sprintf doesn't read or copy the terminating null byte from it's string
operands. sprintf will append it's own after processing all of the
format specifiers.
This fixes PR27526.
llvm-svn: 267580
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 104a82c..70f6422 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -1995,9 +1995,10 @@ Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, IRBuilder<> &B) { Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI); if (!Len) return nullptr; - Value *IncLen = - B.CreateAdd(Len, ConstantInt::get(Len->getType(), 1), "leninc"); - B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(2), IncLen, 1); + B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(2), Len, 1); + Value *PtrToNullByte = + B.CreateGEP(B.getInt8Ty(), CI->getArgOperand(0), Len, "nul"); + B.CreateStore(B.getInt8(0), PtrToNullByte); // The sprintf result is the unincremented number of bytes in the string. return B.CreateIntCast(Len, CI->getType(), false); |