1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify %s 2cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify %s 38e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics 4c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu 5b1080ed5016db4466fbe69d771c05672de39ec3eZhongxing Xu// Test if the 'storage' region gets properly initialized after it is cast to 6b1080ed5016db4466fbe69d771c05672de39ec3eZhongxing Xu// 'struct sockaddr *'. 7b1080ed5016db4466fbe69d771c05672de39ec3eZhongxing Xu 8caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenektypedef unsigned char __uint8_t; 9caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenektypedef unsigned int __uint32_t; 10caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenektypedef __uint32_t __darwin_socklen_t; 11caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenektypedef __uint8_t sa_family_t; 12caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenektypedef __darwin_socklen_t socklen_t; 13caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenekstruct sockaddr { sa_family_t sa_family; }; 14caac0899b528102b88a7d49d3324d7b39d2ae88dTed Kremenekstruct sockaddr_storage {}; 15cb52d28946367cec72ce6225a175939e234353b5Eli Friedman 16e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattnervoid getsockname(); 17e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattner 18c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xuvoid f(int sock) { 19c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu struct sockaddr_storage storage; 20c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu struct sockaddr* sockaddr = (struct sockaddr*)&storage; 21c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu socklen_t addrlen = sizeof(storage); 22c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu getsockname(sock, sockaddr, &addrlen); 23c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu switch (sockaddr->sa_family) { // no-warning 24c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu default: 25c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu ; 26c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu } 27c58e785c33b5d9d1f8c21760de9cf1f1bc5d983cZhongxing Xu} 2888c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu 2988c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xustruct s { 3088c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu struct s *value; 3188c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu}; 3288c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu 33959922647e5061fc20f983d0e85e3f7fb8421457Mike Stumpvoid f1(struct s **pval) { 3488c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu int *tbool = ((void*)0); 3588c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu struct s *t = *pval; 3688c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu pval = &(t->value); 3718e7a3d403d4271408aceb406d0e50110832f5d8Zhongxing Xu tbool = (int *)pval; // use the cast-to type 'int *' to create element region. 3859c03ff2a686baa88a2e69c7f6fdf1a36b716190Zhongxing Xu char c = (unsigned char) *tbool; // Should use cast-to type to create symbol. 3918e7a3d403d4271408aceb406d0e50110832f5d8Zhongxing Xu if (*tbool == -1) // here load the element region with the correct type 'int' 409668b1f6c87bd8d9af87e29900508a52584404efAnders Carlsson (void)3; 4188c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu} 4288c675f001e046b7264e2a2d4174dacf3781ce5fZhongxing Xu 43005f07b874ae559047f6189e2f770739695f6779Zhongxing Xuvoid f2(const char *str) { 44005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu unsigned char ch, cl, *p; 45005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu 46005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu p = (unsigned char *)str; 47005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu ch = *p++; // use cast-to type 'unsigned char' to create element region. 48005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu cl = *p++; 49005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu if(!cl) 50005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu cl = 'a'; 51005f07b874ae559047f6189e2f770739695f6779Zhongxing Xu} 526607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu 536607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu// Test cast VariableSizeArray to pointer does not crash. 546607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xuvoid *memcpy(void *, void const *, unsigned long); 556607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xutypedef unsigned char Byte; 566607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xuvoid doit(char *data, int len) { 576607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu if (len) { 586607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu Byte buf[len]; 596607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu memcpy(buf, data, len); 606607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu } 616607aca723992d364f2de15f5d739aae8c2a6469Zhongxing Xu} 627b81e8fe6f8576340af7899c1828f1af0781d775Zhongxing Xu 6333ec2f8bc5a19c3b026d80299394989a4f8b3a3dTed Kremenek// PR 6013 and 6035 - Test that a cast of a pointer to long and then to int does not crash SValuator. 6433ec2f8bc5a19c3b026d80299394989a4f8b3a3dTed Kremenekvoid pr6013_6035_test(void *p) { 6533ec2f8bc5a19c3b026d80299394989a4f8b3a3dTed Kremenek unsigned int foo; 6633ec2f8bc5a19c3b026d80299394989a4f8b3a3dTed Kremenek foo = ((long)(p)); 6733ec2f8bc5a19c3b026d80299394989a4f8b3a3dTed Kremenek (void) foo; 687b81e8fe6f8576340af7899c1828f1af0781d775Zhongxing Xu} 69b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks 70b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks// PR12511 and radar://11215362 - Test that we support SymCastExpr, which represents symbolic int to float cast. 71b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zakschar ttt(int intSeconds) { 72b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks double seconds = intSeconds; 73b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks if (seconds) 74b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks return 0; 75b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks return 0; 76b3b1ae85757a8722caccb742b73ca31b4b53bb0aAnna Zaks} 77beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks 78beca02fc66db76eacdaced9df3bc79530c064842Anna Zaksint foo (int* p) { 79beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks int y = 0; 80beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks if (p == 0) { 81beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks if ((*((void**)&p)) == (void*)0) // Test that the cast to void preserves the symbolic region. 82beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks return 0; 83beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks else 84beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks return 5/y; // This code should be unreachable: no-warning. 85beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks } 86beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks return 0; 87beca02fc66db76eacdaced9df3bc79530c064842Anna Zaks} 88