casts.c revision 45257c37a4e9a8f915661e0f964aec375909eb4c
1// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region --verify %s 2 3// Test if the 'storage' region gets properly initialized after it is cast to 4// 'struct sockaddr *'. 5 6#include <sys/socket.h> 7void f(int sock) { 8 struct sockaddr_storage storage; 9 struct sockaddr* sockaddr = (struct sockaddr*)&storage; 10 socklen_t addrlen = sizeof(storage); 11 getsockname(sock, sockaddr, &addrlen); 12 switch (sockaddr->sa_family) { // no-warning 13 default: 14 ; 15 } 16} 17 18struct s { 19 struct s *value; 20}; 21 22int f1(struct s **pval) { 23 int *tbool = ((void*)0); 24 struct s *t = *pval; 25 pval = &(t->value); 26 tbool = (int *)pval; // Should record the cast-to type here. 27 char c = (unsigned char) *tbool; // Should use cast-to type to create symbol. 28 if (*tbool == -1) 29 3; 30} 31 32void f2(const char *str) { 33 unsigned char ch, cl, *p; 34 35 p = (unsigned char *)str; 36 ch = *p++; // use cast-to type 'unsigned char' to create element region. 37 cl = *p++; 38 if(!cl) 39 cl = 'a'; 40} 41