[clang] [analyzer] UnixAPIMisuseChecker Get O_CREAT from preprocessor (PR #81855)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 15 05:12:48 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Alejandro Álvarez Ayllón (alejandro-alvarez-sonarsource)
<details>
<summary>Changes</summary>
Now calling `open` with the `O_CREAT` flag and no mode parameter will raise an issue in any system that defines `O_CREAT`.
The value for this flag is obtained after the full source code has been parsed, leveraging `checkASTDecl`.
Hence, any `#define` or `#undefine` of `O_CREAT` following an `open` may alter the results. Nevertheless, since redefining reserved identifiers is UB, this is probably ok.
---
Patch is 86.15 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/81855.diff
3 Files Affected:
- (modified) clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp (+24-18)
- (modified) clang/test/Analysis/Inputs/expected-plists/unix-fns.c.plist (+339-339)
- (modified) clang/test/Analysis/unix-fns.c (+2)
``````````diff
diff --git a/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
index b05ce610067cfa..19f1ca2dc824c9 100644
--- a/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
@@ -18,6 +18,7 @@
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerHelpers.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
@@ -39,13 +40,18 @@ enum class OpenVariant {
namespace {
-class UnixAPIMisuseChecker : public Checker< check::PreStmt<CallExpr> > {
+class UnixAPIMisuseChecker
+ : public Checker<check::PreStmt<CallExpr>,
+ check::ASTDecl<TranslationUnitDecl>> {
const BugType BT_open{this, "Improper use of 'open'", categories::UnixAPI};
const BugType BT_pthreadOnce{this, "Improper use of 'pthread_once'",
categories::UnixAPI};
mutable std::optional<uint64_t> Val_O_CREAT;
public:
+ void checkASTDecl(const TranslationUnitDecl *TU, AnalysisManager &Mgr,
+ BugReporter &BR) const;
+
void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
void CheckOpen(CheckerContext &C, const CallExpr *CE) const;
@@ -55,11 +61,8 @@ class UnixAPIMisuseChecker : public Checker< check::PreStmt<CallExpr> > {
void CheckOpenVariant(CheckerContext &C,
const CallExpr *CE, OpenVariant Variant) const;
- void ReportOpenBug(CheckerContext &C,
- ProgramStateRef State,
- const char *Msg,
+ void ReportOpenBug(CheckerContext &C, ProgramStateRef State, const char *Msg,
SourceRange SR) const;
-
};
class UnixAPIPortabilityChecker : public Checker< check::PreStmt<CallExpr> > {
@@ -90,7 +93,21 @@ class UnixAPIPortabilityChecker : public Checker< check::PreStmt<CallExpr> > {
const char *fn) const;
};
-} //end anonymous namespace
+} // end anonymous namespace
+
+void UnixAPIMisuseChecker::checkASTDecl(const TranslationUnitDecl *TU,
+ AnalysisManager &Mgr,
+ BugReporter &) const {
+ // The definition of O_CREAT is platform specific.
+ // Try to get the macro value from the preprocessor.
+ Val_O_CREAT = tryExpandAsInteger("O_CREAT", Mgr.getPreprocessor());
+ // If we failed, fall-back to known values.
+ if (!Val_O_CREAT) {
+ if (TU->getASTContext().getTargetInfo().getTriple().getVendor() ==
+ llvm::Triple::Apple)
+ Val_O_CREAT = 0x0200;
+ }
+}
//===----------------------------------------------------------------------===//
// "open" (man 2 open)
@@ -204,19 +221,8 @@ void UnixAPIMisuseChecker::CheckOpenVariant(CheckerContext &C,
return;
}
- // The definition of O_CREAT is platform specific. We need a better way
- // of querying this information from the checking environment.
if (!Val_O_CREAT) {
- if (C.getASTContext().getTargetInfo().getTriple().getVendor()
- == llvm::Triple::Apple)
- Val_O_CREAT = 0x0200;
- else {
- // FIXME: We need a more general way of getting the O_CREAT value.
- // We could possibly grovel through the preprocessor state, but
- // that would require passing the Preprocessor object to the ExprEngine.
- // See also: MallocChecker.cpp / M_ZERO.
- return;
- }
+ return;
}
// Now check if oflags has O_CREAT set.
diff --git a/clang/test/Analysis/Inputs/expected-plists/unix-fns.c.plist b/clang/test/Analysis/Inputs/expected-plists/unix-fns.c.plist
index 2594f3b6d097d5..d7913cbc338fd0 100644
--- a/clang/test/Analysis/Inputs/expected-plists/unix-fns.c.plist
+++ b/clang/test/Analysis/Inputs/expected-plists/unix-fns.c.plist
@@ -16,12 +16,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>82</integer>
+ <key>line</key><integer>84</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>82</integer>
+ <key>line</key><integer>84</integer>
<key>col</key><integer>5</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -29,12 +29,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -50,12 +50,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -63,12 +63,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -80,7 +80,7 @@
<key>kind</key><string>event</string>
<key>location</key>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -88,12 +88,12 @@
<array>
<array>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>9</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -113,12 +113,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>84</integer>
+ <key>line</key><integer>86</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -126,12 +126,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -147,12 +147,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -160,12 +160,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>11</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -177,7 +177,7 @@
<key>kind</key><string>event</string>
<key>location</key>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -185,12 +185,12 @@
<array>
<array>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>19</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>25</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -214,7 +214,7 @@
<key>issue_hash_function_offset</key><string>6</string>
<key>location</key>
<dict>
- <key>line</key><integer>87</integer>
+ <key>line</key><integer>89</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -222,11 +222,11 @@
<dict>
<key>0</key>
<array>
- <integer>81</integer>
- <integer>82</integer>
<integer>83</integer>
<integer>84</integer>
- <integer>87</integer>
+ <integer>85</integer>
+ <integer>86</integer>
+ <integer>89</integer>
</array>
</dict>
</dict>
@@ -241,12 +241,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>93</integer>
+ <key>line</key><integer>95</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>93</integer>
+ <key>line</key><integer>95</integer>
<key>col</key><integer>5</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -254,12 +254,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -275,12 +275,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -288,12 +288,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -305,7 +305,7 @@
<key>kind</key><string>event</string>
<key>location</key>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -313,12 +313,12 @@
<array>
<array>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>9</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -338,12 +338,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>95</integer>
+ <key>line</key><integer>97</integer>
<key>col</key><integer>7</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -351,12 +351,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -372,12 +372,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>4</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -385,12 +385,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>13</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -402,7 +402,7 @@
<key>kind</key><string>event</string>
<key>location</key>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -410,12 +410,12 @@
<array>
<array>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>44</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>50</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -439,7 +439,7 @@
<key>issue_hash_function_offset</key><string>6</string>
<key>location</key>
<dict>
- <key>line</key><integer>98</integer>
+ <key>line</key><integer>100</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -447,11 +447,11 @@
<dict>
<key>0</key>
<array>
- <integer>92</integer>
- <integer>93</integer>
<integer>94</integer>
<integer>95</integer>
- <integer>98</integer>
+ <integer>96</integer>
+ <integer>97</integer>
+ <integer>100</integer>
</array>
</dict>
</dict>
@@ -466,12 +466,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>104</integer>
+ <key>line</key><integer>106</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>104</integer>
+ <key>line</key><integer>106</integer>
<key>col</key><integer>17</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -479,12 +479,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>9</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -500,12 +500,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>8</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>9</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -513,12 +513,12 @@
<key>end</key>
<array>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>52</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>64</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -530,7 +530,7 @@
<key>kind</key><string>event</string>
<key>location</key>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>52</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -538,12 +538,12 @@
<array>
<array>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>66</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>72</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -567,7 +567,7 @@
<key>issue_hash_function_offset</key><string>2</string>
<key>location</key>
<dict>
- <key>line</key><integer>105</integer>
+ <key>line</key><integer>107</integer>
<key>col</key><integer>52</integer>
<key>file</key><integer>0</integer>
</dict>
@@ -575,9 +575,9 @@
<dict>
<key>0</key>
<array>
- <integer>103</integer>
- <integer>104</integer>
<integer>105</integer>
+ <integer>106</integer>
+ <integer>107</integer>
</array>
</dict>
</dict>
@@ -592,12 +592,12 @@
<key>start</key>
<array>
<dict>
- <key>line</key><integer>115</integer>
+ <key>line</key><integer>117</integer>
<key>col</key><integer>3</integer>
<key>file</key><integer>0</integer>
</dict>
<dict>
...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/81855
More information about the cfe-commits
mailing list