[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