|  | // RUN: %clang_analyze_cc1 \ | 
|  | // RUN:   -analyzer-checker=core,unix.BlockInCriticalSection \ | 
|  | // RUN:   -analyzer-output text -verify %s | 
|  |  | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | #include "Inputs/system-header-simulator-cxx-std-locks.h" | 
|  |  | 
|  | std::mutex mtx; | 
|  | using ssize_t = long long; | 
|  | using size_t = unsigned long long; | 
|  | int open(const char *__file, int __oflag, ...); | 
|  | ssize_t read(int fd, void *buf, size_t count); | 
|  | void close(int fd); | 
|  | #define O_RDONLY 00 | 
|  | #define O_NONBLOCK 04000 | 
|  |  | 
|  | void foo() { | 
|  | std::lock_guard<std::mutex> lock(mtx); | 
|  |  | 
|  | const char *filename = "example.txt"; | 
|  | int fd = open(filename, O_RDONLY | O_NONBLOCK); | 
|  |  | 
|  | char buffer[200] = {}; | 
|  | read(fd, buffer, 199); // no-warning: fd is a non-block file descriptor or equals to -1 | 
|  | close(fd); | 
|  | } | 
|  |  | 
|  | void foo1(int fd) { | 
|  | std::lock_guard<std::mutex> lock(mtx); | 
|  |  | 
|  | const char *filename = "example.txt"; | 
|  | char buffer[200] = {}; | 
|  | if (fd == -1) | 
|  | read(fd, buffer, 199); // no-warning: consider file descriptor is a symbol equals to -1 | 
|  | close(fd); | 
|  | } |