mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 20:46:05 +00:00

this PR close #124474 when calling `read` and `recv` function for a non-block file descriptor or a invalid file descriptor(`-1`), it will not cause block inside a critical section. this commit checks for non-block file descriptor assigned by `open` function with `O_NONBLOCK` flag. --------- Co-authored-by: Balazs Benics <benicsbalazs@gmail.com>
38 lines
989 B
C++
38 lines
989 B
C++
// 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);
|
|
}
|