Author: aaronballman Date: Fri Feb 19 08:03:20 2016 New Revision: 261324 URL: http://llvm.org/viewvc/llvm-project?rev=261324&view=rev Log: Add a new check, cert-flp30-c, that diagnoses loop induction expressions of floating-point type. This check corresponds to the CERT secure coding rule: https://www.securecoding.cert.org/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters
Added: clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.cpp clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.h clang-tools-extra/trunk/docs/clang-tidy/checks/cert-flp30-c.rst clang-tools-extra/trunk/test/clang-tidy/cert-flp30-c.c Modified: clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Modified: clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp?rev=261324&r1=261323&r2=261324&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp Fri Feb 19 08:03:20 2016 @@ -16,6 +16,7 @@ #include "../misc/NonCopyableObjects.h" #include "../misc/StaticAssertCheck.h" #include "../misc/ThrowByValueCatchByReferenceCheck.h" +#include "FloatLoopCounter.h" #include "SetLongJmpCheck.h" #include "StaticObjectExceptionCheck.h" #include "ThrownExceptionTypeCheck.h" @@ -53,7 +54,9 @@ public: // DCL CheckFactories.registerCheck<StaticAssertCheck>( "cert-dcl03-c"); - + // FLP + CheckFactories.registerCheck<FloatLoopCounter>( + "cert-flp30-c"); // FIO CheckFactories.registerCheck<NonCopyableObjectsCheck>( "cert-fio38-c"); Modified: clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt?rev=261324&r1=261323&r2=261324&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt Fri Feb 19 08:03:20 2016 @@ -2,6 +2,7 @@ set(LLVM_LINK_COMPONENTS support) add_clang_library(clangTidyCERTModule CERTTidyModule.cpp + FloatLoopCounter.cpp SetLongJmpCheck.cpp StaticObjectExceptionCheck.cpp ThrownExceptionTypeCheck.cpp Added: clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.cpp?rev=261324&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.cpp (added) +++ clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.cpp Fri Feb 19 08:03:20 2016 @@ -0,0 +1,35 @@ +//===--- FloatLoopCounter.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 "FloatLoopCounter.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace cert { + +void FloatLoopCounter::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher( + forStmt(hasIncrement(expr(hasType(realFloatingPointType())))).bind("for"), + this); +} + +void FloatLoopCounter::check(const MatchFinder::MatchResult &Result) { + const auto *FS = Result.Nodes.getNodeAs<ForStmt>("for"); + + diag(FS->getInc()->getExprLoc(), "loop induction expression should not have " + "floating-point type"); +} + +} // namespace cert +} // namespace tidy +} // namespace clang Added: clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.h?rev=261324&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.h (added) +++ clang-tools-extra/trunk/clang-tidy/cert/FloatLoopCounter.h Fri Feb 19 08:03:20 2016 @@ -0,0 +1,37 @@ +//===--- FloatLoopCounter.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_FLOAT_LOOP_COUNTER_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_FLOAT_LOOP_COUNTER_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace cert { + +/// This check diagnoses when the loop induction expression of a for loop has +/// floating-point type. The check corresponds to: +/// https://www.securecoding.cert.org/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/cert-flp30-c.html +class FloatLoopCounter : public ClangTidyCheck { +public: + FloatLoopCounter(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_FLOAT_LOOP_COUNTER_H Added: clang-tools-extra/trunk/docs/clang-tidy/checks/cert-flp30-c.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/cert-flp30-c.rst?rev=261324&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/cert-flp30-c.rst (added) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/cert-flp30-c.rst Fri Feb 19 08:03:20 2016 @@ -0,0 +1,11 @@ +.. title:: clang-tidy - cert-flp30-c + +cert-flp30-c +============ + +This check flags ``for`` loops where the induction expression has a floating- +point type. + +This check corresponds to the CERT C Coding Standard rule +`FLP30-C. Do not use floating-point variables as loop counters +<https://www.securecoding.cert.org/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters>`_. Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=261324&r1=261323&r2=261324&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Fri Feb 19 08:03:20 2016 @@ -13,6 +13,7 @@ Clang-Tidy Checks cert-err60-cpp 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-oop11-cpp (redirects to misc-move-constructor-init) <cert-oop11-cpp> cppcoreguidelines-pro-bounds-array-to-pointer-decay cppcoreguidelines-pro-bounds-constant-array-index Added: clang-tools-extra/trunk/test/clang-tidy/cert-flp30-c.c URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/cert-flp30-c.c?rev=261324&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/cert-flp30-c.c (added) +++ clang-tools-extra/trunk/test/clang-tidy/cert-flp30-c.c Fri Feb 19 08:03:20 2016 @@ -0,0 +1,19 @@ +// RUN: %check_clang_tidy %s cert-flp30-c %t + +float g(void); + +void func(void) { + for (float x = 0.1f; x <= 1.0f; x += 0.1f) {} + // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: loop induction expression should not have floating-point type [cert-flp30-c] + + float f = 1.0f; + for (; f > 0; --f) {} + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: loop induction expression + + for (;;g()) {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: loop induction expression + + for (int i = 0; i < 10; i += 1.0f) {} + + for (int i = 0; i < 10; ++i) {} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits