brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 63319d9 Raw
73 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.core.StoreToImmutable -std=c++17 -verify %s2 3void test_write_to_const_ref_param(const int &param) {4  *(int*)&param = 100; // expected-warning {{Trying to write to immutable memory}}5}6 7// FIXME: This should warn in C mode too.8void test_write_to_string_literal() {9  char *str = (char*)"hello";10  str[0] = 'H'; // expected-warning {{Trying to write to immutable memory}}11}12 13struct ParamStruct {14  const int z; // expected-note {{Memory region is declared as immutable here}}15  int w;16};17 18void test_write_to_const_struct_ref_param(const ParamStruct &s) {19  *(int*)&s.z = 100; // expected-warning {{Trying to write to immutable memory}}20}21 22void test_const_ref_to_nonconst_data() {23  int data = 42;24  const int &ref = data;25  *(int*)&ref = 100; // No warning expected26} 27 28void test_const_ref_to_const_data() {29  const int data = 42; // expected-note {{Memory region is declared as immutable here}}30  const int &ref = data;31  *(int*)&ref = 100; // expected-warning {{Trying to write to immutable memory}}32} 33 34void test_ref_to_nonconst_data() {35  int data = 42;36  int &ref = data;37  ref = 100; // No warning expected38}39 40void test_ref_to_const_data() {41  const int data = 42; // expected-note {{Memory region is declared as immutable here}}42  int &ref = *(int*)&data;43  ref = 100; // expected-warning {{Trying to write to immutable memory}}44}45 46struct MultipleLayerStruct {47  MultipleLayerStruct();48  const int data; // expected-note {{Memory region is declared as immutable here}}49  const int buf[10]; // expected-note {{Enclosing memory region is declared as immutable here}}50};51 52MultipleLayerStruct MLS[10];53 54void test_multiple_layer_struct_array_member() {55  int *p = (int*)&MLS[2].data;56  *p = 4; // expected-warning {{Trying to write to immutable memory}}57}58 59void test_multiple_layer_struct_array_array_member() {60  int *p = (int*)&MLS[2].buf[3];61  *p = 4; // expected-warning {{Trying to write to immutable memory}}62}63 64struct StructWithNonConstMember {65  int x;66};67 68const StructWithNonConstMember SWNCM{0}; // expected-note {{Enclosing memory region is declared as immutable here}}69 70void test_write_to_non_const_member_of_const_struct() {71  *(int*)&SWNCM.x = 100; // expected-warning {{Trying to write to immutable memory in global read-only storage}}72}73