Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[analyzer] NoStoreFuncVisitor: Suppress reports with no-store in syst…
…em headers. The idea behind this heuristic is that normally the visitor is there to inform the user that a certain function may fail to initialize a certain out-parameter. For system header functions this is usually dictated by the contract, and it's unlikely that the header function has accidentally forgot to put the value into the out-parameter; it's more likely that the user has intentionally skipped the error check. Warnings on skipped error checks are more like security warnings; they aren't necessarily useful for all users, and they should instead be introduced on a per-API basis. Differential Revision: https://reviews.llvm.org/D60107 llvm-svn: 357810
- Loading branch information
Showing
3 changed files
with
88 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
#pragma clang system_header | ||
|
||
namespace std { | ||
class istream { | ||
public: | ||
bool is_eof(); | ||
char get_char(); | ||
}; | ||
|
||
istream &operator>>(istream &is, char &c) { | ||
if (is.is_eof()) | ||
return; | ||
c = is.get_char(); | ||
} | ||
|
||
extern istream cin; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s | ||
|
||
// expected-no-diagnostics | ||
|
||
#include "Inputs/no-store-suppression.h" | ||
|
||
using namespace std; | ||
|
||
namespace value_uninitialized_after_stream_shift { | ||
void use(char c); | ||
|
||
// Technically, it is absolutely necessary to check the status of cin after | ||
// read before using the value that just read from it. Practically, we don't | ||
// really care unless we eventually come up with a special security check | ||
// for just that purpose. Static Analyzer shouldn't be yelling at every person's | ||
// third program in their C++ 101. | ||
void foo() { | ||
char c; | ||
std::cin >> c; | ||
use(c); // no-warning | ||
} | ||
} // namespace value_uninitialized_after_stream_shift |