forked from OSchip/llvm-project
Add a new clang-tidy check for cert-msc50-cpp (and cert-msc30-c) that corresponds to the CERT C++ secure coding rule: https://www.securecoding.cert.org/confluence/display/cplusplus/MSC50-CPP.+Do+not+use+std%3A%3Arand%28%29+for+generating+pseudorandom+numbers
Patch by Benedek Kiss llvm-svn: 285809
This commit is contained in:
parent
390aaca662
commit
7bfa685611
|
@ -18,6 +18,7 @@
|
|||
#include "../misc/ThrowByValueCatchByReferenceCheck.h"
|
||||
#include "CommandProcessorCheck.h"
|
||||
#include "FloatLoopCounter.h"
|
||||
#include "LimitedRandomnessCheck.h"
|
||||
#include "SetLongJmpCheck.h"
|
||||
#include "StaticObjectExceptionCheck.h"
|
||||
#include "StrToNumCheck.h"
|
||||
|
@ -53,6 +54,9 @@ public:
|
|||
"cert-err60-cpp");
|
||||
CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
|
||||
"cert-err61-cpp");
|
||||
// MSC
|
||||
CheckFactories.registerCheck<LimitedRandomnessCheck>(
|
||||
"cert-msc50-cpp");
|
||||
|
||||
// C checkers
|
||||
// DCL
|
||||
|
@ -70,6 +74,9 @@ public:
|
|||
// ERR
|
||||
CheckFactories.registerCheck<StrToNumCheck>(
|
||||
"cert-err34-c");
|
||||
// MSC
|
||||
CheckFactories.registerCheck<LimitedRandomnessCheck>(
|
||||
"cert-msc30-c");
|
||||
}
|
||||
ClangTidyOptions getModuleOptions() override {
|
||||
ClangTidyOptions Options;
|
||||
|
|
|
@ -4,6 +4,7 @@ add_clang_library(clangTidyCERTModule
|
|||
CERTTidyModule.cpp
|
||||
CommandProcessorCheck.cpp
|
||||
FloatLoopCounter.cpp
|
||||
LimitedRandomnessCheck.cpp
|
||||
SetLongJmpCheck.cpp
|
||||
StaticObjectExceptionCheck.cpp
|
||||
StrToNumCheck.cpp
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
//===--- LimitedRandomnessCheck.cpp - clang-tidy---------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "LimitedRandomnessCheck.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/ASTMatchers/ASTMatchFinder.h"
|
||||
|
||||
using namespace clang::ast_matchers;
|
||||
|
||||
namespace clang {
|
||||
namespace tidy {
|
||||
namespace cert {
|
||||
|
||||
void LimitedRandomnessCheck::registerMatchers(MatchFinder *Finder) {
|
||||
Finder->addMatcher(callExpr(callee(functionDecl(namedDecl(hasName("::rand")),
|
||||
parameterCountIs(0))))
|
||||
.bind("randomGenerator"),
|
||||
this);
|
||||
}
|
||||
|
||||
void LimitedRandomnessCheck::check(const MatchFinder::MatchResult &Result) {
|
||||
std::string msg = "";
|
||||
if (getLangOpts().CPlusPlus)
|
||||
msg = "; use C++11 random library instead";
|
||||
|
||||
const auto *MatchedDecl = Result.Nodes.getNodeAs<CallExpr>("randomGenerator");
|
||||
diag(MatchedDecl->getLocStart(),
|
||||
"rand() has limited randomness" + msg);
|
||||
}
|
||||
|
||||
} // namespace cert
|
||||
} // namespace tidy
|
||||
} // namespace clang
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
//===--- LimitedRandomnessCheck.h - clang-tidy-------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_LIMITED_RANDOMNESS_H
|
||||
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_LIMITED_RANDOMNESS_H
|
||||
|
||||
#include "../ClangTidy.h"
|
||||
|
||||
namespace clang {
|
||||
namespace tidy {
|
||||
namespace cert {
|
||||
|
||||
/// Pseudorandom number generators are not genuinely random. The result of the
|
||||
/// std::rand() function makes no guarantees as to the quality of the random
|
||||
/// sequence produced.
|
||||
/// This check warns for the usage of std::rand() function.
|
||||
///
|
||||
/// For the user-facing documentation see:
|
||||
/// http://clang.llvm.org/extra/clang-tidy/checks/cert-msc50-cpp.html
|
||||
class LimitedRandomnessCheck : public ClangTidyCheck {
|
||||
public:
|
||||
LimitedRandomnessCheck(StringRef Name, ClangTidyContext *Context)
|
||||
: ClangTidyCheck(Name, Context) {}
|
||||
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
|
||||
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
|
||||
};
|
||||
|
||||
} // namespace cert
|
||||
} // namespace tidy
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_LIMITED_RANDOMNESS_H
|
|
@ -0,0 +1,7 @@
|
|||
.. title:: clang-tidy - cert-msc30-c
|
||||
|
||||
cert-msc30-c
|
||||
============
|
||||
|
||||
The cert-msc30-c check is an alias, please see
|
||||
`cert-msc50-cpp <cert-msc50-cpp.html>`_ for more information.
|
|
@ -0,0 +1,6 @@
|
|||
.. title:: clang-tidy - cert-msc50-cpp
|
||||
|
||||
cert-msc50-cpp
|
||||
==============
|
||||
|
||||
Pseudorandom number generators use mathematical algorithms to produce a sequence of numbers with good statistical properties, but the numbers produced are not genuinely random. The ``std::rand()`` function takes a seed (number), runs a mathematical operation on it and returns the result. By manipulating the seed the result can be predictible. This check warns for the usage of ``std::rand()``.
|
|
@ -18,6 +18,8 @@ Clang-Tidy Checks
|
|||
cert-err61-cpp (redirects to misc-throw-by-value-catch-by-reference) <cert-err61-cpp>
|
||||
cert-fio38-c (redirects to misc-non-copyable-objects) <cert-fio38-c>
|
||||
cert-flp30-c
|
||||
cert-msc30-c (redirects to cert-limited-randomness) <cert-msc30-c>
|
||||
cert-msc50-cpp
|
||||
cert-oop11-cpp (redirects to misc-move-constructor-init) <cert-oop11-cpp>
|
||||
cppcoreguidelines-interfaces-global-init
|
||||
cppcoreguidelines-pro-bounds-array-to-pointer-decay
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: %check_clang_tidy %s cert-msc30-c %t
|
||||
|
||||
extern int rand(void);
|
||||
int nonrand();
|
||||
|
||||
int cTest() {
|
||||
int i = rand();
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: rand() has limited randomness [cert-msc30-c]
|
||||
|
||||
int k = nonrand();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
// RUN: %check_clang_tidy %s cert-msc50-cpp %t
|
||||
|
||||
int rand();
|
||||
int rand(int);
|
||||
|
||||
namespace std {
|
||||
using ::rand;
|
||||
}
|
||||
|
||||
namespace nonstd {
|
||||
int rand();
|
||||
}
|
||||
|
||||
void testFunction1() {
|
||||
int i = std::rand();
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: rand() has limited randomness; use C++11 random library instead [cert-msc50-cpp]
|
||||
|
||||
int j = ::rand();
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: rand() has limited randomness; use C++11 random library instead [cert-msc50-cpp]
|
||||
|
||||
int k = rand(i);
|
||||
|
||||
int l = nonstd::rand();
|
||||
|
||||
int m = rand();
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: rand() has limited randomness; use C++11 random library instead [cert-msc50-cpp]
|
||||
}
|
||||
|
Loading…
Reference in New Issue