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 | abf6ba16127674658fbe2c95af3254b8fc7ed4e7 (patch) | |
tree | 1ba41324d3dbae86cd623968e2cbb22b7913c7f0 /clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp | |
parent | d74cc397c8dc8fc02699b276f0ea02fb99a32804 (diff) | |
download | bcm5719-llvm-abf6ba16127674658fbe2c95af3254b8fc7ed4e7.tar.gz bcm5719-llvm-abf6ba16127674658fbe2c95af3254b8fc7ed4e7.zip |
Don't suggest the developer use 'arc4random' instead of 'rand' when that function is not available. Fixes PR 6012.
llvm-svn: 93508
Diffstat (limited to 'clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp')
-rw-r--r-- | clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp b/clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp index 3214101c648..f4874a5dfe4 100644 --- a/clang/lib/Analysis/CheckSecuritySyntaxOnly.cpp +++ b/clang/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. |