mirror of
https://github.com/github/codeql.git
synced 2026-05-02 12:15:17 +02:00
Python: Add getAMethodCall to LocalSourceNode
This seems like something we have been missing for a while now, so I figured it might be useful to add. It is roughly based on the JavaScript equivalent, with one major difference: in the JavaScript libraries, `getAMethodCall` is reserved for syntactic method calls (`obj.m(...)`) whereas `getAMemberInvocation` is used for both this and the case where the bound method `obj.m` is stored in a temporary variable and then subsequently invoked in the same local scope. It seems to me that the more general predicate is more useful, and hence should have the simpler name. (And also we don't really work with a notion of "invocation" in the Python libraries, so we would need a better name for it anyway.) I think as long as the documentation makes the behaviour clear, it should be okay.
This commit is contained in:
@@ -191,7 +191,7 @@ private class ClassDefinitionAsAttrWrite extends AttrWrite, CfgNode {
|
||||
* - Dynamic attribute reads using `getattr`: `getattr(object, attr)`
|
||||
* - Qualified imports: `from module import attr as name`
|
||||
*/
|
||||
abstract class AttrRead extends AttrRef, Node { }
|
||||
abstract class AttrRead extends AttrRef, Node, LocalSourceNode { }
|
||||
|
||||
/** A simple attribute read, e.g. `object.attr` */
|
||||
private class AttributeReadAsAttrRead extends AttrRead, CfgNode {
|
||||
|
||||
@@ -78,6 +78,16 @@ class LocalSourceNode extends Node {
|
||||
*/
|
||||
CallCfgNode getACall() { Cached::call(this, result) }
|
||||
|
||||
/**
|
||||
* Gets a call to the method `methodName` on this node.
|
||||
*
|
||||
* Includes both calls that have the syntactic shape of a method call (as in `obj.m(...)`), and
|
||||
* calls where the callee undergoes some additional local data flow (as in `tmp = obj.m; m(...)`).
|
||||
*/
|
||||
CallCfgNode getAMethodCall(string methodName) {
|
||||
result = this.getAnAttributeRead(methodName).getACall()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a node that this node may flow to using one heap and/or interprocedural step.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user