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
--- 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> &) {}