summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/dangling-internal-buffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Analysis/dangling-internal-buffer.cpp')
-rw-r--r--clang/test/Analysis/dangling-internal-buffer.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/clang/test/Analysis/dangling-internal-buffer.cpp b/clang/test/Analysis/dangling-internal-buffer.cpp
index cd7ebb17c66..c4228f4e32d 100644
--- a/clang/test/Analysis/dangling-internal-buffer.cpp
+++ b/clang/test/Analysis/dangling-internal-buffer.cpp
@@ -6,7 +6,7 @@ template< typename CharT >
class basic_string {
public:
~basic_string();
- const CharT *c_str();
+ const CharT *c_str() const;
};
typedef basic_string<char> string;
@@ -25,8 +25,20 @@ void deref_after_scope_char() {
const char *c;
{
std::string s;
- c = s.c_str();
+ c = s.c_str(); // expected-note {{Pointer to dangling buffer was obtained here}}
+ } // expected-note {{Internal buffer is released because the object was destroyed}}
+ consume(c); // expected-warning {{Use of memory after it is freed}}
+ // expected-note@-1 {{Use of memory after it is freed}}
+}
+
+void deref_after_scope_char2() {
+ const char *c;
+ {
+ std::string s;
+ c = s.c_str(); // expected-note {{Pointer to dangling buffer was obtained here}}
} // expected-note {{Internal buffer is released because the object was destroyed}}
+ std::string s;
+ const char *c2 = s.c_str();
consume(c); // expected-warning {{Use of memory after it is freed}}
// expected-note@-1 {{Use of memory after it is freed}}
}
@@ -35,7 +47,7 @@ void deref_after_scope_wchar_t() {
const wchar_t *w;
{
std::wstring ws;
- w = ws.c_str();
+ w = ws.c_str(); // expected-note {{Pointer to dangling buffer was obtained here}}
} // expected-note {{Internal buffer is released because the object was destroyed}}
consume(w); // expected-warning {{Use of memory after it is freed}}
// expected-note@-1 {{Use of memory after it is freed}}
@@ -45,7 +57,7 @@ void deref_after_scope_char16_t() {
const char16_t *c16;
{
std::u16string s16;
- c16 = s16.c_str();
+ c16 = s16.c_str(); // expected-note {{Pointer to dangling buffer was obtained here}}
} // expected-note {{Internal buffer is released because the object was destroyed}}
consume(c16); // expected-warning {{Use of memory after it is freed}}
// expected-note@-1 {{Use of memory after it is freed}}
@@ -55,7 +67,7 @@ void deref_after_scope_char32_t() {
const char32_t *c32;
{
std::u32string s32;
- c32 = s32.c_str();
+ c32 = s32.c_str(); // expected-note {{Pointer to dangling buffer was obtained here}}
} // expected-note {{Internal buffer is released because the object was destroyed}}
consume(c32); // expected-warning {{Use of memory after it is freed}}
// expected-note@-1 {{Use of memory after it is freed}}
OpenPOWER on IntegriCloud