diff --git a/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp index b05ce610067cf..19f1ca2dc824c 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 > { +class UnixAPIMisuseChecker + : public Checker, + check::ASTDecl> { 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 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 > { 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 > { @@ -90,7 +93,21 @@ class UnixAPIPortabilityChecker : public Checker< check::PreStmt > { 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 2594f3b6d097d..d7913cbc338fd 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 @@ start - line82 + line84 col3 file0 - line82 + line84 col5 file0 @@ -29,12 +29,12 @@ end - line84 + line86 col3 file0 - line84 + line86 col4 file0 @@ -50,12 +50,12 @@ start - line84 + line86 col3 file0 - line84 + line86 col4 file0 @@ -63,12 +63,12 @@ end - line84 + line86 col7 file0 - line84 + line86 col7 file0 @@ -80,7 +80,7 @@ kindevent location - line84 + line86 col7 file0 @@ -88,12 +88,12 @@ - line84 + line86 col7 file0 - line84 + line86 col9 file0 @@ -113,12 +113,12 @@ start - line84 + line86 col7 file0 - line84 + line86 col7 file0 @@ -126,12 +126,12 @@ end - line87 + line89 col3 file0 - line87 + line89 col4 file0 @@ -147,12 +147,12 @@ start - line87 + line89 col3 file0 - line87 + line89 col4 file0 @@ -160,12 +160,12 @@ end - line87 + line89 col8 file0 - line87 + line89 col11 file0 @@ -177,7 +177,7 @@ kindevent location - line87 + line89 col8 file0 @@ -185,12 +185,12 @@ - line87 + line89 col19 file0 - line87 + line89 col25 file0 @@ -214,7 +214,7 @@ issue_hash_function_offset6 location - line87 + line89 col8 file0 @@ -222,11 +222,11 @@ 0 - 81 - 82 83 84 - 87 + 85 + 86 + 89 @@ -241,12 +241,12 @@ start - line93 + line95 col3 file0 - line93 + line95 col5 file0 @@ -254,12 +254,12 @@ end - line95 + line97 col3 file0 - line95 + line97 col4 file0 @@ -275,12 +275,12 @@ start - line95 + line97 col3 file0 - line95 + line97 col4 file0 @@ -288,12 +288,12 @@ end - line95 + line97 col7 file0 - line95 + line97 col7 file0 @@ -305,7 +305,7 @@ kindevent location - line95 + line97 col7 file0 @@ -313,12 +313,12 @@ - line95 + line97 col7 file0 - line95 + line97 col9 file0 @@ -338,12 +338,12 @@ start - line95 + line97 col7 file0 - line95 + line97 col7 file0 @@ -351,12 +351,12 @@ end - line98 + line100 col3 file0 - line98 + line100 col4 file0 @@ -372,12 +372,12 @@ start - line98 + line100 col3 file0 - line98 + line100 col4 file0 @@ -385,12 +385,12 @@ end - line98 + line100 col8 file0 - line98 + line100 col13 file0 @@ -402,7 +402,7 @@ kindevent location - line98 + line100 col8 file0 @@ -410,12 +410,12 @@ - line98 + line100 col44 file0 - line98 + line100 col50 file0 @@ -439,7 +439,7 @@ issue_hash_function_offset6 location - line98 + line100 col8 file0 @@ -447,11 +447,11 @@ 0 - 92 - 93 94 95 - 98 + 96 + 97 + 100 @@ -466,12 +466,12 @@ start - line104 + line106 col3 file0 - line104 + line106 col17 file0 @@ -479,12 +479,12 @@ end - line105 + line107 col8 file0 - line105 + line107 col9 file0 @@ -500,12 +500,12 @@ start - line105 + line107 col8 file0 - line105 + line107 col9 file0 @@ -513,12 +513,12 @@ end - line105 + line107 col52 file0 - line105 + line107 col64 file0 @@ -530,7 +530,7 @@ kindevent location - line105 + line107 col52 file0 @@ -538,12 +538,12 @@ - line105 + line107 col66 file0 - line105 + line107 col72 file0 @@ -567,7 +567,7 @@ issue_hash_function_offset2 location - line105 + line107 col52 file0 @@ -575,9 +575,9 @@ 0 - 103 - 104 105 + 106 + 107 @@ -592,12 +592,12 @@ start - line115 + line117 col3 file0 - line115 + line117 col16 file0 @@ -605,12 +605,12 @@ end - line116 + line118 col3 file0 - line116 + line118 col14 file0 @@ -622,7 +622,7 @@ kindevent location - line116 + line118 col3 file0 @@ -630,12 +630,12 @@ - line116 + line118 col16 file0 - line116 + line118 col20 file0 @@ -659,7 +659,7 @@ issue_hash_function_offset2 location - line116 + line118 col3 file0 @@ -667,9 +667,9 @@ 0 - 114 - 115 116 + 117 + 118 @@ -684,12 +684,12 @@ start - line125 + line127 col3 file0 - line125 + line127 col6 file0 @@ -697,12 +697,12 @@ end - line125 + line127 col15 file0 - line125 + line127 col20 file0 @@ -714,7 +714,7 @@ kindevent location - line125 + line127 col15 file0 @@ -722,12 +722,12 @@ - line125 + line127 col22 file0 - line125 + line127 col22 file0 @@ -751,7 +751,7 @@ issue_hash_function_offset1 location - line125 + line127 col15 file0 @@ -759,8 +759,8 @@ 0 - 124 - 125 + 126 + 127 @@ -775,12 +775,12 @@ start - line137 + line139 col3 file0 - line137 + line139 col6 file0 @@ -788,12 +788,12 @@ end - line137 + line139 col15 file0 - line137 + line139 col20 file0 @@ -805,7 +805,7 @@ kindevent location - line137 + line139 col15 file0 @@ -813,12 +813,12 @@ - line137 + line139 col22 file0 - line137 + line139 col22 file0 @@ -842,7 +842,7 @@ issue_hash_function_offset1 location - line137 + line139 col15 file0 @@ -850,8 +850,8 @@ 0 - 136 - 137 + 138 + 139 @@ -866,12 +866,12 @@ start - line143 + line145 col3 file0 - line143 + line145 col6 file0 @@ -879,12 +879,12 @@ end - line143 + line145 col15 file0 - line143 + line145 col20 file0 @@ -896,7 +896,7 @@ kindevent location - line143 + line145 col15 file0 @@ -904,12 +904,12 @@ - line143 + line145 col26 file0 - line143 + line145 col26 file0 @@ -933,7 +933,7 @@ issue_hash_function_offset1 location - line143 + line145 col15 file0 @@ -941,8 +941,8 @@ 0 - 142 - 143 + 144 + 145 @@ -957,12 +957,12 @@ start - line155 + line157 col3 file0 - line155 + line157 col6 file0 @@ -970,12 +970,12 @@ end - line155 + line157 col15 file0 - line155 + line157 col21 file0 @@ -987,7 +987,7 @@ kindevent location - line155 + line157 col15 file0 @@ -995,12 +995,12 @@ - line155 + line157 col28 file0 - line155 + line157 col28 file0 @@ -1024,7 +1024,7 @@ issue_hash_function_offset1 location - line155 + line157 col15 file0 @@ -1032,8 +1032,8 @@ 0 - 154 - 155 + 156 + 157 @@ -1048,12 +1048,12 @@ start - line161 + line163 col3 file0 - line161 + line163 col6 file0 @@ -1061,12 +1061,12 @@ end - line161 + line163 col15 file0 - line161 + line163 col22 file0 @@ -1078,7 +1078,7 @@ kindevent location - line161 + line163 col15 file0 @@ -1086,12 +1086,12 @@ - line161 + line163 col29 file0 - line161 + line163 col29 file0 @@ -1115,7 +1115,7 @@ issue_hash_function_offset1 location - line161 + line163 col15 file0 @@ -1123,8 +1123,8 @@ 0 - 160 - 161 + 162 + 163 @@ -1139,12 +1139,12 @@ start - line179 + line181 col3 file0 - line179 + line181 col6 file0 @@ -1152,12 +1152,12 @@ end - line179 + line181 col15 file0 - line179 + line181 col20 file0 @@ -1169,7 +1169,7 @@ kindevent location - line179 + line181 col15 file0 @@ -1177,12 +1177,12 @@ - line179 + line181 col22 file0 - line179 + line181 col22 file0 @@ -1206,7 +1206,7 @@ issue_hash_function_offset1 location - line179 + line181 col15 file0 @@ -1214,8 +1214,8 @@ 0 - 178 - 179 + 180 + 181 @@ -1230,12 +1230,12 @@ start - line191 + line193 col3 file0 - line191 + line193 col6 file0 @@ -1243,12 +1243,12 @@ end - line191 + line193 col16 file0 - line191 + line193 col31 file0 @@ -1260,7 +1260,7 @@ kindevent location - line191 + line193 col16 file0 @@ -1268,12 +1268,12 @@ - line191 + line193 col33 file0 - line191 + line193 col33 file0 @@ -1297,7 +1297,7 @@ issue_hash_function_offset1 location - line191 + line193 col16 file0 @@ -1305,8 +1305,8 @@ 0 - 190 - 191 + 192 + 193 @@ -1321,12 +1321,12 @@ start - line203 + line205 col3 file0 - line203 + line205 col6 file0 @@ -1334,12 +1334,12 @@ end - line203 + line205 col15 file0 - line203 + line205 col20 file0 @@ -1351,7 +1351,7 @@ kindevent location - line203 + line205 col15 file0 @@ -1359,12 +1359,12 @@ - line203 + line205 col22 file0 - line203 + line205 col22 file0 @@ -1388,7 +1388,7 @@ issue_hash_function_offset1 location - line203 + line205 col15 file0 @@ -1396,8 +1396,8 @@ 0 - 202 - 203 + 204 + 205 @@ -1412,12 +1412,12 @@ start - line216 + line218 col3 file0 - line216 + line218 col17 file0 @@ -1425,12 +1425,12 @@ end - line217 + line219 col3 file0 - line217 + line219 col15 file0 @@ -1442,7 +1442,7 @@ kindevent location - line217 + line219 col3 file0 @@ -1450,12 +1450,12 @@ - line217 + line219 col17 file0 - line217 + line219 col21 file0 @@ -1479,7 +1479,7 @@ issue_hash_function_offset2 location - line217 + line219 col3 file0 @@ -1487,9 +1487,9 @@ 0 - 215 - 216 217 + 218 + 219 @@ -1500,7 +1500,7 @@ kindevent location - line222 + line224 col3 file0 @@ -1508,12 +1508,12 @@ - line222 + line224 col3 file0 - line222 + line224 col8 file0 @@ -1533,12 +1533,12 @@ start - line222 + line224 col3 file0 - line222 + line224 col5 file0 @@ -1546,12 +1546,12 @@ end - line223 + line225 col3 file0 - line223 + line225 col15 file0 @@ -1567,12 +1567,12 @@ start - line223 + line225 col3 file0 - line223 + line225 col15 file0 @@ -1580,12 +1580,12 @@ end - line223 + line225 col24 file0 - line223 + line225 col24 file0 @@ -1597,7 +1597,7 @@ kindevent location - line223 + line225 col24 file0 @@ -1605,12 +1605,12 @@ - line223 + line225 col24 file0 - line227 + line229 col3 file0 @@ -1630,12 +1630,12 @@ start - line223 + line225 col24 file0 - line223 + line225 col24 file0 @@ -1643,12 +1643,12 @@ end - line223 + line225 col3 file0 - line223 + line225 col15 file0 @@ -1660,7 +1660,7 @@ kindevent location - line223 + line225 col3 file0 @@ -1668,12 +1668,12 @@ - line223 + line225 col3 file0 - line227 + line229 col4 file0 @@ -1689,7 +1689,7 @@ kindevent location - line223 + line225 col3 file0 @@ -1697,12 +1697,12 @@ - line223 + line225 col3 file0 - line227 + line229 col4 file0 @@ -1718,7 +1718,7 @@ kindevent location - line223 + line225 col24 file0 @@ -1736,12 +1736,12 @@ start - line223 + line225 col24 file0 - line223 + line225 col24 file0 @@ -1749,12 +1749,12 @@ end - line224 + line226 col4 file0 - line224 + line226 col5 file0 @@ -1770,12 +1770,12 @@ start - line224 + line226 col4 file0 - line224 + line226 col5 file0 @@ -1783,12 +1783,12 @@ end - line224 + line226 col8 file0 - line224 + line226 col8 file0 @@ -1800,7 +1800,7 @@ kindevent location - line224 + line226 col8 file0 @@ -1808,12 +1808,12 @@ - line224 + line226 col8 file0 - line224 + line226 col8 file0 @@ -1833,12 +1833,12 @@ start - line224 + line226 col8 file0 - line224 + line226 col8 file0 @@ -1846,12 +1846,12 @@ end - line225 + line227 col3 file0 - line225 + line227 col3 file0 @@ -1867,12 +1867,12 @@ start - line225 + line227 col3 file0 - line225 + line227 col3 file0 @@ -1880,12 +1880,12 @@ end - line225 + line227 col6 file0 - line225 + line227 col6 file0 @@ -1897,7 +1897,7 @@ kindevent location - line225 + line227 col6 file0 @@ -1905,12 +1905,12 @@ - line225 + line227 col4 file0 - line225 + line227 col4 file0 @@ -1931,7 +1931,7 @@ issue_hash_content_of_line_in_context5d3f4c433004c7a6d4a06aa30cc3ea85 location - line225 + line227 col6 file0 @@ -1939,12 +1939,12 @@ 0 - 40 - 221 - 222 + 42 223 224 225 + 226 + 227 @@ -1959,12 +1959,12 @@ start - line232 + line234 col3 file0 - line232 + line234 col8 file0 @@ -1972,12 +1972,12 @@ end - line233 + line235 col3 file0 - line233 + line235 col5 file0 @@ -1989,7 +1989,7 @@ kindevent location - line233 + line235 col3 file0 @@ -1997,12 +1997,12 @@ - line233 + line235 col3 file0 - line233 + line235 col8 file0 @@ -2022,12 +2022,12 @@ start - line233 + line235 col3 file0 - line233 + line235 col5 file0 @@ -2035,12 +2035,12 @@ end - line234 + line236 col3 file0 - line234 + line236 col15 file0 @@ -2056,12 +2056,12 @@ start - line234 + line236 col3 file0 - line234 + line236 col15 file0 @@ -2069,12 +2069,12 @@ end - line234 + line236 col24 file0 - line234 + line236 col24 file0 @@ -2086,7 +2086,7 @@ kindevent location - line234 + line236 col24 file0 @@ -2094,12 +2094,12 @@ - line234 + line236 col24 file0 - line236 + line238 col3 file0 @@ -2119,12 +2119,12 @@ start - line234 + line236 col24 file0 - line234 + line236 col24 file0 @@ -2132,12 +2132,12 @@ end - line234 + line236 col3 file0 - line234 + line236 col15 file0 @@ -2149,7 +2149,7 @@ kindevent location - line234 + line236 col3 file0 @@ -2157,12 +2157,12 @@ - line234 + line236 col3 file0 - line236 + line238 col4 file0 @@ -2178,7 +2178,7 @@ kindevent location - line52 + line54 col1 file0 @@ -2196,12 +2196,12 @@ start - line52 + line54 col1 file0 - line52 + line54 col6 file0 @@ -2209,12 +2209,12 @@ end - line60 + line62 col2 file0 - line60 + line62 col3 file0 @@ -2230,12 +2230,12 @@ start - line60 + line62 col2 file0 - line60 + line62 col3 file0 @@ -2243,12 +2243,12 @@ end - line61 + line63 col3 file0 - line61 + line63 col15 file0 @@ -2260,7 +2260,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2268,12 +2268,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2289,7 +2289,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2297,12 +2297,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2318,7 +2318,7 @@ kindevent location - line234 + line236 col24 file0 @@ -2336,12 +2336,12 @@ start - line234 + line236 col24 file0 - line234 + line236 col24 file0 @@ -2349,12 +2349,12 @@ end - line235 + line237 col4 file0 - line235 + line237 col4 file0 @@ -2370,12 +2370,12 @@ start - line235 + line237 col4 file0 - line235 + line237 col4 file0 @@ -2383,12 +2383,12 @@ end - line235 + line237 col7 file0 - line235 + line237 col7 file0 @@ -2400,7 +2400,7 @@ kindevent location - line235 + line237 col7 file0 @@ -2408,12 +2408,12 @@ - line235 + line237 col5 file0 - line235 + line237 col5 file0 @@ -2434,7 +2434,7 @@ issue_hash_content_of_line_in_context265c4fd608dafee211bfa93d21c28866 location - line235 + line237 col7 file0 @@ -2442,13 +2442,11 @@ 0 - 44 - 45 46 47 48 - 52 - 53 + 49 + 50 54 55 56 @@ -2457,11 +2455,13 @@ 59 60 61 - 231 - 232 + 62 + 63 233 234 235 + 236 + 237 @@ -2476,12 +2476,12 @@ start - line241 + line243 col3 file0 - line241 + line243 col8 file0 @@ -2489,12 +2489,12 @@ end - line243 + line245 col3 file0 - line243 + line245 col15 file0 @@ -2506,7 +2506,7 @@ kindevent location - line243 + line245 col3 file0 @@ -2514,12 +2514,12 @@ - line243 + line245 col3 file0 - line245 + line247 col4 file0 @@ -2535,7 +2535,7 @@ kindevent location - line52 + line54 col1 file0 @@ -2553,12 +2553,12 @@ start - line52 + line54 col1 file0 - line52 + line54 col6 file0 @@ -2566,12 +2566,12 @@ end - line60 + line62 col2 file0 - line60 + line62 col3 file0 @@ -2587,12 +2587,12 @@ start - line60 + line62 col2 file0 - line60 + line62 col3 file0 @@ -2600,12 +2600,12 @@ end - line61 + line63 col3 file0 - line61 + line63 col15 file0 @@ -2617,7 +2617,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2625,12 +2625,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2646,7 +2646,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2654,12 +2654,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2675,7 +2675,7 @@ kindevent location - line243 + line245 col24 file0 @@ -2693,12 +2693,12 @@ start - line243 + line245 col24 file0 - line243 + line245 col24 file0 @@ -2706,12 +2706,12 @@ end - line244 + line246 col7 file0 - line244 + line246 col7 file0 @@ -2723,7 +2723,7 @@ kindevent location - line244 + line246 col7 file0 @@ -2731,12 +2731,12 @@ - line244 + line246 col7 file0 - line244 + line246 col11 file0 @@ -2752,7 +2752,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2760,12 +2760,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2781,7 +2781,7 @@ kindevent location - line61 + line63 col3 file0 @@ -2789,12 +2789,12 @@ - line61 + line63 col3 file0 - line61 + line63 col33 file0 @@ -2814,12 +2814,12 @@ start - line61 + line63 col3 file0 - line61 + line63 col15 file0 @@ -2827,12 +2827,12 @@ end - line65 + line67 col2 file0 - line65 + line67 col17 file0 @@ -2844,7 +2844,7 @@ kindevent location - line243 + line245 col3 file0 @@ -2852,12 +2852,12 @@ - line243 + line245 col3 file0 - line245 + line247 col4 file0 @@ -2877,12 +2877,12 @@ start - line243 + line245 col3 file0 - line243 + line245 col15 file0 @@ -2890,12 +2890,12 @@ end - line247 + line249 col3 file0 - line247 + line249 col3 file0 @@ -2911,12 +2911,12 @@ start - line247 + line249 col3 file0 - line247 + line249 col3 file0 @@ -2924,12 +2924,12 @@ end - line247 + line249 col6 file0 - line247 + line249 col6 file0 @@ -2941,7 +2941,7 @@ kindevent location - line247 + line249 col6 file0 @@ -2949,12 +2949,12 @@ - line247 + line249 col4 file0 - line247 + line249 col4 file0 @@ -2978,7 +2978,7 @@ issue_hash_function_offset7 location - line247 + line249 col6 file0 @@ -2986,13 +2986,11 @@ 0 - 44 - 45 46 47 48 - 52 - 53 + 49 + 50 54 55 56 @@ -3001,13 +2999,15 @@ 59 60 61 - 65 - 240 - 241 + 62 + 63 + 67 242 243 244 - 247 + 245 + 246 + 249 diff --git a/clang/test/Analysis/unix-fns-o_creat.c b/clang/test/Analysis/unix-fns-o_creat.c new file mode 100644 index 0000000000000..76df3851cfc9c --- /dev/null +++ b/clang/test/Analysis/unix-fns-o_creat.c @@ -0,0 +1,39 @@ +// RUN: %clang_analyze_cc1 -verify -analyzer-checker=core,unix.API -analyzer-output=text %s + +// Verify that the UnixAPIChecker finds the missing mode value regardless +// of the particular values of these macros, particularly O_CREAT. +#define O_RDONLY 0x2000 +#define O_WRONLY 0x8000 +#define O_CREAT 0x0002 + +extern int open(const char *path, int flags, ...); + +void missing_mode_1(const char *path) { + (void)open(path, O_CREAT); // expected-warning{{Call to 'open' requires a 3rd argument when the 'O_CREAT' flag is set}} \ + expected-note{{Call to 'open' requires a 3rd argument when the 'O_CREAT' flag is set}} +} + +extern int some_flag; + +void missing_mode_2(const char *path) { + int mode = O_WRONLY; + if (some_flag) { // expected-note {{Assuming 'some_flag' is not equal to 0}} \ + expected-note {{Taking true branch}} + mode |= O_CREAT; + } + (void)open(path, mode); // expected-warning{{Call to 'open' requires a 3rd argument when the 'O_CREAT' flag is set}} \ + expected-note{{Call to 'open' requires a 3rd argument when the 'O_CREAT' flag is set}} +} + +void no_creat(const char* path) { + int mode = O_RDONLY; + (void)open(path, mode); // ok +} + +void mode_is_there(const char *path) { + int mode = O_WRONLY; + if (some_flag) { + mode |= O_CREAT; + } + (void)open(path, mode, 0770); // ok +} diff --git a/clang/test/Analysis/unix-fns.c b/clang/test/Analysis/unix-fns.c index f23bc6e17740c..77894285bcb69 100644 --- a/clang/test/Analysis/unix-fns.c +++ b/clang/test/Analysis/unix-fns.c @@ -1,5 +1,7 @@ // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 -analyzer-checker=core,unix.API,osx.API,optin.portability %s -analyzer-output=plist -analyzer-config faux-bodies=true -fblocks -verify -o %t.plist // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/unix-fns.c.plist - +// RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux -analyzer-checker=core,unix.API,osx.API,optin.portability %s -analyzer-output=plist -analyzer-config faux-bodies=true -fblocks -verify -o %t.plist +// RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/unix-fns.c.plist - // RUN: mkdir -p %t.dir // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.API,osx.API,optin.portability -analyzer-output=html -analyzer-config faux-bodies=true -fblocks -o %t.dir %s // RUN: rm -fR %t.dir