diff options
author | Devin Coughlin <dcoughlin@apple.com> | 2016-12-17 01:08:17 +0000 |
---|---|---|
committer | Devin Coughlin <dcoughlin@apple.com> | 2016-12-17 01:08:17 +0000 |
commit | aa0fd76be30cd18068345228c26f551ea3fbe093 (patch) | |
tree | 6df04a1a65e825c62ad58a6cc9287ffdafe488bd /clang/test/Analysis/unix-api.cpp | |
parent | a4bd1463c8dc04bcd9befd49a667dbfd7fec0f87 (diff) | |
download | bcm5719-llvm-aa0fd76be30cd18068345228c26f551ea3fbe093.tar.gz bcm5719-llvm-aa0fd76be30cd18068345228c26f551ea3fbe093.zip |
[analyzer] UnixAPIChecker: Don't diagnose for functions in C++ namespaces
Update the UnixAPIChecker to not diagnose for calls to functions that
are declared in C++ namespaces. This avoids false positives when a
namespaced function has the same name as a Unix API.
This address PR28331.
llvm-svn: 290023
Diffstat (limited to 'clang/test/Analysis/unix-api.cpp')
-rw-r--r-- | clang/test/Analysis/unix-api.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/clang/test/Analysis/unix-api.cpp b/clang/test/Analysis/unix-api.cpp new file mode 100644 index 00000000000..1c8f99632c0 --- /dev/null +++ b/clang/test/Analysis/unix-api.cpp @@ -0,0 +1,62 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.API -verify %s +extern "C" { +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif + +#ifndef NULL +#define NULL ((void*) 0) +#endif + +int open(const char *, int, ...); +int close(int fildes); + +} // extern "C" + +namespace MyNameSpace { +int open(const char *a, int b, int c, int d); +} + +void unix_open(const char *path) { + int fd; + fd = open(path, O_RDONLY); // no-warning + if (fd > -1) + close(fd); +} + +void unix_open_misuse(const char *path) { + int fd; + int mode = 0x0; + fd = open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} + if (fd > -1) + close(fd); +} + +// Don't treat open() in namespaces as the POSIX open() +void namespaced_open(const char *path) { + MyNameSpace::open("Hi", 2, 3, 4); // no-warning + + using namespace MyNameSpace; + + open("Hi", 2, 3, 4); // no-warning + + int fd; + int mode = 0x0; + fd = ::open(path, O_RDONLY, mode, NULL); // expected-warning{{Call to 'open' with more than 3 arguments}} + if (fd > -1) + close(fd); +} + +class MyClass { +public: + static int open(const char *a, int b, int c, int d); + + int open(int a, int, int c, int d); +}; + +void class_qualified_open() { + MyClass::open("Hi", 2, 3, 4); // no-warning + + MyClass mc; + mc.open(1, 2, 3, 4); // no-warning +} |