TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

Demangling C++ Symbols in Rust

245 pointsby andrew3726about 8 years ago

9 comments

kbensonabout 8 years ago
<i>Tom Tromey, a GNU hacker and buddy of mine, mentioned that historically, the canonical C++ demangler in libiberty (used by c++filt and gdb) has had tons of classic C bugs: use-after-free, out-of-bounds array accesses, etc, and that it falls over immediately when faced with a fuzzer. In fact, there were so many of these issues that gdb went so far as to install a signal handler to catch SIGSEGVs during demangling. It “recovered” from the segfaults by longjmping out of the signal handler and printing a warning message before moving along and pretending that nothing happened. My ears perked up. Those are the exact kinds of things Rust protects us from at compile time! A robust alternative might actually be a boon not just for the Rust community, but everybody who wants to demangle C++ symbols.</i><p>Then, later:<p><i>Additionally, I’ve been running American Fuzzy Lop (with afl.rs) on cpp_demangle overnight. It found a panic involving unhandled integer overflow, which I fixed. Since then, AFL hasn’t triggered any panics, and its never been able to find a crash (thanks Rust!) so I think cpp_demangle is fairly solid and robust.</i><p>That&#x27;s what I like to see. Targeted useful reimplementations in Rust that play well to its strengths. In this case, as a double benefit to both the Rust ecosystem and to anyone that wants a robust demangling library.
nlyabout 8 years ago
LLVMs libcxxabi has a demangler which doesn&#x27;t have the worst looking code in the world[0], has no external dependencies (outside of the C++ standard library), has lately been fuzzed[1] and is tested[2].<p>Switching languages is cool, but the Rust code is actually longer and still uses a hand written parser, so how can you be sure it is any more <i>correct</i> or won&#x27;t eat all your memory?<p>[0] <a href="http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;src&#x2F;cxa_demangle.cpp?revision=293638&amp;view=markup" rel="nofollow">http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;src&#x2F;cxa_...</a><p>[1] <a href="http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;fuzz&#x2F;cxa_demangle_fuzzer.cpp?revision=290650&amp;view=markup" rel="nofollow">http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;fuzz&#x2F;cxa...</a><p>[2] <a href="http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;test&#x2F;test_demangle.pass.cpp?revision=293638&amp;view=markup" rel="nofollow">http:&#x2F;&#x2F;llvm.org&#x2F;viewvc&#x2F;llvm-project&#x2F;libcxxabi&#x2F;trunk&#x2F;test&#x2F;tes...</a>
评论 #13709849 未加载
评论 #13710735 未加载
评论 #13710995 未加载
sfinkabout 8 years ago
Coincidentally, I recently discovered that code I landed in the mozilla repo a couple of weeks ago crashes gdb when it tries to demangle (and c++filt on the command line). Looks to be infinite recursion. It&#x27;s still in the current Nightly binary.<p>_ZN2js18CompartmentChecker5checkIN2JS8GCVectorI4jsidLm0ENS_15TempAllocPolicyEEEEEN7mozilla8EnableIfIXsrNS7_6IsSameIDTclptcvPT_LDn0E5beginEEDTclptcvSB_LDn0E3endEEEE5valueEvE4TypeERKSA_<p>coming from<p><pre><code> template &lt;typename Container&gt; typename mozilla::EnableIf&lt; mozilla::IsSame&lt; decltype(((Container*)nullptr)-&gt;begin()), decltype(((Container*)nullptr)-&gt;end()) &gt;::value &gt;::Type check(const Container&amp; container) { ... }</code></pre>
评论 #13711466 未加载
pjmlpabout 8 years ago
&gt; Linkers only support C identifiers for symbol names.<p>This is only true of UNIX system linkers, before the FOSS and UNIX clones wave, it was common for each compiler to have its own language specific linker.
评论 #13709211 未加载
shmerlabout 8 years ago
Can it help to implement C++ bindings for Rust?
评论 #13709234 未加载
problemsabout 8 years ago
How bad are the rules for MSVC compared to the Itanium ones and would you consider adding support for it too?<p>Not that I have a use case in mind or anything, just curious.
评论 #13709904 未加载
评论 #13709138 未加载
jjoonathanabout 8 years ago
&gt; These days, almost every C++ compiler uses the Itanium C++ ABI’s name mangling rules. The notable exception is MSVC, which uses a completely different format.<p>You stay classy, Microsoft.<p>&gt; Its not just the grammar that’s huge, the symbols themselves are too. Here is a pretty big mangled C++ symbol from SpiderMonkey [...] That’s 355 bytes!<p>Here&#x27;s a &gt;4kB symbol I encountered while liberating some ebooks from an abandoned DRM app:<p><pre><code> tetraphilia::transient_ptrs&lt;tetraphilia::imaging_model::PixelProducer&lt;T3AppTraits&gt; &gt;::ptr_type tetraphilia::imaging_model::MakeIdealPixelProducer&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 1ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 0ul&gt; &gt; &gt; &gt;, tetraphilia::TypeList&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 0ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 0ul&gt; &gt; &gt; &gt;, tetraphilia::TypeList&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 1ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt; &gt; &gt;, tetraphilia::Terminal&gt; &gt;, T3AppTraits, tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, tetraphilia::imaging_model::SeparableOperation&lt;tetraphilia::imaging_model::ClipOperation&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt; &gt; &gt;(tetraphilia::ArgType&lt;tetraphilia::TypeList&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 1ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 0ul&gt; &gt; &gt; &gt;, tetraphilia::TypeList&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 0ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::OneXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 0ul&gt; &gt; &gt; &gt;, tetraphilia::TypeList&lt;tetraphilia::imaging_model::XWalkerCluster&lt;tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalkerList3&lt;tetraphilia::imaging_model::const_UnifiedGraphicXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt;, 0ul, 0, 1ul, 0ul, 0, 0ul, 0ul, 0, 0ul, 1ul&gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt;, tetraphilia::imaging_model::GraphicXWalker&lt;tetraphilia::imaging_model::const_IgnoredRasterXWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 0ul, 0, 1ul, 1ul&gt;, tetraphilia::imaging_model::const_SpecializedRasterXWalker&lt;unsigned char, 2ul, -1, 3ul, 3ul&gt; &gt; &gt; &gt;, tetraphilia::Terminal&gt; &gt; &gt; &gt;, T3AppTraits::context_type&amp;, tetraphilia::imaging_model::Constraints&lt;T3AppTraits&gt; const&amp;, tetraphilia::imaging_model::SeparableOperation&lt;tetraphilia::imaging_model::ClipOperation&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt; &gt;, tetraphilia::imaging_model::const_GraphicYWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt; const*, tetraphilia::imaging_model::const_GraphicYWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt; const*, tetraphilia::imaging_model::const_GraphicYWalker&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt; const*, tetraphilia::imaging_model::SegmentFactory&lt;tetraphilia::imaging_model::ByteSignalTraits&lt;T3AppTraits&gt; &gt;*)</code></pre>
评论 #13710792 未加载
评论 #13709168 未加载
评论 #13709197 未加载
评论 #13712198 未加载
评论 #13712386 未加载
bassamtabbaraabout 8 years ago
There&#x27;s also this one <a href="https:&#x2F;&#x2F;github.com&#x2F;ianlancetaylor&#x2F;demangle" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;ianlancetaylor&#x2F;demangle</a>
phkahlerabout 8 years ago
I really enjoy reading these pieces where someone rewrites something in rust and it turns out better than the old C version due to rusts safety features. Usually those kinds of projects are just a rewrite to someones favorite language of the month, for little tangible benefit other than their own satisfaction or education. These rust ones seem to show tangible benefits to the language itself.