mirror of
https://github.com/github/codeql.git
synced 2025-12-18 09:43:15 +01:00
It turns out that the evaluator will evaluate the GVN stage even when no predicate from it is needed after optimization of the subsequent stages. The GVN library is expensive to evaluate, and it'll become even more expensive when we switch its implementation to IR. This PR disables the use of GVN in `DataFlow::BarrierNode` for the AST data-flow library, which should improve performance when evaluating a single data-flow query on a snapshot with no cache. Precision decreases slightly, leading to a new FP in the qltests. There is no corresponding change for the IR data-flow library since IR GVN is not very expensive.
69 lines
1.2 KiB
C++
69 lines
1.2 KiB
C++
int source();
|
|
void sink(int);
|
|
bool guarded(int);
|
|
|
|
void bg_basic(int source) {
|
|
if (guarded(source)) {
|
|
sink(source); // no flow
|
|
} else {
|
|
sink(source); // flow
|
|
}
|
|
}
|
|
|
|
void bg_not(int source) {
|
|
if (!guarded(source)) {
|
|
sink(source); // flow
|
|
} else {
|
|
sink(source); // no flow
|
|
}
|
|
}
|
|
|
|
void bg_and(int source, bool arbitrary) {
|
|
if (guarded(source) && arbitrary) {
|
|
sink(source); // no flow
|
|
} else {
|
|
sink(source); // flow
|
|
}
|
|
}
|
|
|
|
void bg_or(int source, bool arbitrary) {
|
|
if (guarded(source) || arbitrary) {
|
|
sink(source); // flow
|
|
} else {
|
|
sink(source); // flow
|
|
}
|
|
}
|
|
|
|
void bg_return(int source) {
|
|
if (!guarded(source)) {
|
|
return;
|
|
}
|
|
sink(source); // no flow
|
|
}
|
|
|
|
struct XY {
|
|
int x, y;
|
|
};
|
|
|
|
void bg_stackstruct(XY s1, XY s2) {
|
|
s1.x = source();
|
|
if (guarded(s1.x)) {
|
|
sink(s1.x); // no flow [FALSE POSITIVE in AST]
|
|
} else if (guarded(s1.y)) {
|
|
sink(s1.x); // flow
|
|
} else if (guarded(s2.y)) {
|
|
sink(s1.x); // flow
|
|
}
|
|
}
|
|
|
|
void bg_structptr(XY *p1, XY *p2) {
|
|
p1->x = source();
|
|
if (guarded(p1->x)) {
|
|
sink(p1->x); // no flow [FALSE POSITIVE in AST]
|
|
} else if (guarded(p1->y)) {
|
|
sink(p1->x); // flow
|
|
} else if (guarded(p2->x)) {
|
|
sink(p1->x); // flow
|
|
}
|
|
}
|