Python: Add test for missing points-to information

To ease the rollout of this test, currently we only report missing points-to
information for nodes that either

- appear as an argument in a call to a function named `check`, or
- appear inside a scope where the first line is annotated with a comment ending
  in "check".

The idea behind the second version is that once we have points-to running at a
level where no node inside a scope that _ought_ to have points-to is missing
this information, we can simply remove all uses of `check(...)` from inside this
scope, and annotate the entire scope with `# check`. Once this has been done for
the entire file, we can then remove all the comments and just require
_everything_ to be checked.

Note that I don't expect all nodes to have the need for points-to information.
For instance, there are nodes representing scope entry and exit, and for these
it doesn't make sense to require that they "point-to" anything. Similarly,
`NameNode` appearing in a "store" (i.e. as the left hand side of an assignment)
do not strictly need to have points-to information, although it might be more
intuitive if they did.

Thus, the `relevant_node` predicate will almost certainly need to be extended to
exclude these kinds of nodes.
This commit is contained in:
Taus Brock-Nannestad
2020-02-25 16:07:50 +01:00
parent abbc9293db
commit 887f85cee2

View File

@@ -0,0 +1,26 @@
import python
import Util
import semmle.python.pointsto.PointsTo
import semmle.python.objects.ObjectInternal
/* Ideally, this test should return _no_ results. */
predicate relevant_node(ControlFlowNode n) {
exists(CallNode c |
c.getFunction().(NameNode).getId() = "check" and
n = c.getAnArg()
)
or
exists(Comment c, string filepath, int bl |
n.getNode().getScope().getLocation().hasLocationInfo(filepath, bl, _, _, _) and
c.getLocation().hasLocationInfo(filepath, bl, _, _, _) and
c.getText().matches("%check")
and not n.(NameNode).isStore()
)
}
from ControlFlowNode f
where
relevant_node(f) and
not PointsTo::pointsTo(f, _, _, _)
select locate(f.getLocation(), "abchlr"), f.toString()