r345990 - [analyzer] Put llvm.Conventions back in alpha
Galina Kistanova via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 2 11:20:31 PDT 2018
Hello Kristof,
It looks like this commit added broken tests to couple of our builders:
http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast
http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win
. . .
Clang :: Analysis/analyzer-list-configs.c
Please have a look?
The builders were already red and did not send any notifications.
Please have a look?
Thanks
Galina
On Fri, Nov 2, 2018 at 9:04 AM Kristof Umann via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: szelethus
> Date: Fri Nov 2 09:02:10 2018
> New Revision: 345990
>
> URL: http://llvm.org/viewvc/llvm-project?rev=345990&view=rev
> Log:
> [analyzer] Put llvm.Conventions back in alpha
>
> Interestingly, this many year old (when I last looked I remember 2010ish)
> checker was committed without any tests, so I thought I'd implement them,
> but I
> was shocked to see how I barely managed to get it working. The code is
> severely
> outdated, I'm not even sure it has ever been used, so I'd propose to move
> it
> back into alpha, and possibly even remove it.
>
> Differential Revision: https://reviews.llvm.org/D53856
>
> Added:
> cfe/trunk/test/Analysis/llvm-conventions.cpp
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
> cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp
> cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h
> cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp
> cfe/trunk/test/Analysis/inner-pointer.cpp
> cfe/trunk/test/Analysis/temporaries.cpp
> cfe/trunk/www/analyzer/alpha_checks.html
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td Fri Nov 2
> 09:02:10 2018
> @@ -83,6 +83,7 @@ def LocalizabilityOptIn : Package<"local
> def MPI : Package<"mpi">, InPackage<OptIn>;
>
> def LLVM : Package<"llvm">;
> +def LLVMAlpha : Package<"llvm">, InPackage<Alpha>, Hidden;
>
> // The APIModeling package is for checkers that model APIs and don't
> perform
> // any diagnostics. These checkers are always turned on; this package is
> @@ -730,7 +731,7 @@ let ParentPackage = MPI in {
>
> //===----------------------------------------------------------------------===//
>
> def LLVMConventionsChecker : Checker<"Conventions">,
> - InPackage<LLVM>,
> + InPackage<LLVMAlpha>,
> HelpText<"Check code for LLVM codebase conventions">,
> DescFile<"LLVMConventionsChecker.cpp">;
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp Fri
> Nov 2 09:02:10 2018
> @@ -32,8 +32,7 @@ static bool IsLLVMStringRef(QualType T)
> if (!RT)
> return false;
>
> - return StringRef(QualType(RT, 0).getAsString()) ==
> - "class StringRef";
> + return StringRef(QualType(RT, 0).getAsString()) == "class StringRef";
> }
>
> /// Check whether the declaration is semantically inside the top-level
>
> Modified: cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h (original)
> +++ cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h Fri Nov
> 2 09:02:10 2018
> @@ -12,6 +12,13 @@ typedef __typeof__((char*)0-(char*)0) pt
> void *memmove(void *s1, const void *s2, size_t n);
>
> namespace std {
> + typedef size_t size_type;
> +#if __cplusplus >= 201103L
> + using nullptr_t = decltype(nullptr);
> +#endif
> +}
> +
> +namespace std {
> struct input_iterator_tag { };
> struct output_iterator_tag { };
> struct forward_iterator_tag : public input_iterator_tag { };
> @@ -517,6 +524,42 @@ namespace std {
> const T& front() const { return *begin(); }
> };
>
> + template <typename CharT>
> + class basic_string {
> + public:
> + basic_string();
> + basic_string(const CharT *s);
> +
> + ~basic_string();
> + void clear();
> +
> + basic_string &operator=(const basic_string &str);
> + basic_string &operator+=(const basic_string &str);
> +
> + const CharT *c_str() const;
> + const CharT *data() const;
> + CharT *data();
> +
> + basic_string &append(size_type count, CharT ch);
> + basic_string &assign(size_type count, CharT ch);
> + basic_string &erase(size_type index, size_type count);
> + basic_string &insert(size_type index, size_type count, CharT ch);
> + basic_string &replace(size_type pos, size_type count, const
> basic_string &str);
> + void pop_back();
> + void push_back(CharT ch);
> + void reserve(size_type new_cap);
> + void resize(size_type count);
> + void shrink_to_fit();
> + void swap(basic_string &other);
> + };
> +
> + typedef basic_string<char> string;
> + typedef basic_string<wchar_t> wstring;
> +#if __cplusplus >= 201103L
> + typedef basic_string<char16_t> u16string;
> + typedef basic_string<char32_t> u32string;
> +#endif
> +
> class exception {
> public:
> exception() throw();
>
> Modified: cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp (original)
> +++ cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp Fri Nov
> 2 09:02:10 2018
> @@ -19,6 +19,6 @@ class C {
> void testCopyNull(C *I, C *E) {
> std::copy(I, E, (C *)0);
> #ifndef SUPPRESSED
> - // expected-warning at ../Inputs/system-header-simulator-cxx.h:627
> {{Called C++ object pointer is null}}
> + // expected-warning at ../Inputs/system-header-simulator-cxx.h:668
> {{Called C++ object pointer is null}}
> #endif
> }
>
> Modified: cfe/trunk/test/Analysis/inner-pointer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inner-pointer.cpp?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/inner-pointer.cpp (original)
> +++ cfe/trunk/test/Analysis/inner-pointer.cpp Fri Nov 2 09:02:10 2018
> @@ -1,43 +1,9 @@
> -//RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.InnerPointer %s
> -analyzer-output=text -verify
> +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.InnerPointer \
> +// RUN: %s -analyzer-output=text -verify
>
> +#include "Inputs/system-header-simulator-cxx.h"
> namespace std {
>
> -typedef int size_type;
> -
> -template <typename CharT>
> -class basic_string {
> -public:
> - basic_string();
> - basic_string(const CharT *s);
> -
> - ~basic_string();
> - void clear();
> -
> - basic_string &operator=(const basic_string &str);
> - basic_string &operator+=(const basic_string &str);
> -
> - const CharT *c_str() const;
> - const CharT *data() const;
> - CharT *data();
> -
> - basic_string &append(size_type count, CharT ch);
> - basic_string &assign(size_type count, CharT ch);
> - basic_string &erase(size_type index, size_type count);
> - basic_string &insert(size_type index, size_type count, CharT ch);
> - basic_string &replace(size_type pos, size_type count, const
> basic_string &str);
> - void pop_back();
> - void push_back(CharT ch);
> - void reserve(size_type new_cap);
> - void resize(size_type count);
> - void shrink_to_fit();
> - void swap(basic_string &other);
> -};
> -
> -typedef basic_string<char> string;
> -typedef basic_string<wchar_t> wstring;
> -typedef basic_string<char16_t> u16string;
> -typedef basic_string<char32_t> u32string;
> -
> template <typename T>
> void func_ref(T &a);
>
>
> Added: cfe/trunk/test/Analysis/llvm-conventions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/llvm-conventions.cpp?rev=345990&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/llvm-conventions.cpp (added)
> +++ cfe/trunk/test/Analysis/llvm-conventions.cpp Fri Nov 2 09:02:10 2018
> @@ -0,0 +1,226 @@
> +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.llvm.Conventions \
> +// RUN: -std=c++14 -verify %s
> +
> +#include "Inputs/system-header-simulator-cxx.h"
> +
>
> +//===----------------------------------------------------------------------===//
> +// Forward declarations for StringRef tests.
>
> +//===----------------------------------------------------------------------===//
> +
> +using size_t = unsigned long;
> +using size_type = size_t;
> +
> +namespace std {
> +
> +template <class T>
> +struct numeric_limits { const static bool is_signed; };
> +
> +} // end of namespace std
> +
> +namespace llvm {
> +
> +template <class T>
> +struct iterator_range;
> +
> +template <class Func>
> +struct function_ref;
> +
> +struct hash_code;
> +
> +template <class T>
> +struct SmallVectorImpl;
> +
> +struct APInt;
> +
> +class StringRef {
> +public:
> + static const size_t npos = ~size_t(0);
> + using iterator = const char *;
> + using const_iterator = const char *;
> + using size_type = size_t;
> +
> + /*implicit*/ StringRef() = default;
> + StringRef(std::nullptr_t) = delete;
> + /*implicit*/ StringRef(const char *Str);
> + /*implicit*/ constexpr StringRef(const char *data, size_t length);
> + /*implicit*/ StringRef(const std::string &Str);
> +
> + static StringRef withNullAsEmpty(const char *data);
> + iterator begin() const;
> + iterator end() const;
> + const unsigned char *bytes_begin() const;
> + const unsigned char *bytes_end() const;
> + iterator_range<const unsigned char *> bytes() const;
> + const char *data() const;
> + bool empty() const;
> + size_t size() const;
> + char front() const;
> + char back() const;
> + template <typename Allocator>
> + StringRef copy(Allocator &A) const;
> + bool equals(StringRef RHS) const;
> + bool equals_lower(StringRef RHS) const;
> + int compare(StringRef RHS) const;
> + int compare_lower(StringRef RHS) const;
> + int compare_numeric(StringRef RHS) const;
> + unsigned edit_distance(StringRef Other, bool AllowReplacements = true,
> + unsigned MaxEditDistance = 0) const;
> + std::string str() const;
> + char operator[](size_t Index) const;
> + template <typename T>
> + typename std::enable_if<std::is_same<T, std::string>::value,
> + StringRef>::type &
> + operator=(T &&Str) = delete;
> + operator std::string() const;
> + bool startswith(StringRef Prefix) const;
> + bool startswith_lower(StringRef Prefix) const;
> + bool endswith(StringRef Suffix) const;
> + bool endswith_lower(StringRef Suffix) const;
> + size_t find(char C, size_t From = 0) const;
> + size_t find_lower(char C, size_t From = 0) const;
> + size_t find_if(function_ref<bool(char)> F, size_t From = 0) const;
> + size_t find_if_not(function_ref<bool(char)> F, size_t From = 0) const;
> + size_t find(StringRef Str, size_t From = 0) const;
> + size_t find_lower(StringRef Str, size_t From = 0) const;
> + size_t rfind(char C, size_t From = npos) const;
> + size_t rfind_lower(char C, size_t From = npos) const;
> + size_t rfind(StringRef Str) const;
> + size_t rfind_lower(StringRef Str) const;
> + size_t find_first_of(char C, size_t From = 0) const;
> + size_t find_first_of(StringRef Chars, size_t From = 0) const;
> + size_t find_first_not_of(char C, size_t From = 0) const;
> + size_t find_first_not_of(StringRef Chars, size_t From = 0) const;
> + size_t find_last_of(char C, size_t From = npos) const;
> + size_t find_last_of(StringRef Chars, size_t From = npos) const;
> + size_t find_last_not_of(char C, size_t From = npos) const;
> + size_t find_last_not_of(StringRef Chars, size_t From = npos) const;
> + bool contains(StringRef Other) const;
> + bool contains(char C) const;
> + bool contains_lower(StringRef Other) const;
> + bool contains_lower(char C) const;
> + size_t count(char C) const;
> + size_t count(StringRef Str) const;
> + template <typename T>
> + typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type
> + getAsInteger(unsigned Radix, T &Result) const;
> + template <typename T>
> + typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type
> + getAsInteger(unsigned Radix, T &Result) const;
> + template <typename T>
> + typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type
> + consumeInteger(unsigned Radix, T &Result);
> + template <typename T>
> + typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type
> + consumeInteger(unsigned Radix, T &Result);
> + bool getAsInteger(unsigned Radix, APInt &Result) const;
> + bool getAsDouble(double &Result, bool AllowInexact = true) const;
> + std::string lower() const;
> + std::string upper() const;
> + StringRef substr(size_t Start, size_t N = npos) const;
> + StringRef take_front(size_t N = 1) const;
> + StringRef take_back(size_t N = 1) const;
> + StringRef take_while(function_ref<bool(char)> F) const;
> + StringRef take_until(function_ref<bool(char)> F) const;
> + StringRef drop_front(size_t N = 1) const;
> + StringRef drop_back(size_t N = 1) const;
> + StringRef drop_while(function_ref<bool(char)> F) const;
> + StringRef drop_until(function_ref<bool(char)> F) const;
> + bool consume_front(StringRef Prefix);
> + bool consume_back(StringRef Suffix);
> + StringRef slice(size_t Start, size_t End) const;
> + std::pair<StringRef, StringRef> split(char Separator) const;
> + std::pair<StringRef, StringRef> split(StringRef Separator) const;
> + std::pair<StringRef, StringRef> rsplit(StringRef Separator) const;
> + void split(SmallVectorImpl<StringRef> &A,
> + StringRef Separator, int MaxSplit = -1,
> + bool KeepEmpty = true) const;
> + void split(SmallVectorImpl<StringRef> &A, char Separator, int MaxSplit
> = -1,
> + bool KeepEmpty = true) const;
> + std::pair<StringRef, StringRef> rsplit(char Separator) const;
> + StringRef ltrim(char Char) const;
> + StringRef ltrim(StringRef Chars = " \t\n\v\f\r") const;
> + StringRef rtrim(char Char) const;
> + StringRef rtrim(StringRef Chars = " \t\n\v\f\r") const;
> + StringRef trim(char Char) const;
> + StringRef trim(StringRef Chars = " \t\n\v\f\r") const;
> +};
> +
> +inline bool operator==(StringRef LHS, StringRef RHS);
> +inline bool operator!=(StringRef LHS, StringRef RHS);
> +inline bool operator<(StringRef LHS, StringRef RHS);
> +inline bool operator<=(StringRef LHS, StringRef RHS);
> +inline bool operator>(StringRef LHS, StringRef RHS);
> +inline bool operator>=(StringRef LHS, StringRef RHS);
> +inline std::string &operator+=(std::string &buffer, StringRef string);
> +hash_code hash_value(StringRef S);
> +template <typename T> struct isPodLike;
> +template <> struct isPodLike<StringRef> { static const bool value = true;
> };
> +
> +} // end of namespace llvm
> +
>
> +//===----------------------------------------------------------------------===//
> +// Tests for StringRef.
>
> +//===----------------------------------------------------------------------===//
> +
> +void temporarayStringToStringRefAssignmentTest() {
> + // TODO: Emit a warning.
> + llvm::StringRef Ref = std::string("Yimmy yummy test.");
> +}
> +
> +void assigningStringToStringRefWithLongerLifetimeTest() {
> + llvm::StringRef Ref;
> + {
> + // TODO: Emit a warning.
> + std::string TmpStr("This is a fine string.");
> + Ref = TmpStr;
> + }
> +}
> +
> +std::string getTemporaryString() {
> + return "One two three.";
> +}
> +
> +void assigningTempStringFromFunctionToStringRefTest() {
> + // TODO: Emit a warning.
> + llvm::StringRef Ref = getTemporaryString();
> +}
> +
>
> +//===----------------------------------------------------------------------===//
> +// Forward declaration for Clang AST nodes.
>
> +//===----------------------------------------------------------------------===//
> +
> +namespace llvm {
> +
> +template <class T, int Size>
> +struct SmallVector {};
> +
> +} // end of namespace llvm
> +
> +namespace clang {
> +
> +struct Type;
> +struct Decl;
> +struct Stmt;
> +struct Attr;
> +
> +} // end of namespace clang
> +
>
> +//===----------------------------------------------------------------------===//
> +// Tests for Clang AST nodes.
>
> +//===----------------------------------------------------------------------===//
> +
> +namespace clang {
> +
> +struct Type {
> + std::string str; // expected-warning{{AST class 'Type' has a field
> 'str' that allocates heap memory (type std::string)}}
> +};
> +
> +} // end of namespace clang
> +
> +namespace clang {
> +
> +struct Decl {
> + llvm::SmallVector<int, 5> Vec; // expected-warning{{AST class 'Decl'
> has a field 'Vec' that allocates heap memory (type llvm::SmallVector<int,
> 5>)}}
> +};
> +
> +} // end of namespace clang
>
> Modified: cfe/trunk/test/Analysis/temporaries.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/temporaries.cpp?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/temporaries.cpp (original)
> +++ cfe/trunk/test/Analysis/temporaries.cpp Fri Nov 2 09:02:10 2018
> @@ -9,7 +9,7 @@ extern bool clang_analyzer_eval(bool);
> extern bool clang_analyzer_warnIfReached();
> void clang_analyzer_checkInlined(bool);
>
> -#include "Inputs/system-header-simulator-cxx.h";
> +#include "Inputs/system-header-simulator-cxx.h"
>
> struct Trivial {
> Trivial(int x) : value(x) {}
>
> Modified: cfe/trunk/www/analyzer/alpha_checks.html
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/www/analyzer/alpha_checks.html?rev=345990&r1=345989&r2=345990&view=diff
>
> ==============================================================================
> --- cfe/trunk/www/analyzer/alpha_checks.html (original)
> +++ cfe/trunk/www/analyzer/alpha_checks.html Fri Nov 2 09:02:10 2018
> @@ -27,6 +27,7 @@ Patches welcome!
> <li><a href="#clone_alpha_checkers">Clone Alpha Checkers</a></li>
> <li><a href="#core_alpha_checkers">Core Alpha Checkers</a></li>
> <li><a href="#cplusplus_alpha_checkers">C++ Alpha Checkers</a></li>
> +<li><a href="#llvm_alpha_checkers">LLVM Checkers</a></li>
> <li><a href="#valist_alpha_checkers">Variable Argument Alpha
> Checkers</a></li>
> <li><a href="#deadcode_alpha_checkers">Dead Code Alpha Checkers</a></li>
> <li><a href="#osx_alpha_checkers">OS X Alpha Checkers</a></li>
> @@ -583,6 +584,31 @@ void test(id x) {
> </pre></div></div></td></tr>
> </tbody></table>
>
> +<!-- =========================== llvm alpha ===========================
> -->
> +<h3 id="llvm_alpha_checkers">LLVM Checkers</h3>
> +<table class="checkers">
> +<colgroup><col class="namedescr"><col class="example"></colgroup>
> +<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
> +
> +<tbody>
> +<tr><td><div class="namedescr expandable"><span class="name">
> +alpha.llvm.Conventions</span><span class="lang">
> +(C)</span><div class="descr">
> +Check code for LLVM codebase conventions:
> +<ul>
> + <li>A <code>StringRef</code> should not be bound to a temporary
> std::string
> + whose lifetime is shorter than the <code>StringRef</code>'s.</li>
> + <li>Clang AST nodes should not have fields that can allocate
> memory.</li>
> +</ul>
> +</div></div></td>
> +<td><div class="exampleContainer expandable">
> +<div class="example"><pre>
> +<!-- TODO: Add examples, as currently it's hard to get this checker
> working. -->
> +</pre></div></div></td></tr>
> +
> +</tbody></table>
> +
> +
> <!-- ============================== OS X alpha
> ============================== -->
> <h3 id="osx_alpha_checkers">OS X Alpha Checkers</h3>
> <table class="checkers">
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181102/16b3e0eb/attachment-0001.html>
More information about the cfe-commits
mailing list