--help
.AbsIntAnalysisResults
element of the function
instead of writing to the function’s properties directly.You can now save the current analysis state, any results computed so far, and all currently open views as a so-called Workspace.
Unlike simply saving a project, this allows you to take snapshots of your progress at any moment in time, revisit them, and build upon them. This is especially useful for documentation and backup purposes.
In the user interface, this new feature is accessible via “Project” → “Save as workspace”.
In batch mode, you can export analysis results as a Workspace
via --export-workspace <workspace.apx>
.
Then all graphs, statistics and any other output produced so far
can be immediately accessed in the GUI without having to re-run the analyses first.
Annotating your project is now easier than ever before. Whether you are looking at a graph, a statistics table, or an AIS file, simply right-click on any area of interest, e.g. a routine or a loop, and select “Add annotation” from the context menu.
Better still, a³ will automatically determine for you any locations that might benefit from being annotated, and mark them with a light bulb in graphs and messages. Clicking on that symbol will bring up the suggested annotation that you can accept or modify with a couple clicks.
The annotation hints are also added to analysis reports.
instruction <pp> tail calls: ...;
instruction <pp> calls: ...;also changes the instruction type of
<pp>
to call
, just like the annotation
instruction <pp> type: call;This means that the annotation
instruction <pp> { calls: ...; type: tail call; }can now be simplified to:
instruction <pp> tail calls: ...;
collect initialization: ("<name>".);where
<name>
is the name of a structure variable.address(<area>) + width(<area>) - 1you can now simply write:
end(<area>)
data
” in a global structure variable “fTable
”, the following expression can be used:
offset(("fTable"."data"));This expression is a shorthand for
address(("fTable"."data")) - address("fTable");
collect initialization
” annotation has been extended to enable collecting values for specific types, for example:
collect initialization: type(function pointer)
collect initialization: type("void () *");
collect initialization: type("int.*");
instruction "main" -> computed(1) calls: *("b"[]);When the AIS2 resolver is unable to read data from memory, it previously reported:
At address 0x1000380:Starting with this release, it will also explain why the data cannot be read, and even provide annotation hints when necessary:
Unable to resolve '("b"[]->)':
- Unable to read target address from '0x40028b60'.
At address 0x1000380:
Unable to resolve '("b"[]->)':
- Refusing to read 4 bytes at address 0x40028b60 (variable 'b') from writable section '.sdata' to reconstruct the control flow.
You may need to annotate branch/call targets in case it is.
Additionally, you should check whether section is writable.
Please consider writing an AIS annotation.
ais2 { area section(".sdata") { readable: true; writable: false; } }
skip target check
” can now be annotated
at the original call site instead of the return inside the trampoline routine.ais2 { area 0x100C to 0x100F { contains data: 0x1 .. 0xFFFFFFFF; } } ais2 { area 0x100C to 0x100F { contains data: -123123 .. 1212435; } }Out-of-range annotations would be e.g.
ais2 { area 0x100C to 0x100F { contains data: -123123 .. 2147483648; } }resulting in
Ignoring contains data annotation because signed cell value [-123123..2147483648] exceeds cell width of 4 byte.
The allowed range is [-2147483648..2147483647].
ais2 { area 0x100C to 0x100F { contains data: 0x0 .. 0xFF0000000; } }resulting in
Ignoring contains data annotation because unsigned cell value [0..68451041280] exceeds cell width of 4 byte.
The allowed range is [0..4294967295].
match(<regular expression>)
.jarl
/jr
instructionsa + b
, a - b
, a ^ b
Warning #3078: In "test.c", line 42:
In routine 'test', at address 0x110:
In context '..., 0x020->"test"':
In "annotations.ais", line 12:
Detected an infeasible control flow transition.
Edge (true) from 0x110 to possible targets:
* [0x0200] (0x200 => 'Test_Function_0')
* [0x0300] (0x300 => 'Test_Function_1')
Contradicting computed targets:
* [0x0400] => 'Test_Function_2'
Info #3118: In "test.c", line 106:
In routine 'test.L6', at address 0x1310:
In context '0x1444->"test", 0x1030->"test.L1"[21]':
The read-access is assumed to access array 'array_test' which conflicts with the computed address [0x003f97fc] (index is [21], but array has only 20 members).
Marking this path as infeasible.
((d3 + d4) - d4)
”.collect initialization
” annotation).Warning #3088: In "test.c", line 128:
In routine 'schedule', at address 0x114c:
In context '0x1048->"task", 0x104c->"schedule"':
Write access to [0x00810000]:4 ('globalVariableName') in constant memory contradicts user annotation.
Annotated value:
* [0x00000000]
Contradicting computed value:
* [0x00000001]
<base> + <index> * <factor>to the segment indicated by
<base>
.Suppressed messages: #3079 (2×), #3082 (4×)
*** Suppressed messages: #3079 (2×), #3082 (4×)
<messages> <suppressed_message number="3079" suppressions="2" /> <suppressed_message number="3082" suppressions="4" /> </messages>