Zhongxing Xu | 2fc3259 | 2009-04-29 01:50:12 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -analyze -checker-cfref -analyzer-store=region --verify %s |
Zhongxing Xu | 2fc3259 | 2009-04-29 01:50:12 +0000 | [diff] [blame] | 2 | |
Zhongxing Xu | b1080ed | 2009-04-29 05:59:48 +0000 | [diff] [blame] | 3 | // Test if the 'storage' region gets properly initialized after it is cast to |
| 4 | // 'struct sockaddr *'. |
| 5 | |
Zhongxing Xu | 6223107 | 2009-04-29 02:37:26 +0000 | [diff] [blame] | 6 | #include <sys/socket.h> |
Zhongxing Xu | c58e785 | 2009-04-28 13:52:13 +0000 | [diff] [blame] | 7 | void 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 | } |
Zhongxing Xu | 88c675f | 2009-06-18 06:29:10 +0000 | [diff] [blame] | 17 | |
| 18 | struct s { |
| 19 | struct s *value; |
| 20 | }; |
| 21 | |
Zhongxing Xu | 88c675f | 2009-06-18 06:29:10 +0000 | [diff] [blame] | 22 | int f1(struct s **pval) { |
| 23 | int *tbool = ((void*)0); |
| 24 | struct s *t = *pval; |
| 25 | pval = &(t->value); |
Zhongxing Xu | 59c03ff | 2009-06-18 06:49:35 +0000 | [diff] [blame^] | 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. |
Zhongxing Xu | 88c675f | 2009-06-18 06:29:10 +0000 | [diff] [blame] | 28 | } |
| 29 | |