[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 closed https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/balazske approved this pull request. https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/balazske deleted https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/balazske deleted https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/77580 >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH 1/5] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; >From ac08796261b3970d9a99c4ac6a2c0e7331620944 Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 11 Jan 2024 09:44:08 +0800 Subject: [PATCH 2/5] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 10 ++--- clang/test/Analysis/stream-error.c| 39 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index f6e6f3122f3aa7..742426a628e065 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -1117,10 +1117,10 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), RetVal); - auto Cond = SVB.evalBinOp(State, BO_GE, RetVal, -SVB.makeZeroVal(C.getASTContext().LongTy), -SVB.getConditionType()) - .getAs(); + auto Cond = + SVB.evalBinOp(State, BO_GE, RetVal, SVB.makeZeroVal(Call.getResultType()), +SVB.getConditionType()) + .getAs(); if (!Cond) return; StateNotFailed = StateNotFailed->assume(*Cond, true); @@ -1128,7 +1128,7 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , return; ProgramStateRef StateFailed = State->BindExpr( - CE, C.getLocationContext(), SVB.makeIntVal(-1, C.getASTContext().LongTy)); + CE, C.getLocationContext(), SVB.makeIntVal(-1, Call.getResultType())); // This function does not affect the stream state. // Still we add success and failure state with the appropriate return value. diff --git a/clang/test/Analysis/stream-error.c b/clang/test/Analysis/stream-error.c index 1b14fc2eee2003..5cd6ef4bb7424d 100644 --- a/clang/test/Analysis/stream-error.c +++ b/clang/test/Analysis/stream-error.c @@ -348,9 +348,6 @@ void error_fseek_0(void) { } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } fclose(F); } @@ -368,12 +365,6 @@ void error_fseeko_0(void) { // expected-warning@-2 {{TRUE}} clang_analyzer_eval(IsFEof); // expected-warning@-1 {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -if (IsFError) - clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} -else - clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} @@ -388,21 +379,33 @@ void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; - long Ret = ftell(F); - if (!(Ret >= 0)) { -clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} - } + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} +
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -268,8 +268,12 @@ class StreamChecker : public Checkerhttps://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -324,6 +343,60 @@ void error_fseek_0(void) { fclose(F); } +void error_fseeko_0(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + int rc = fseeko(F, 0, SEEK_SET); + if (rc) { +int IsFEof = feof(F), IsFError = ferror(F); +// Get ferror or no error, but not feof. +clang_analyzer_eval(IsFError); +// expected-warning@-1 {{FALSE}} +// expected-warning@-2 {{TRUE}} +clang_analyzer_eval(IsFEof); +// expected-warning@-1 {{FALSE}} + } else { +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} + } + fclose(F); +} + +void error_ftell(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} + StreamTesterChecker_make_ferror_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} + clang_analyzer_eval(ferror(F));// expected-warning {{TRUE}} + fclose(F); +} + +void error_ftello(void) { + FILE *F = tmpfile(); + if (!F) +return; + long rc = ftello(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} balazske wrote: To be exact, this test should be a copy of the previous test, only with `ftello` (and use of `off_t`). https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/77580 >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH 1/4] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; >From ac08796261b3970d9a99c4ac6a2c0e7331620944 Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 11 Jan 2024 09:44:08 +0800 Subject: [PATCH 2/4] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 10 ++--- clang/test/Analysis/stream-error.c| 39 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index f6e6f3122f3aa7..742426a628e065 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -1117,10 +1117,10 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), RetVal); - auto Cond = SVB.evalBinOp(State, BO_GE, RetVal, -SVB.makeZeroVal(C.getASTContext().LongTy), -SVB.getConditionType()) - .getAs(); + auto Cond = + SVB.evalBinOp(State, BO_GE, RetVal, SVB.makeZeroVal(Call.getResultType()), +SVB.getConditionType()) + .getAs(); if (!Cond) return; StateNotFailed = StateNotFailed->assume(*Cond, true); @@ -1128,7 +1128,7 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , return; ProgramStateRef StateFailed = State->BindExpr( - CE, C.getLocationContext(), SVB.makeIntVal(-1, C.getASTContext().LongTy)); + CE, C.getLocationContext(), SVB.makeIntVal(-1, Call.getResultType())); // This function does not affect the stream state. // Still we add success and failure state with the appropriate return value. diff --git a/clang/test/Analysis/stream-error.c b/clang/test/Analysis/stream-error.c index 1b14fc2eee2003..5cd6ef4bb7424d 100644 --- a/clang/test/Analysis/stream-error.c +++ b/clang/test/Analysis/stream-error.c @@ -348,9 +348,6 @@ void error_fseek_0(void) { } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } fclose(F); } @@ -368,12 +365,6 @@ void error_fseeko_0(void) { // expected-warning@-2 {{TRUE}} clang_analyzer_eval(IsFEof); // expected-warning@-1 {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -if (IsFError) - clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} -else - clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} @@ -388,21 +379,33 @@ void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; - long Ret = ftell(F); - if (!(Ret >= 0)) { -clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} - } + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} +
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/77580 >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH 1/3] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; >From ac08796261b3970d9a99c4ac6a2c0e7331620944 Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 11 Jan 2024 09:44:08 +0800 Subject: [PATCH 2/3] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 10 ++--- clang/test/Analysis/stream-error.c| 39 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index f6e6f3122f3aa7..742426a628e065 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -1117,10 +1117,10 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), RetVal); - auto Cond = SVB.evalBinOp(State, BO_GE, RetVal, -SVB.makeZeroVal(C.getASTContext().LongTy), -SVB.getConditionType()) - .getAs(); + auto Cond = + SVB.evalBinOp(State, BO_GE, RetVal, SVB.makeZeroVal(Call.getResultType()), +SVB.getConditionType()) + .getAs(); if (!Cond) return; StateNotFailed = StateNotFailed->assume(*Cond, true); @@ -1128,7 +1128,7 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , return; ProgramStateRef StateFailed = State->BindExpr( - CE, C.getLocationContext(), SVB.makeIntVal(-1, C.getASTContext().LongTy)); + CE, C.getLocationContext(), SVB.makeIntVal(-1, Call.getResultType())); // This function does not affect the stream state. // Still we add success and failure state with the appropriate return value. diff --git a/clang/test/Analysis/stream-error.c b/clang/test/Analysis/stream-error.c index 1b14fc2eee2003..5cd6ef4bb7424d 100644 --- a/clang/test/Analysis/stream-error.c +++ b/clang/test/Analysis/stream-error.c @@ -348,9 +348,6 @@ void error_fseek_0(void) { } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } fclose(F); } @@ -368,12 +365,6 @@ void error_fseeko_0(void) { // expected-warning@-2 {{TRUE}} clang_analyzer_eval(IsFEof); // expected-warning@-1 {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -if (IsFError) - clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} -else - clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} @@ -388,21 +379,33 @@ void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; - long Ret = ftell(F); - if (!(Ret >= 0)) { -clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} - } + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} +
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/77580 >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH 1/2] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; >From ac08796261b3970d9a99c4ac6a2c0e7331620944 Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 11 Jan 2024 09:44:08 +0800 Subject: [PATCH 2/2] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 10 ++--- clang/test/Analysis/stream-error.c| 39 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index f6e6f3122f3aa7..742426a628e065 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -1117,10 +1117,10 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), RetVal); - auto Cond = SVB.evalBinOp(State, BO_GE, RetVal, -SVB.makeZeroVal(C.getASTContext().LongTy), -SVB.getConditionType()) - .getAs(); + auto Cond = + SVB.evalBinOp(State, BO_GE, RetVal, SVB.makeZeroVal(Call.getResultType()), +SVB.getConditionType()) + .getAs(); if (!Cond) return; StateNotFailed = StateNotFailed->assume(*Cond, true); @@ -1128,7 +1128,7 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , return; ProgramStateRef StateFailed = State->BindExpr( - CE, C.getLocationContext(), SVB.makeIntVal(-1, C.getASTContext().LongTy)); + CE, C.getLocationContext(), SVB.makeIntVal(-1, Call.getResultType())); // This function does not affect the stream state. // Still we add success and failure state with the appropriate return value. diff --git a/clang/test/Analysis/stream-error.c b/clang/test/Analysis/stream-error.c index 1b14fc2eee2003..5cd6ef4bb7424d 100644 --- a/clang/test/Analysis/stream-error.c +++ b/clang/test/Analysis/stream-error.c @@ -348,9 +348,6 @@ void error_fseek_0(void) { } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } fclose(F); } @@ -368,12 +365,6 @@ void error_fseeko_0(void) { // expected-warning@-2 {{TRUE}} clang_analyzer_eval(IsFEof); // expected-warning@-1 {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -if (IsFError) - clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} -else - clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} @@ -388,21 +379,33 @@ void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; - long Ret = ftell(F); - if (!(Ret >= 0)) { -clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} - } + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} +
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
benshi001 wrote: > It is better to replace in code of `evalFtell` the `C.getASTContext().LongTy` > with `Call.getResultType()` (occurs 2 times), this is more exact if `off_t` > is defined to something else than `long`. This has been fixed. Thanks! https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
benshi001 wrote: > `Call.getResultType()` This is fixed. Thanks! https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/77580 >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH 1/2] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; >From c7449c5e8913af0028b31d7eef64daaf3860889a Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 11 Jan 2024 09:44:08 +0800 Subject: [PATCH 2/2] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 10 ++-- clang/test/Analysis/stream-error.c| 47 --- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index f6e6f3122f3aa7..742426a628e065 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -1117,10 +1117,10 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), RetVal); - auto Cond = SVB.evalBinOp(State, BO_GE, RetVal, -SVB.makeZeroVal(C.getASTContext().LongTy), -SVB.getConditionType()) - .getAs(); + auto Cond = + SVB.evalBinOp(State, BO_GE, RetVal, SVB.makeZeroVal(Call.getResultType()), +SVB.getConditionType()) + .getAs(); if (!Cond) return; StateNotFailed = StateNotFailed->assume(*Cond, true); @@ -1128,7 +1128,7 @@ void StreamChecker::evalFtell(const FnDescription *Desc, const CallEvent , return; ProgramStateRef StateFailed = State->BindExpr( - CE, C.getLocationContext(), SVB.makeIntVal(-1, C.getASTContext().LongTy)); + CE, C.getLocationContext(), SVB.makeIntVal(-1, Call.getResultType())); // This function does not affect the stream state. // Still we add success and failure state with the appropriate return value. diff --git a/clang/test/Analysis/stream-error.c b/clang/test/Analysis/stream-error.c index 1b14fc2eee2003..ea246fcf1792cc 100644 --- a/clang/test/Analysis/stream-error.c +++ b/clang/test/Analysis/stream-error.c @@ -348,9 +348,6 @@ void error_fseek_0(void) { } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } fclose(F); } @@ -368,12 +365,6 @@ void error_fseeko_0(void) { // expected-warning@-2 {{TRUE}} clang_analyzer_eval(IsFEof); // expected-warning@-1 {{FALSE}} -// Error flags should not change. -clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} -if (IsFError) - clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} -else - clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} } else { clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} @@ -388,21 +379,41 @@ void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; - long Ret = ftell(F); - if (!(Ret >= 0)) { -clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} - } + long rc = ftell(F); + if (rc >= 0) +clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} + else +clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} + clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} + StreamTesterChecker_make_feof_stream(F); + rc = ftell(F); + clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} + clang_analyzer_eval(ferror(F));// expected-warning {{FALSE}} +
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -268,8 +268,12 @@ class StreamChecker : public Checkerhttps://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -324,6 +355,57 @@ void error_fseek_0(void) { fclose(F); } +void error_fseeko_0(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + int rc = fseeko(F, 0, SEEK_SET); + if (rc) { +int IsFEof = feof(F), IsFError = ferror(F); +// Get ferror or no error, but not feof. +clang_analyzer_eval(IsFError); +// expected-warning@-1 {{FALSE}} +// expected-warning@-2 {{TRUE}} +clang_analyzer_eval(IsFEof); +// expected-warning@-1 {{FALSE}} +// Error flags should not change. +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +if (IsFError) + clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} +else + clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} + } else { +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} +// Error flags should not change. +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} balazske wrote: ```suggestion ``` https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -324,6 +355,57 @@ void error_fseek_0(void) { fclose(F); } +void error_fseeko_0(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + int rc = fseeko(F, 0, SEEK_SET); + if (rc) { +int IsFEof = feof(F), IsFError = ferror(F); +// Get ferror or no error, but not feof. +clang_analyzer_eval(IsFError); +// expected-warning@-1 {{FALSE}} +// expected-warning@-2 {{TRUE}} +clang_analyzer_eval(IsFEof); +// expected-warning@-1 {{FALSE}} +// Error flags should not change. +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +if (IsFError) + clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} +else + clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} balazske wrote: Part after "error flags should not change" is not needed here, it is enough to have this at one place. ```suggestion ``` https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/balazske deleted https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -324,6 +355,57 @@ void error_fseek_0(void) { fclose(F); } +void error_fseeko_0(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + int rc = fseeko(F, 0, SEEK_SET); + if (rc) { +int IsFEof = feof(F), IsFError = ferror(F); +// Get ferror or no error, but not feof. +clang_analyzer_eval(IsFError); +// expected-warning@-1 {{FALSE}} +// expected-warning@-2 {{TRUE}} +clang_analyzer_eval(IsFEof); +// expected-warning@-1 {{FALSE}} +// Error flags should not change. balazske wrote: Part after "error flags should not change" is not needed here, it is enough to have this at one place. https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
@@ -324,6 +355,57 @@ void error_fseek_0(void) { fclose(F); } +void error_fseeko_0(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + int rc = fseeko(F, 0, SEEK_SET); + if (rc) { +int IsFEof = feof(F), IsFError = ferror(F); +// Get ferror or no error, but not feof. +clang_analyzer_eval(IsFError); +// expected-warning@-1 {{FALSE}} +// expected-warning@-2 {{TRUE}} +clang_analyzer_eval(IsFEof); +// expected-warning@-1 {{FALSE}} +// Error flags should not change. +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +if (IsFError) + clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} +else + clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} + } else { +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} +// Error flags should not change. +clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} +clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} + } + fclose(F); +} + +void error_ftell(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + long Ret = ftell(F); + if (!(Ret >= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + balazske wrote: This test should be better: ``` void error_ftell(void) { FILE *F = fopen("file", "r"); if (!F) return; long rc = ftell(F); if (rc >= 0) clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}} else clang_analyzer_eval(rc == -1); // expected-warning {{TRUE}} clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}} StreamTesterChecker_make_feof_stream(F); rc = ftell(F); clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}} clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}} StreamTesterChecker_make_ferror_stream(F); rc = ftell(F); clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}} clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}} fclose(F); } ``` https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
balazske wrote: It is better to replace in code of `evalFtell` the `C.getASTContext().LongTy` with `Call.getResultType()` (occurs 2 times), this is more exact if `off_t` is defined to something else than `long`. https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
llvmbot wrote: @llvm/pr-subscribers-clang-static-analyzer-1 Author: Ben Shi (benshi001) Changes --- Full diff: https://github.com/llvm/llvm-project/pull/77580.diff 3 Files Affected: - (modified) clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp (+4) - (modified) clang/test/Analysis/Inputs/system-header-simulator.h (+3) - (modified) clang/test/Analysis/stream-error.c (+82) ``diff diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; `` https://github.com/llvm/llvm-project/pull/77580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker (PR #77580)
https://github.com/benshi001 created https://github.com/llvm/llvm-project/pull/77580 None >From cb79cad6837dba5d33476c65923ec714507a3fef Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Wed, 10 Jan 2024 19:00:27 +0800 Subject: [PATCH] [clang][analyzer] Support 'tello' and 'fseeko' in the StreamChecker --- .../StaticAnalyzer/Checkers/StreamChecker.cpp | 4 + .../Analysis/Inputs/system-header-simulator.h | 3 + clang/test/Analysis/stream-error.c| 82 +++ 3 files changed, 89 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index fbfa101257d5e1..f6e6f3122f3aa7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -268,8 +268,12 @@ class StreamChecker : public Checker= 0)) { +clang_analyzer_eval(Ret == -1L); // expected-warning {{TRUE}} + } + fclose(F); +} + +void error_ftello(void) { + FILE *F = fopen("file", "r"); + if (!F) +return; + off_t Ret = ftello(F); + if (!(Ret == -1)) { +clang_analyzer_eval(Ret >= 0); // expected-warning {{TRUE}} + } + fclose(F); +} + void error_fflush_after_fclose(void) { FILE *F = tmpfile(); int Ret; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits