casts.c revision 959922647e5061fc20f983d0e85e3f7fb8421457
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/types.h> 7#include <sys/socket.h> 8 9void f(int sock) { 10 struct sockaddr_storage storage; 11 struct sockaddr* sockaddr = (struct sockaddr*)&storage; 12 socklen_t addrlen = sizeof(storage); 13 getsockname(sock, sockaddr, &addrlen); 14 switch (sockaddr->sa_family) { // no-warning 15 default: 16 ; 17 } 18} 19 20struct s { 21 struct s *value; 22}; 23 24void f1(struct s **pval) { 25 int *tbool = ((void*)0); 26 struct s *t = *pval; 27 pval = &(t->value); 28 tbool = (int *)pval; // Should record the cast-to type here. 29 char c = (unsigned char) *tbool; // Should use cast-to type to create symbol. 30 if (*tbool == -1) 31 3; 32} 33 34void f2(const char *str) { 35 unsigned char ch, cl, *p; 36 37 p = (unsigned char *)str; 38 ch = *p++; // use cast-to type 'unsigned char' to create element region. 39 cl = *p++; 40 if(!cl) 41 cl = 'a'; 42} 43