50 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \2// RUN: -fsafe-buffer-usage-suggestions \3// RUN: -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s4 5void unsafe_array_func_ptr_call(void (*fn_ptr)(int *param)) {6 int p[32];7 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 32> p"8 9 int idx;10 p[idx] = 10;11 fn_ptr(p);12 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"13}14 15void unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {16 int *p;17 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "18 19 p[5] = 10;20 fn_ptr(p);21 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"22}23 24void addr_of_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {25 int *p;26 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "27 28 p[5] = 10;29 fn_ptr(&p[0]);30 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"p.data()"31}32 33void addr_of_unsafe_ptr_w_offset_func_ptr_call(void (*fn_ptr)(int *param)) {34 int *p;35 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "36 37 p[5] = 10;38 fn_ptr(&p[3]);39 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"&p.data()[3]"40}41 42void preincrement_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {43 int *p;44 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "45 46 p[5] = 10;47 fn_ptr(++p);48 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:13}:"(p = p.subspan(1)).data()"49}50