| Age | Commit message (Collapse) | Author |
|
Substitution table and scoping:
- Fix generic lambda auto parameters: save/replace m_templateSubstitute
with 'auto' placeholders for lambda-local T_/T0_/T1_ resolution
- Fix local-name template scoping with m_inLocalName flag
- Fix substitution table off-by-one for all-type template args
- Fix pointer-to-member type (case 'M'): set substitute=true per ABI
- Fix multi-character seq-id parsing (S10_, S11_, etc.)
- Fix DemangleUnresolvedType decltype (DT/Dt) prefix consumption
- Add forward template ref support for cv conversion operators
- Fix sr qualifier-list PushType and conditional E handling
- Fix multi-level sr scope resolution without N prefix
- Fix sr + unscoped template substitution table tracking
- Fix I...E argument pack handling (GCC I...E vs J...E)
- Fix Dp pack expansion to show '...' for concrete types
Expression formatting:
- Fix L_Z embedded mangled name template scope isolation
- Handle LZ<encoding>E function address template args
- cl expression: callable(args) format with function substitute tracking
- dt/pt expressions: obj.member and obj->member directly
- fp_/fp<N>_ placeholders in decltype return types
- Fix fL function-param scope validation
- Fix DemangleBaseUnresolvedName 'on' prefix consumption
Type names (Itanium ABI spec compliance):
- x/y: "long long"/"unsigned long long"
- a: "signed char" (distinct from 'c' = "char")
- n/o: "__int128"/"unsigned __int128"
- g: "__float128" via FloatType altName
- Dd/Df/De: "decimal64"/"decimal32"/"decimal128"
- Dh: "_Float16"
- Dp: always show "..." for pack expansion
- Fix 'n' literal: __int128 not __uint128
- Fix dot extension spacing
Cleanup:
- Remove unused NextIsOneOf, ReadUntil, DemangleInitializer
- Guard GetRaw/GetTemplateType/PrintTables behind GNUDEMANGLE_DEBUG
- Remove unreachable GetNameType C/D cases
- Remove dead BinaryExpression "." check
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
New special-name and type demangling:
- GTt/GTn: GCC transaction clone symbols
- TH/TW: TLS init and wrapper functions
- Tc: covariant return thunks with dual call-offset parsing
- Demangle _block_invoke symbols (Clang/Apple block invocations)
- Intel Vector Function ABI (_ZGV) with ISA, mask, vlen, parameter
kind parsing; z/Z guard variable disambiguation
- Vendor-extended type (U <source-name>) for Objective-C block pointers
- Lowercase vendor type (u <source-name>) for __remove_cvref etc.
- GR <object name> reference temporary demangling
- macOS $tlv$init thread-local variable initializer suffix
- Fix typeinfo rendering to avoid duplicated name in output
New operator and constructor support:
- ABI tag (B <source-name>) consumption in DemangleUnqualifiedName,
DemangleNestedName, and DemangleFunction
- CI1/CI2 inheriting constructors with m_lastName save/restore
- M data-member-prefix in DemangleNestedName for lambdas in
data member initializers
- operator<=> (spaceship) in GetOperator and DemangleUnqualifiedName
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
Replace the TypeBuilder-based demangling path with a lightweight
DemangledTypeNode representation that defers type object construction
until the symbol is fully parsed. This avoids repeated heap allocation
and ref-count churn during recursive descent.
Key changes:
- Add DemangledTypeNode / demangled_type_node.{h,cpp}: a compact IR
that mirrors the type grammar without allocating BN Type objects
- Use a thread_local demangler instance to amortize vector allocations
across calls
- Also commonize some of the demangled string length calculations.
Result: ~3x throughput improvement on a 180K-symbol corpus with
97.7% success rate (matching the previous implementation).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
|
|
|
|
This used to be required when using scoped secrets from an environment but recently changed this month.
https://github.blog/changelog/2026-03-19-github-actions-late-march-2026-updates/
|
|
- In certain IDBs the loading base is zeroed but the info is not relative, in this case we now fallback to rebasing based off the lowest section address specified by `min_ea`.
- In certain IDBs the info is relative, we ignore both the loading base and `min_ea` and compute the absolute address using the base address in the binary view
- Fixed data exports being recognized as functions
- Retrieve post, pre comments from dirtree
- Fix mapping in extern section (which is tool specific in how it is setup)
- Properly mark exported data as global binding
|
|
Caused the resulting dialog to have a drop down that you must select to get to *.i64, which is an extra unneeded step
|
|
|
|
|
|
full update
Reduces unnecessary work
|
|
|
|
|
|
|
|
The heuristics will check if a constant is within the relocatable regions and mask.
If we are in a low address space we might be masking regular constants like 0x10.
|
|
- Exposes WARP type objects directly
- Adds processor API (for generating warp files directly)
- Adds file and chunk API
- Misc cleanup
- Simplified the amount of commands
- Replaced the "Create" commands with a purpose built processor dialog
- Added a native QT viewer for WARP files
- Simplified committing to a remote with a purpose built commit dialog
|
|
Utilize the unique `session_id` of the `FileMetadata` on comparisons and when hashing.
|
|
So you can pass a closure to the register function
|
|
|
|
|
|
|
|
|
|
collection
Previously we only selected relocatable regions from the list of sections, now that we use the segment list we need a way to fallback to the
section list of the segment information is problematic (e.g. based at zero), that fallback has not been triggering as there is a segment for the synthetic sections.
Now when a user opens a firmware with only a single zero based segment it should fallback to the sections _and_ alert the user that they should fill out the section map (since that job is left to the user)
|
|
A little extra pizzaz
|
|
Should fix issue where opening the sidebar for the first time will not show anything in the selected function until the user clicks in the view frame
|
|
Reduce networked functions by constraining on the returned set of functions on the server
|
|
By demoting the containers lock to read only for fetching we can prevent blocking the main ui thread while waiting for the network requests to finish
|
|
|
|
Temporary, we will likely deprecate in favor of a separate function builder later
|
|
|
|
|
|
The Swift ABI repurposes three callee-saved registers for implicit
parameters (self, error, and async context). Supporting the various
combinations of these requires registering several different calling
conventions.
The demangler is taught to explicitly apply these calling conventions to
functions that need them.
|
|
This is disabled by default due to a current limitation where core is
not able to represent parameters that are small structs being passed
across multiple registers. `analysis.swift.extractTypesFromMangledNames`
can be enabled to test this.
|
|
|
|
|
|
objc_release_xN
The type library for the Objective-C runtime does not apply the custom
calling conventions these functions use. Detect these functions when
creating symbols for imported functions and apply the custom calling
convention to them.
Fixes https://github.com/Vector35/binaryninja-api/issues/8031.
|
|
|
|
|
|
|
|
The *FV and *F variants were unconditionally calling fmt::vformat
(allocating/formatting strings) even when trace logging was compiled
out, since only the underlying LogTrace* callees were guarded.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
Container Browser
Add the ui.files.universal.dedicatedPicker setting, allowing users to choose
between the dedicated architecture picker dialog and the standard container
browser for opening Universal (fat) Mach-O binaries. Previously the dedicated
picker was always used with no way to opt out.
Implementing this required restructuring how Universal binaries are handled
during file open. The previous approach intercepted Universal binaries during
container processing, bypassing the container browser's normal pipeline with
dedicated routing logic. This tightly coupled Universal-specific behavior into
the container system, prevented the container browser from handling Universal
binaries natively, and introduced several bugs around exclusion settings,
nested containers, and multi-child container hierarchies.
Bug fixes:
- The previous implementation always intercepted Universal binaries during
container processing with its own routing logic, bypassing the container
browser entirely. There was no way for the container browser to handle
Universal binaries natively, even when that was the desired behavior.
- Universal binaries inside multi-child containers were not detected. The
previous implementation only traversed single-child paths in the container
hierarchy, silently ignoring Universal binaries that appeared as siblings
among multiple children.
- Nested containers (e.g., archives) inside Universal slices were not
handled. The previous implementation intercepted Universal binaries at the
transform routing level before the container browser could perform
recursive delayering. When the dedicated picker is disabled, the container
browser now processes the full hierarchy including Universal slices and any
containers within them.
- Reverted incorrect IsInteractive to IsUIEnabled change in
UniversalTransform. The previous change conflated headless mode with
non-interactive processing. The UI can be enabled while still performing a
non-interactive auto-open (e.g., container browser auto-resolving with a
preferred architecture). The IsInteractive() flag captures the actual
intent and enables the transform to produce only the preferred
architecture child for non-interactive sessions, avoiding unnecessary
BinaryView construction for all slices.
|
|
Structure{,Builder}::{GetMemberByName,GetMemberByOffset}
Failing to check the return value is almost always a bug.
|
|
|
|
|
|
|
|
The iterators now store an offset into the operand storage, rather than
a pointer. Deferencing the iterator retrieves the value at that offset
from the IL function.
This issue existed prior to the operand list storage refactor, but
became easier to hit after that change. The separate operand list vector
is smaller and thus more likely to reallocate when a new instruction is
appended.
|
|
|
|
|
|
|