[llvm] r267580 - [SimplifyLibCalls] sprintf doesn't copy null bytes

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 11:16:50 PDT 2016


Author: majnemer
Date: Tue Apr 26 13:16:49 2016
New Revision: 267580

URL: http://llvm.org/viewvc/llvm-project?rev=267580&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
    llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=267580&r1=267579&r2=267580&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp Tue Apr 26 13:16:49 2016
@@ -1995,9 +1995,10 @@ Value *LibCallSimplifier::optimizeSPrint
     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);

Modified: llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll?rev=267580&r1=267579&r2=267580&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll Tue Apr 26 13:16:49 2016
@@ -65,8 +65,9 @@ define void @test_simplify5(i8* %dst, i8
   %fmt = getelementptr [3 x i8], [3 x i8]* @percent_s, i32 0, i32 0
   call i32 (i8*, i8*, ...) @sprintf(i8* %dst, i8* %fmt, i8* %str)
 ; CHECK-NEXT: [[STRLEN:%[a-z0-9]+]] = call i32 @strlen(i8* %str)
-; CHECK-NEXT: [[LENINC:%[a-z0-9]+]] = add i32 [[STRLEN]], 1
-; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %str, i32 [[LENINC]], i32 1, i1 false)
+; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %str, i32 [[STRLEN]], i32 1, i1 false)
+; CHECK-NEXT: [[NUL:%[a-z0-9]+]] = getelementptr i8, i8* %dst, i32 [[STRLEN]]
+; CHECK-NEXT: store i8 0, i8* [[NUL]], align 1
   ret void
 ; CHECK-NEXT: ret void
 }




More information about the llvm-commits mailing list