• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify %s
2 // RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify %s
3 
4 // Test if the 'storage' region gets properly initialized after it is cast to
5 // 'struct sockaddr *'.
6 
7 typedef unsigned char __uint8_t;
8 typedef unsigned int __uint32_t;
9 typedef __uint32_t __darwin_socklen_t;
10 typedef __uint8_t sa_family_t;
11 typedef __darwin_socklen_t socklen_t;
12 struct sockaddr { sa_family_t sa_family; };
13 struct sockaddr_storage {};
14 
15 void getsockname();
16 
f(int sock)17 void f(int sock) {
18   struct sockaddr_storage storage;
19   struct sockaddr* sockaddr = (struct sockaddr*)&storage;
20   socklen_t addrlen = sizeof(storage);
21   getsockname(sock, sockaddr, &addrlen);
22   switch (sockaddr->sa_family) { // no-warning
23   default:
24     ;
25   }
26 }
27 
28 struct s {
29   struct s *value;
30 };
31 
f1(struct s ** pval)32 void f1(struct s **pval) {
33   int *tbool = ((void*)0);
34   struct s *t = *pval;
35   pval = &(t->value);
36   tbool = (int *)pval; // use the cast-to type 'int *' to create element region.
37   char c = (unsigned char) *tbool; // Should use cast-to type to create symbol.
38   if (*tbool == -1) // here load the element region with the correct type 'int'
39     (void)3;
40 }
41 
f2(const char * str)42 void f2(const char *str) {
43  unsigned char ch, cl, *p;
44 
45  p = (unsigned char *)str;
46  ch = *p++; // use cast-to type 'unsigned char' to create element region.
47  cl = *p++;
48  if(!cl)
49     cl = 'a';
50 }
51 
52 // Test cast VariableSizeArray to pointer does not crash.
53 void *memcpy(void *, void const *, unsigned long);
54 typedef unsigned char Byte;
doit(char * data,int len)55 void doit(char *data, int len) {
56     if (len) {
57         Byte buf[len];
58         memcpy(buf, data, len);
59     }
60 }
61 
62 // PR 6013 and 6035 - Test that a cast of a pointer to long and then to int does not crash SValuator.
pr6013_6035_test(void * p)63 void pr6013_6035_test(void *p) {
64   unsigned int foo;
65   foo = ((long)(p));
66   (void) foo;
67 }
68