diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-01-15 08:20:31 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-01-15 08:20:31 +0000 |
commit | 88c8bc83808588fdb97924144ca9fb5f27dfc9a6 (patch) | |
tree | e6f51b6f7203b64527c16f5c9317a1cbc0db8afc /lib/Analysis/CheckSecuritySyntaxOnly.cpp | |
parent | c213b48206c55ca0eb1387cfa1651de504f147d1 (diff) |
Don't suggest the developer use 'arc4random' instead of 'rand' when that function is not available. Fixes PR 6012.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93508 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CheckSecuritySyntaxOnly.cpp')
-rw-r--r-- | lib/Analysis/CheckSecuritySyntaxOnly.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/Analysis/CheckSecuritySyntaxOnly.cpp b/lib/Analysis/CheckSecuritySyntaxOnly.cpp index 3214101c64..f4874a5dfe 100644 --- a/lib/Analysis/CheckSecuritySyntaxOnly.cpp +++ b/lib/Analysis/CheckSecuritySyntaxOnly.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/Basic/TargetInfo.h" #include "clang/Analysis/PathSensitive/BugReporter.h" #include "clang/Analysis/LocalCheckers.h" #include "clang/AST/StmtVisitor.h" @@ -18,6 +19,12 @@ using namespace clang; +static bool isArc4RandomAvailable(const ASTContext &Ctx) { + const llvm::Triple &T = Ctx.Target.getTriple(); + return T.getVendor() == llvm::Triple::Apple || + T.getOS() == llvm::Triple::FreeBSD; +} + namespace { class WalkAST : public StmtVisitor<WalkAST> { BugReporter &BR; @@ -29,11 +36,14 @@ class WalkAST : public StmtVisitor<WalkAST> { IdentifierInfo *II_random; enum { num_setids = 6 }; IdentifierInfo *II_setid[num_setids]; + + const bool CheckRand; public: WalkAST(BugReporter &br) : BR(br), II_gets(0), II_getpw(0), II_mktemp(0), - II_rand(), II_random(0), II_setid() {} + II_rand(), II_random(0), II_setid(), + CheckRand(isArc4RandomAvailable(BR.getContext())) {} // Statement visitor methods. void VisitCallExpr(CallExpr *CE); @@ -83,8 +93,10 @@ void WalkAST::VisitCallExpr(CallExpr *CE) { CheckCall_gets(CE, FD); CheckCall_getpw(CE, FD); CheckCall_mktemp(CE, FD); - CheckCall_rand(CE, FD); - CheckCall_random(CE, FD); + if (CheckRand) { + CheckCall_rand(CE, FD); + CheckCall_random(CE, FD); + } } // Recurse and check children. |