C++: Finish up implementation of MaD barriers.

This commit is contained in:
Mathias Vorreiter Pedersen
2026-01-15 18:04:57 +00:00
parent 48254800b1
commit a11b271d6e
3 changed files with 52 additions and 8 deletions

View File

@@ -26,25 +26,25 @@ void sink(int*);
void test_mad(int x, int* p) {
{
if(is_clean_value(&x)) {
sink(x); // $ MISSING: external=int
sink(x); // $ external=int
}
}
{
if(is_clean_value(p)) {
sink(*p); // $ MISSING: external=int
sink(*p); // $ external=int
}
}
{
if(is_clean_pointer(p)) {
sink(p); // $ MISSING: external=int*
sink(p); // $ external=int*
}
}
{
if(is_clean_pointer(&x)) {
sink(x); // $ MISSING: external=glval<int>
sink(x); // $ external=glval<int>
}
}
}

View File

@@ -28,8 +28,15 @@ predicate barrierGuard(DataFlow::Node node, string s) {
else s = node.getType().toString().replaceAll(" ", "")
}
predicate externalBarrierGuard(DataFlow::Node node, string s) {
barrierNode(node, "test-barrier") and
if node.isGLValue()
then s = "glval<" + node.getType().toString().replaceAll(" ", "") + ">"
else s = node.getType().toString().replaceAll(" ", "")
}
module Test implements TestSig {
string getARelevantTag() { result = ["barrier", "indirect_barrier"] }
string getARelevantTag() { result = ["barrier", "indirect_barrier", "external"] }
predicate hasActualResult(Location location, string element, string tag, string value) {
exists(DataFlow::Node node |
@@ -38,6 +45,9 @@ module Test implements TestSig {
or
barrierGuard(node, value) and
tag = "barrier"
or
externalBarrierGuard(node, value) and
tag = "external"
|
element = node.toString() and
location = node.getLocation()