[PATCH] D56657: [clang-tidy] bugprone-string-constructor: Catch string from nullptr.
Clement Courbet via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 16 00:40:12 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rCTE351308: [clang-tidy] bugprone-string-constructor: Catch string from nullptr. (authored by courbet, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D56657?vs=181985&id=181986#toc
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56657/new/
https://reviews.llvm.org/D56657
Files:
clang-tidy/bugprone/StringConstructorCheck.cpp
test/clang-tidy/bugprone-string-constructor.cpp
Index: test/clang-tidy/bugprone-string-constructor.cpp
===================================================================
--- test/clang-tidy/bugprone-string-constructor.cpp
+++ test/clang-tidy/bugprone-string-constructor.cpp
@@ -9,6 +9,7 @@
struct basic_string {
basic_string();
basic_string(const C*, unsigned int size);
+ basic_string(const C *, const A &allocator = A());
basic_string(unsigned int size, C c);
};
typedef basic_string<char> string;
@@ -45,6 +46,15 @@
// CHECK-MESSAGES: [[@LINE-1]]:15: warning: length is bigger then string literal size
std::string q5(kText3, 0x1000000);
// CHECK-MESSAGES: [[@LINE-1]]:15: warning: suspicious large length parameter
+ std::string q6(nullptr);
+ // CHECK-MESSAGES: [[@LINE-1]]:15: warning: constructing string from nullptr is undefined behaviour
+ std::string q7 = 0;
+ // CHECK-MESSAGES: [[@LINE-1]]:20: warning: constructing string from nullptr is undefined behaviour
+}
+
+std::string StringFromZero() {
+ return 0;
+ // CHECK-MESSAGES: [[@LINE-1]]:10: warning: constructing string from nullptr is undefined behaviour
}
void Valid() {
@@ -53,4 +63,5 @@
std::wstring wstr(4, L'x');
std::string s1("test", 4);
std::string s2("test", 3);
+ std::string s3("test");
}
Index: clang-tidy/bugprone/StringConstructorCheck.cpp
===================================================================
--- clang-tidy/bugprone/StringConstructorCheck.cpp
+++ clang-tidy/bugprone/StringConstructorCheck.cpp
@@ -100,6 +100,15 @@
integerLiteral().bind("int"))))))
.bind("constructor"),
this);
+
+ // Check the literal string constructor with char pointer.
+ // [i.e. string (const char* s);]
+ Finder->addMatcher(
+ cxxConstructExpr(hasDeclaration(cxxMethodDecl(hasName("basic_string"))),
+ hasArgument(0, expr().bind("from-ptr")),
+ hasArgument(1, unless(hasType(isInteger()))))
+ .bind("constructor"),
+ this);
}
void StringConstructorCheck::check(const MatchFinder::MatchResult &Result) {
@@ -128,6 +137,13 @@
if (Lit->getValue().ugt(Str->getLength())) {
diag(Loc, "length is bigger then string literal size");
}
+ } else if (const auto *Ptr = Result.Nodes.getNodeAs<Expr>("from-ptr")) {
+ Expr::EvalResult ConstPtr;
+ if (Ptr->EvaluateAsRValue(ConstPtr, Ctx) &&
+ ((ConstPtr.Val.isInt() && ConstPtr.Val.getInt().isNullValue()) ||
+ (ConstPtr.Val.isLValue() && ConstPtr.Val.isNullPointer()))) {
+ diag(Loc, "constructing string from nullptr is undefined behaviour");
+ }
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56657.181986.patch
Type: text/x-patch
Size: 2638 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190116/344b4fba/attachment.bin>
More information about the cfe-commits
mailing list