diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-24 16:28:13 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-24 16:28:13 +0000 |
commit | 2a4b09c9de8162ef1f4e4138f72b8247779f4d60 (patch) | |
tree | 7ddc3370a2d17e2fb42adc79ac0e3c220cd13d01 /llvm/lib/Analysis/MemoryBuiltins.cpp | |
parent | 1c85d5b17d0bd4b688e6fd4a59ad9c6dc4a817a6 (diff) | |
download | llvm-2a4b09c9de8162ef1f4e4138f72b8247779f4d60.zip llvm-2a4b09c9de8162ef1f4e4138f72b8247779f4d60.tar.gz llvm-2a4b09c9de8162ef1f4e4138f72b8247779f4d60.tar.bz2 |
teach objectsize about strdup() and strndup()
llvm-svn: 160676
Diffstat (limited to 'llvm/lib/Analysis/MemoryBuiltins.cpp')
-rw-r--r-- | llvm/lib/Analysis/MemoryBuiltins.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/MemoryBuiltins.cpp b/llvm/lib/Analysis/MemoryBuiltins.cpp index 8d99ec3..4833b52 100644 --- a/llvm/lib/Analysis/MemoryBuiltins.cpp +++ b/llvm/lib/Analysis/MemoryBuiltins.cpp @@ -64,7 +64,7 @@ static const AllocFnsTy AllocationFnData[] = { {"realloc", ReallocLike, 2, 1, -1}, {"reallocf", ReallocLike, 2, 1, -1}, {"strdup", StrDupLike, 1, -1, -1}, - {"strndup", StrDupLike, 2, -1, -1} + {"strndup", StrDupLike, 2, 1, -1} }; @@ -414,8 +414,21 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitCallSite(CallSite CS) { // handle strdup-like functions separately if (FnData->AllocTy == StrDupLike) { - // TODO - return unknown(); + APInt Size(IntTyBits, GetStringLength(CS.getArgument(0))); + if (!Size) + return unknown(); + + // strndup limits strlen + if (FnData->FstParam > 0) { + ConstantInt *Arg= dyn_cast<ConstantInt>(CS.getArgument(FnData->FstParam)); + if (!Arg) + return unknown(); + + APInt MaxSize = Arg->getValue().zextOrSelf(IntTyBits); + if (Size.ugt(MaxSize)) + Size = MaxSize + 1; + } + return std::make_pair(Size, Zero); } ConstantInt *Arg = dyn_cast<ConstantInt>(CS.getArgument(FnData->FstParam)); |