Skip to content

Commit

Permalink
[Analysis] improve function signature checking for calloc
Browse files Browse the repository at this point in the history
This would crash later if we thought the parameters were
valid for the standard library call as shown in:
https://llvm.org/PR50846
  • Loading branch information
rotateright committed Jun 27, 2021
1 parent f45eee2 commit 7414bbe
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
3 changes: 2 additions & 1 deletion llvm/lib/Analysis/TargetLibraryInfo.cpp
Expand Up @@ -996,7 +996,8 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
case LibFunc_calloc:
case LibFunc_vec_calloc:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(0) == FTy.getParamType(1));

case LibFunc_atof:
case LibFunc_atoi:
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/Transforms/InstCombine/calloc-mismatch.ll
@@ -0,0 +1,16 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instcombine -S | FileCheck %s

; The argument types should match if it is the standard library calloc.
; Don't crash analyzing an imposter.

declare i8* @calloc(i64, i32)

define void @PR50846() {
; CHECK-LABEL: @PR50846(
; CHECK-NEXT: [[CALL:%.*]] = call i8* @calloc(i64 1, i32 1)
; CHECK-NEXT: ret void
;
%call = call i8* @calloc(i64 1, i32 1)
ret void
}

0 comments on commit 7414bbe

Please sign in to comment.