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