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 | bcm5719-llvm-8cd77baebc7620b18b4b830d52416762860c291b.tar.gz bcm5719-llvm-8cd77baebc7620b18b4b830d52416762860c291b.zip |
[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 104a82ce2a5..70f6422f1e6 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); |