Bug 1475882 - clang-tidy: Enable misc-string-constructor check. r?andi draft
authorChris Peterson <cpeterson@mozilla.com>
Sat, 14 Jul 2018 23:41:55 -0700
changeset 819047 6d4e44b524c7d2f883076968877886a623f1e058
parent 819046 76df1c9bf67708141cc03effe9be5d24fa492d1a
child 819048 816f0f6ded5d2651258f6b8dcb77568b91aa7e52
push id116421
push usercpeterson@mozilla.com
push dateTue, 17 Jul 2018 01:36:52 +0000
reviewersandi
bugs1475882
milestone63.0a1
Bug 1475882 - clang-tidy: Enable misc-string-constructor check. r?andi Finds string constructors that are suspicious and probably errors. There are currently no misc-string-constructor warnings in mozilla-central! https://clang.llvm.org/extra/clang-tidy/checks/bugprone-string-constructor.html MozReview-Commit-ID: LyJt6wqOhg9
tools/clang-tidy/config.yaml
tools/clang-tidy/test/misc-string-constructor.cpp
tools/clang-tidy/test/misc-string-constructor.json
tools/clang-tidy/test/structures.h
--- a/tools/clang-tidy/config.yaml
+++ b/tools/clang-tidy/config.yaml
@@ -49,16 +49,18 @@ clang_checkers:
   - name: misc-bool-pointer-implicit-conversion
     publish: !!bool yes
   - name: misc-forward-declaration-namespace
     # Name with clang tidy 6.0. We are currently using 5.0
     # - name: bugprone-forward-declaration-namespace
     publish: !!bool yes
   - name: misc-macro-repeated-side-effects
     publish: !!bool yes
+  - name: misc-string-constructor
+    publish: !!bool yes
   - name: misc-suspicious-missing-comma
     publish: !!bool yes
   - name: misc-suspicious-semicolon
     publish: !!bool yes
   - name: misc-unused-using-decls
     publish: !!bool yes
   - name: modernize-avoid-bind
     publish: !!bool yes
new file mode 100644
--- /dev/null
+++ b/tools/clang-tidy/test/misc-string-constructor.cpp
@@ -0,0 +1,17 @@
+// https://clang.llvm.org/extra/clang-tidy/checks/bugprone-string-constructor.html
+
+#include "structures.h"
+
+void test()
+{
+  // A common mistake is to swap parameters to the ‘fill’ string-constructor.
+  std::string str('x', 50); // should be str(50, 'x')
+
+  // Calling the string-literal constructor with a length bigger than the
+  // literal is suspicious and adds extra random characters to the string.
+  std::string("test", 200);   // Will include random characters after "test".
+
+  // Creating an empty string from constructors with parameters is considered
+  // suspicious. The programmer should use the empty constructor instead.
+  std::string("test", 0);   // Creation of an empty string.
+}
new file mode 100644
--- /dev/null
+++ b/tools/clang-tidy/test/misc-string-constructor.json
@@ -0,0 +1,1 @@
+"[[\"warning\", \"string constructor parameters are probably swapped; expecting string(count, character)\", \"misc-string-constructor\"], [\"warning\", \"length is bigger then string literal size\", \"misc-string-constructor\"], [\"warning\", \"constructor creating an empty string\", \"misc-string-constructor\"]]"
\ No newline at end of file
--- a/tools/clang-tidy/test/structures.h
+++ b/tools/clang-tidy/test/structures.h
@@ -32,17 +32,19 @@ class vector {
   const_iterator end() const;
 };
 
 template <typename T>
 class basic_string {
 public:
   typedef basic_string<T> _Type;
   basic_string() {}
-   basic_string(const T *p);
+  basic_string(const T *p);
+  basic_string(const T *p, size_t count);
+  basic_string(size_t count, char ch);
   ~basic_string() {}
   size_t size() const;
   bool empty() const;
   size_t find (const char* s, size_t pos = 0) const;
   const T *c_str() const;
   _Type& assign(const T *s);
   basic_string<T> *operator+=(const basic_string<T> &) {}
   friend basic_string<T> operator+(const basic_string<T> &, const basic_string<T> &) {}