xref: /llvm-project/clang-tools-extra/clang-tidy/cert/LimitedRandomnessCheck.cpp (revision 7d2ea6c422d3f5712b7253407005e1a465a76946)
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 Ballman void 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 Ballman void 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