summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/unix-api.cpp
diff options
context:
space:
mode:
authorDevin Coughlin <dcoughlin@apple.com>2016-12-17 01:08:17 +0000
committerDevin Coughlin <dcoughlin@apple.com>2016-12-17 01:08:17 +0000
commitaa0fd76be30cd18068345228c26f551ea3fbe093 (patch)
tree6df04a1a65e825c62ad58a6cc9287ffdafe488bd /clang/test/Analysis/unix-api.cpp
parenta4bd1463c8dc04bcd9befd49a667dbfd7fec0f87 (diff)
downloadbcm5719-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.cpp62
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
+}
OpenPOWER on IntegriCloud