[analyzer] UnixAPI: Check that the third argument to open(2) (if present) is an integer.

Patch by Daniel Fahlgren.

llvm-svn: 216079
This commit is contained in:
Jordan Rose 2014-08-20 16:58:09 +00:00
parent cd4db5c6d2
commit ba129af62a
2 changed files with 57 additions and 0 deletions

View File

@ -95,6 +95,15 @@ void UnixAPIChecker::CheckOpen(CheckerContext &C, const CallExpr *CE) const {
// The frontend should issue a warning for this case, so this is a sanity
// check.
return;
} else if (CE->getNumArgs() == 3) {
const Expr *Arg = CE->getArg(2);
QualType QT = Arg->getType();
if (!QT->isIntegerType()) {
ReportOpenBug(C, state,
"Third argument to 'open' is not an integer",
Arg->getSourceRange());
return;
}
} else if (CE->getNumArgs() > 3) {
ReportOpenBug(C, state,
"Call to 'open' with more than three arguments",

View File

@ -25,3 +25,51 @@ void open_2(const char *path) {
if (fd > -1)
close(fd);
}
void open_3(const char *path) {
int fd;
fd = open(path, O_RDONLY, NULL); // expected-warning{{Third argument to 'open' is not an integer}}
if (fd > -1)
close(fd);
}
void open_4(const char *path) {
int fd;
fd = open(path, O_RDONLY, ""); // expected-warning{{Third argument to 'open' is not an integer}}
if (fd > -1)
close(fd);
}
void open_5(const char *path) {
int fd;
struct {
int val;
} st = {0};
fd = open(path, O_RDONLY, st); // expected-warning{{Third argument to 'open' is not an integer}}
if (fd > -1)
close(fd);
}
void open_6(const char *path) {
int fd;
struct {
int val;
} st = {0};
fd = open(path, O_RDONLY, st.val); // no-warning
if (fd > -1)
close(fd);
}
void open_7(const char *path) {
int fd;
fd = open(path, O_RDONLY, &open); // expected-warning{{Third argument to 'open' is not an integer}}
if (fd > -1)
close(fd);
}
void open_8(const char *path) {
int fd;
fd = open(path, O_RDONLY, 0.0f); // expected-warning{{Third argument to 'open' is not an integer}}
if (fd > -1)
close(fd);
}