2009-03-24 10:24:46 +08:00
|
|
|
// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -verify %s &&
|
|
|
|
// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -verify %s
|
2008-04-30 12:40:48 +08:00
|
|
|
//
|
2009-01-24 14:11:36 +08:00
|
|
|
// Just exercise the analyzer on code that has at one point caused issues
|
|
|
|
// (i.e., no assertions or crashes).
|
2008-04-30 12:40:48 +08:00
|
|
|
|
|
|
|
|
2009-07-22 02:54:29 +08:00
|
|
|
static void f1(const char *x, char *y) {
|
2008-04-30 12:40:48 +08:00
|
|
|
while (*x != 0) {
|
|
|
|
*y++ = *x++;
|
|
|
|
}
|
|
|
|
}
|
2009-01-24 14:11:36 +08:00
|
|
|
|
|
|
|
// This following case checks that we properly handle typedefs when getting
|
|
|
|
// the RvalueType of an ElementRegion.
|
|
|
|
typedef struct F12_struct {} F12_typedef;
|
|
|
|
typedef void* void_typedef;
|
|
|
|
void_typedef f2_helper();
|
|
|
|
static void f2(void *buf) {
|
|
|
|
F12_typedef* x;
|
|
|
|
x = f2_helper();
|
Implicitly declare certain C library functions (malloc, strcpy, memmove,
etc.) when we perform name lookup on them. This ensures that we
produce the correct signature for these functions, which has two
practical impacts:
1) When we're supporting the "implicit function declaration" feature
of C99, these functions will be implicitly declared with the right
signature rather than as a function returning "int" with no
prototype. See PR3541 for the reason why this is important (hint:
GCC always predeclares these functions).
2) If users attempt to redeclare one of these library functions with
an incompatible signature, we produce a hard error.
This patch does a little bit of work to give reasonable error
messages. For example, when we hit case #1 we complain that we're
implicitly declaring this function with a specific signature, and then
we give a note that asks the user to include the appropriate header
(e.g., "please include <stdlib.h> or explicitly declare 'malloc'"). In
case #2, we show the type of the implicit builtin that was incorrectly
declared, so the user can see the problem. We could do better here:
for example, when displaying this latter error message we say
something like:
'strcpy' was implicitly declared here with type 'char *(char *, char
const *)'
but we should really print out a fake code line showing the
declaration, like this:
'strcpy' was implicitly declared here as:
char *strcpy(char *, char const *)
This would also be good for printing built-in candidates with C++
operator overloading.
The set of C library functions supported by this patch includes all
functions from the C99 specification's <stdlib.h> and <string.h> that
(a) are predefined by GCC and (b) have signatures that could cause
codegen issues if they are treated as functions with no prototype
returning and int. Future work could extend this set of functions to
other C library functions that we know about.
llvm-svn: 64504
2009-02-14 07:20:09 +08:00
|
|
|
memcpy((&x[1]), (buf), 1); // expected-warning{{implicitly declaring C library function 'memcpy' with type 'void *(void *, void const *}} \
|
|
|
|
// expected-note{{please include the header <string.h> or explicitly provide a declaration for 'memcpy'}}
|
2009-01-24 14:11:36 +08:00
|
|
|
}
|