| // RUN: %clang_cc1 -Wno-unused-value -Wunsafe-buffer-usage -fsafe-buffer-usage-suggestions \ |
| // RUN: -mllvm -debug-only=SafeBuffers \ |
| // RUN: -std=c++20 -verify=expected %s |
| |
| // RUN: %clang_cc1 -Wno-unused-value -Wunsafe-buffer-usage -fsafe-buffer-usage-suggestions \ |
| // RUN: -mllvm -debug-only=SafeBuffers \ |
| // RUN: -std=c++20 %s \ |
| // RUN: 2>&1 | grep 'The unclaimed DRE trace:' \ |
| // RUN: | sed 's/^The unclaimed DRE trace://' \ |
| // RUN: | %analyze_safe_buffer_debug_notes \ |
| // RUN: | FileCheck %s |
| |
| // This debugging facility is only available in debug builds. |
| // |
| // REQUIRES: asserts |
| // REQUIRES: shell |
| |
| void test_unclaimed_use(int *p) { // expected-warning{{'p' is an unsafe pointer used for buffer access}} |
| p++; // expected-note{{used in pointer arithmetic here}} \ |
| expected-note{{safe buffers debug: failed to produce fixit for 'p' : has an unclaimed use\n \ |
| The unclaimed DRE trace: DeclRefExpr, UnaryOperator(++), CompoundStmt}} |
| *((p + 1) + 1); // expected-warning{{unsafe pointer arithmetic}} \ |
| expected-note{{used in pointer arithmetic here}} \ |
| expected-note{{safe buffers debug: failed to produce fixit for 'p' : has an unclaimed use\n \ |
| The unclaimed DRE trace: DeclRefExpr, ImplicitCastExpr(LValueToRValue), BinaryOperator(+), ParenExpr, BinaryOperator(+), ParenExpr, UnaryOperator(*), CompoundStmt}} |
| p -= 1; // expected-note{{used in pointer arithmetic here}} \ |
| expected-note{{safe buffers debug: failed to produce fixit for 'p' : has an unclaimed use\n \ |
| The unclaimed DRE trace: DeclRefExpr, BinaryOperator(-=), CompoundStmt}} |
| p--; // expected-note{{used in pointer arithmetic here}} \ |
| expected-note{{safe buffers debug: failed to produce fixit for 'p' : has an unclaimed use\n \ |
| The unclaimed DRE trace: DeclRefExpr, UnaryOperator(--), CompoundStmt}} |
| p[5] = 5; // expected-note{{used in buffer access here}} |
| } |
| |
| // CHECK: Root # 1 |
| // CHECK: |- DeclRefExpr # 4 |
| // CHECK: |-- UnaryOperator(++) # 1 |
| // CHECK: |--- CompoundStmt # 1 |
| // CHECK: |-- ImplicitCastExpr(LValueToRValue) # 1 |
| // CHECK: |--- BinaryOperator(+) # 1 |
| // CHECK: |---- ParenExpr # 1 |
| // CHECK: |----- BinaryOperator(+) # 1 |
| // CHECK: |------ ParenExpr # 1 |
| // CHECK: |------- UnaryOperator(*) # 1 |
| // CHECK: |-------- CompoundStmt # 1 |
| // CHECK: |-- BinaryOperator(-=) # 1 |
| // CHECK: |--- CompoundStmt # 1 |
| // CHECK: |-- UnaryOperator(--) # 1 |
| // CHECK: |--- CompoundStmt # 1 |