================
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage -verify %s
+
+namespace std {
+  typedef __SIZE_TYPE__ size_t;
+
+  template <typename CharT>
+  class basic_string_view {
+  public:
+    basic_string_view(const CharT *s, size_t count);
+    basic_string_view(const CharT *s);
+    template <typename It>
+    basic_string_view(It begin, It end);
+  };
+
+  using string_view = basic_string_view<char>;
+}
+
+void test_string_view_scenarios(const char *ptr, std::size_t n) {
+  // --- UNSAFE CASES ---
+  std::string_view sv1(ptr, n);
+  // expected-warning@-1 {{the two-parameter std::string_view construction is 
unsafe as it can introduce mismatch between buffer size and the bound 
information}}
+
+  // --- SAFE CASES (Should NOT warn for string_view construction) ---
+  std::string_view sv2("hello", 5);     // Safe: String literal match
+  std::string_view sv3(ptr, 0);          // Safe: Zero size
+  std::string_view sv4(ptr);             // Safe: Single parameter
+
+  // Note: 'ptr + 5' triggers general pointer arithmetic warning,
+  // but the string_view constructor itself is ignored by your gadget.
+  std::string_view sv5(ptr, ptr + 5); // expected-warning {{unsafe pointer 
arithmetic}} \
----------------
rohanjr wrote:

Can we add a test for this constructor that doesn't trigger an error? E.g. with 
`s.begin()` and `s.end()` as arguments? I think that would also exercise the 
code path where the argument types are record/object types (not pointers).

https://github.com/llvm/llvm-project/pull/180471
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to