17bfa6856SAaron Ballman //===--- LimitedRandomnessCheck.cpp - clang-tidy---------------------------===// 27bfa6856SAaron Ballman // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67bfa6856SAaron Ballman // 77bfa6856SAaron Ballman //===----------------------------------------------------------------------===// 87bfa6856SAaron Ballman 97bfa6856SAaron Ballman #include "LimitedRandomnessCheck.h" 107bfa6856SAaron Ballman #include "clang/AST/ASTContext.h" 117bfa6856SAaron Ballman #include "clang/ASTMatchers/ASTMatchFinder.h" 127bfa6856SAaron Ballman 137bfa6856SAaron Ballman using namespace clang::ast_matchers; 147bfa6856SAaron Ballman 15*7d2ea6c4SCarlos Galvez namespace clang::tidy::cert { 167bfa6856SAaron Ballman registerMatchers(MatchFinder * Finder)177bfa6856SAaron Ballmanvoid LimitedRandomnessCheck::registerMatchers(MatchFinder *Finder) { 187bfa6856SAaron Ballman Finder->addMatcher(callExpr(callee(functionDecl(namedDecl(hasName("::rand")), 197bfa6856SAaron Ballman parameterCountIs(0)))) 207bfa6856SAaron Ballman .bind("randomGenerator"), 217bfa6856SAaron Ballman this); 227bfa6856SAaron Ballman } 237bfa6856SAaron Ballman check(const MatchFinder::MatchResult & Result)247bfa6856SAaron Ballmanvoid LimitedRandomnessCheck::check(const MatchFinder::MatchResult &Result) { 250542d152SKazu Hirata std::string Msg; 267bfa6856SAaron Ballman if (getLangOpts().CPlusPlus) 27ab2d3ce4SAlexander Kornienko Msg = "; use C++11 random library instead"; 287bfa6856SAaron Ballman 297bfa6856SAaron Ballman const auto *MatchedDecl = Result.Nodes.getNodeAs<CallExpr>("randomGenerator"); 30ab2d3ce4SAlexander Kornienko diag(MatchedDecl->getBeginLoc(), "rand() has limited randomness" + Msg); 317bfa6856SAaron Ballman } 327bfa6856SAaron Ballman 33*7d2ea6c4SCarlos Galvez } // namespace clang::tidy::cert 34