vabridgers created this revision.
vabridgers added a reviewer: Szelethus.
Herald added subscribers: steakhal, ASDenysPetrov, martong, Charusso, dkrupp,
donat.nagy, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun,
whisperity.
vabridgers requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
This change attempts to address
https://bugs.llvm.org/show_bug.cgi?id=48588.
In certain cases, it appears that __VA_ARGS__ is not in PrevParamMap
before it's accessed using at(). This change simply skips injectRange()
if __VA_ARGS__ is not found in PrevParamMap.
The crash seen is described below, the case this was discovered in was
distilled into a reproducer inserted into the LIT tests for this module.
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
#0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int)
<base>/llvm/lib/Support/Unix/Signals.inc:563:22
...
#11 std::__throw_out_of_range(char const*)
<base>/libstdc++-v3/src/c++11/functexcept.cc:82:5
#12 std::map<clang::IdentifierInfo const*,
llvm::SmallVector<clang::Token, 2u>, std::less<clang::IdentifierInfo
const*>, std::allocator<std::pair<clang::IdentifierInfo const* const,
llvm::SmallVector<clang::Token, 2u> > > >::at(clang::IdentifierInfo
const* const&) const
<base>/gcc/9.3.0/include/c++/9.3.0/bits/stl_map.h:549:10
#13 getMacroExpansionInfo((anonymous namespace)::MacroParamMap const&,
clang::SourceLocation, clang::Preprocessor const&)
<base>/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp:1242:66
...
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D93787
Files:
clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist
clang/test/Analysis/plist-macros-with-expansion.cpp
Index: clang/test/Analysis/plist-macros-with-expansion.cpp
===================================================================
--- clang/test/Analysis/plist-macros-with-expansion.cpp
+++ clang/test/Analysis/plist-macros-with-expansion.cpp
@@ -543,3 +543,23 @@
// CHECK: <key>name</key><string>BZ44493_GNUVA</string>
// CHECK-NEXT: <key>expansion</key><string>--(a);</string>
+
+// Expected warning, and don't crash
+const char *traceid(const char *);
+int trace(int, const char *, int, ...);
+#define TRACE_CALL(tracelevel, ...) \
+ { __VA_ARGS__; }
+
+#define TRACE(tracelevel, str, ...) \
+ TRACE_CALL((tracelevel), trace((0), traceid("formatstr " str), 0, tracelevel, __VA_ARGS__))
+
+#define TRACE_WRAPPER TRACE
+
+void funcXXX(
+ void *Context_p) {
+ int localvar;
+ TRACE_WRAPPER(
+ localvar,
+ "localvar=%u ",
+ 0); // expected-warning{{4th function call argument is an uninitialized value}}
+}
Index: clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist
===================================================================
--- clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist
+++ clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist
@@ -6923,6 +6923,142 @@
</array>
</dict>
</dict>
+ <dict>
+ <key>path</key>
+ <array>
+ <dict>
+ <key>kind</key><string>event</string>
+ <key>location</key>
+ <dict>
+ <key>line</key><integer>560</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <key>ranges</key>
+ <array>
+ <array>
+ <dict>
+ <key>line</key><integer>560</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <dict>
+ <key>line</key><integer>560</integer>
+ <key>col</key><integer>14</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ </array>
+ </array>
+ <key>depth</key><integer>0</integer>
+ <key>extended_message</key>
+ <string>'localvar' declared without an initial value</string>
+ <key>message</key>
+ <string>'localvar' declared without an initial value</string>
+ </dict>
+ <dict>
+ <key>kind</key><string>control</string>
+ <key>edges</key>
+ <array>
+ <dict>
+ <key>start</key>
+ <array>
+ <dict>
+ <key>line</key><integer>560</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <dict>
+ <key>line</key><integer>560</integer>
+ <key>col</key><integer>5</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ </array>
+ <key>end</key>
+ <array>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>15</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ </array>
+ </dict>
+ </array>
+ </dict>
+ <dict>
+ <key>kind</key><string>event</string>
+ <key>location</key>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <key>ranges</key>
+ <array>
+ <array>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <dict>
+ <key>line</key><integer>564</integer>
+ <key>col</key><integer>12</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ </array>
+ </array>
+ <key>depth</key><integer>0</integer>
+ <key>extended_message</key>
+ <string>4th function call argument is an uninitialized value</string>
+ <key>message</key>
+ <string>4th function call argument is an uninitialized value</string>
+ </dict>
+ </array>
+ <key>macro_expansions</key>
+ <array>
+ <dict>
+ <key>location</key>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <key>name</key><string>TRACE_WRAPPER</string>
+ <key>expansion</key><string>{ trace((0), traceid("formatstr " str), 0, tracelevel,); }</string>
+ </dict>
+ </array>
+ <key>description</key><string>4th function call argument is an uninitialized value</string>
+ <key>category</key><string>Logic error</string>
+ <key>type</key><string>Uninitialized argument value</string>
+ <key>check_name</key><string>core.CallAndMessage</string>
+ <!-- This hash is experimental and going to change! -->
+ <key>issue_hash_content_of_line_in_context</key><string>7b4de363511977d731e5dfab4fd89c66</string>
+ <key>issue_context_kind</key><string>function</string>
+ <key>issue_context</key><string>funcXXX</string>
+ <key>issue_hash_function_offset</key><string>2</string>
+ <key>location</key>
+ <dict>
+ <key>line</key><integer>561</integer>
+ <key>col</key><integer>3</integer>
+ <key>file</key><integer>0</integer>
+ </dict>
+ <key>ExecutedLines</key>
+ <dict>
+ <key>0</key>
+ <array>
+ <integer>557</integer>
+ <integer>558</integer>
+ <integer>559</integer>
+ <integer>560</integer>
+ <integer>561</integer>
+ </array>
+ </dict>
+ </dict>
</array>
<key>files</key>
<array>
Index: clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
+++ clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
@@ -1238,7 +1238,8 @@
// the processing of DISPATCH what __VA_ARGS__ maps to, so we'll
// retrieve the next series of tokens from that.
if (TheTok.getIdentifierInfo() == VariadicParamII) {
- TStream.injectRange(PrevParamMap.at(VariadicParamII));
+ if (PrevParamMap.find(VariadicParamII) != PrevParamMap.end())
+ TStream.injectRange(PrevParamMap.at(VariadicParamII));
TStream.next(TheTok);
continue;
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits