Skip to content
Open
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6846eb2
refactor AE, use worklist algorithm(naive)
Jan 26, 2026
353871d
sync with SSA Ass3
Jan 28, 2026
3847a44
refactor recursion
Jan 29, 2026
b7be147
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Jan 31, 2026
e7f18f8
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Jan 31, 2026
500c22f
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
94ab144
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
809a397
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
ec7f7ca
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
8b0605c
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
e6942d5
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
9c72e10
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
e0d7674
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 2, 2026
bf793f8
rename handleICFGCycle
Feb 3, 2026
09e86d5
Continue to reduce the Options() handleRecur. (vibe-kanban 5f1e98b0)
Feb 3, 2026
76c2374
rename two functions in AbstractInterpretation (vibe-kanban 313b27a9)
Feb 4, 2026
7fce768
rename two functions in AbstractInterpretation (vibe-kanban 313b27a9)
Feb 4, 2026
d3b4fae
rename two functions in AbstractInterpretation (vibe-kanban 313b27a9)
Feb 4, 2026
4c87a38
Add multi-entry whole-program analysis for library code
Feb 6, 2026
7444f96
Add -ae-multientry option for multi-entry analysis
Feb 6, 2026
2aa167c
Fix handleICFGNode regression in function entry state handling
Feb 6, 2026
afb1b8f
Fix assertion errors in AE for multi-entry analysis
Feb 6, 2026
17c751c
fix merge conflict
Feb 7, 2026
bbb2c39
Some Rename and Refactor
Feb 8, 2026
d70d6fa
Read the comments in PullRequest (vibe-kanban 78898480)
Feb 8, 2026
4d364ff
Read the comments in PullRequest (vibe-kanban 78898480)
Feb 8, 2026
c0b4582
Read the comments in PullRequest (vibe-kanban 78898480)
Feb 10, 2026
1bdb795
Read the comments in PullRequest (vibe-kanban 78898480)
Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions svf/include/AE/Svfexe/AbstractInterpretation.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "Util/SVFBugReport.h"
#include "Util/SVFStat.h"
#include "Graphs/SCC.h"
#include <deque>

namespace SVF
{
Expand Down Expand Up @@ -144,6 +145,15 @@ class AbstractInterpretation
/// Program entry
void analyse();

/// Analyze all entry points (functions without callers)
void analyzeFromAllProgEntries();

/// Get all entry point functions (functions without callers)
std::deque<const FunObjVar*> collectProgEntryFuns();

/// Clear abstract trace for fresh analysis from new entry
void clearAbstractTrace();

static AbstractInterpretation& getAEInstance()
{
static AbstractInterpretation instance;
Expand Down Expand Up @@ -358,6 +368,7 @@ class AbstractInterpretation
Map<std::string, std::function<void(const CallICFGNode*)>> func_map;

Map<const ICFGNode*, AbstractState> abstractTrace; // abstract states immediately after nodes
Set<const ICFGNode*> allAnalyzedNodes; // All nodes ever analyzed (across all entry points)
std::string moduleName;

std::vector<std::unique_ptr<AEDetector>> detectors;
Expand Down
5 changes: 5 additions & 0 deletions svf/include/Util/Options.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,11 @@ class Options

// float precision for symbolic abstraction
static const Option<u32_t> AEPrecision;

/// Comma-separated list of function names to use as analysis entry points.
/// If empty (default), all functions without callers are used as entry points.
/// Example: -ae-entry-funcs="main,init,setup"
static const Option<std::string> AEEntryFuncs;
};
} // namespace SVF

Expand Down
19 changes: 18 additions & 1 deletion svf/lib/AE/Svfexe/AEDetector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,24 @@ bool BufOverflowDetector::canSafelyAccessMemory(AbstractState& as, const SVF::SV
SVFIR* svfir = PAG::getPAG();
NodeID value_id = value->getId();

assert(as[value_id].isAddr());
// Lazy initialization for uninitialized pointer parameters in multi-entry analysis.
// When analyzing a function as an entry point (e.g., not called from main),
// pointer parameters may not have been initialized via AddrStmt.
//
// Example:
// void process_buffer(char* buf, int len) {
// buf[0] = 'a'; // accessing buf
// }
// When analyzing process_buffer as an entry point, 'buf' is a function parameter
// with no AddrStmt, so it has no address information in the abstract state.
// We lazily initialize it to point to the black hole object (BlkPtr), representing
// an unknown but valid memory location. This allows the analysis to continue
// while being conservatively sound.
if (!as[value_id].isAddr())
{
NodeID blkPtrId = svfir->getBlkPtr();
as[value_id] = AddressValue(AbstractState::getVirtualMemAddress(blkPtrId));
}
for (const auto& addr : as[value_id].getAddrs())
{
NodeID objId = as.getIDFromAddr(addr);
Expand Down
19 changes: 19 additions & 0 deletions svf/lib/AE/Svfexe/AbsExtAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,9 @@ void AbsExtAPI::handleStrcpy(const CallICFGNode *call)
const SVFVar* arg1Val = call->getArgument(1);
IntervalValue strLen = getStrlen(as, arg1Val);
// no need to -1, since it has \0 as the last byte
// Skip if strLen is bottom or unbounded
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we share as much code as possible for string handling functions you have

if (strLen.isBottom() || strLen.lb().is_minus_infinity())
return;
handleMemcpy(as, arg0Val, arg1Val, strLen, strLen.lb().getIntNumeral());
}

Expand Down Expand Up @@ -592,6 +595,9 @@ void AbsExtAPI::handleStrcat(const SVF::CallICFGNode *call)
IntervalValue strLen0 = getStrlen(as, arg0Val);
IntervalValue strLen1 = getStrlen(as, arg1Val);
IntervalValue totalLen = strLen0 + strLen1;
// Skip if strLen0 is bottom or unbounded
if (strLen0.isBottom() || strLen0.lb().is_minus_infinity())
return;
handleMemcpy(as, arg0Val, arg1Val, strLen1, strLen0.lb().getIntNumeral());
// do memcpy
}
Expand All @@ -603,6 +609,9 @@ void AbsExtAPI::handleStrcat(const SVF::CallICFGNode *call)
IntervalValue arg2Num = as[arg2Val->getId()].getInterval();
IntervalValue strLen0 = getStrlen(as, arg0Val);
IntervalValue totalLen = strLen0 + arg2Num;
// Skip if strLen0 is bottom or unbounded
if (strLen0.isBottom() || strLen0.lb().is_minus_infinity())
return;
handleMemcpy(as, arg0Val, arg1Val, arg2Num, strLen0.lb().getIntNumeral());
// do memcpy
}
Expand Down Expand Up @@ -640,6 +649,11 @@ void AbsExtAPI::handleMemcpy(AbstractState& as, const SVF::SVFVar *dst, const SV
{
assert(false && "we cannot support this type");
}
// Handle bottom or unbounded interval - skip memcpy in these cases
if (len.isBottom() || len.lb().is_minus_infinity())
{
return;
}
u32_t size = std::min((u32_t)Options::MaxFieldLimit(), (u32_t) len.lb().getIntNumeral());
u32_t range_val = size / elemSize;
if (as.inVarToAddrsTable(srcId) && as.inVarToAddrsTable(dstId))
Expand Down Expand Up @@ -672,6 +686,11 @@ void AbsExtAPI::handleMemcpy(AbstractState& as, const SVF::SVFVar *dst, const SV

void AbsExtAPI::handleMemset(AbstractState& as, const SVF::SVFVar *dst, IntervalValue elem, IntervalValue len)
{
// Handle bottom or unbounded interval - skip memset in these cases
if (len.isBottom() || len.lb().is_minus_infinity())
{
return;
}
u32_t dstId = dst->getId();
u32_t size = std::min((u32_t)Options::MaxFieldLimit(), (u32_t) len.lb().getIntNumeral());
u32_t elemSize = 1;
Expand Down
Loading
Loading