You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/language/learn-ql/python/introduce-libraries-python.rst
+26-15Lines changed: 26 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,8 +20,8 @@ The QL Python library incorporates a large number of classes, each class corresp
20
20
21
21
- **Syntactic** - classes that represent entities in the Python source code.
22
22
- **Control flow** - classes that represent entities from the control flow graphs.
23
-
- **Data flow** - classes that assist in performing data flow analyses on Python source code.
24
-
- **Type inference** - classes that represent the inferred types of entities in the Python source code.
23
+
- **Type inference** - classes that represent the inferred values and types of entities in the Python source code.
24
+
- **Taint tracking** - classes that represent the source, sinks and kinds of taint used to implement taint-tracking queries.
25
25
26
26
Syntactic classes
27
27
~~~~~~~~~~~~~~~~~
@@ -289,41 +289,52 @@ The classes in the control-flow part of the library are:
289
289
- `ControlFlowNode <https://help.semmle.com/qldoc/python/semmle/python/Flow.qll/type.Flow$ControlFlowNode.html>`__ – A control-flow node. There is a one-to-many relation between AST nodes and control-flow nodes.
290
290
- `BasicBlock <https://help.semmle.com/qldoc/python/semmle/python/Flow.qll/type.Flow$BasicBlock.html>`__ – A non branching list of control-flow nodes.
291
291
292
-
Data flow
293
-
~~~~~~~~~
294
-
295
-
The ``SsaVariable`` class represents `static single assignment form <http://en.wikipedia.org/wiki/Static_single_assignment_form>`__ variables (SSA variables). There is a one-to-many relation between variables and SSA variables. The ``SsaVariable`` class provides an accurate and fast means of tracking data flow from definition to use; the ``SsaVariable`` class is an important element for building data flow analyses, including type inference.
296
292
297
293
Type-inference classes
298
294
----------------------
299
295
300
-
The QL library for Python also supplies some classes for accessing the inferred types of values. The classes ``Object`` and ``ClassObject`` allow you to query the possible classes that an expression may have at runtime. For example, which ``ClassObjects`` are iterable can be determined using the query:
296
+
The QL library for Python also supplies some classes for accessing the inferred types of values. The classes ``Value`` and ``ClassValue`` allow you to query the possible classes that an expression may have at runtime. For example, which ``ClassValue``\ s are iterable can be determined using the query:
301
297
302
-
**Find iterable ``ClassObjects``**
298
+
**Find iterable "ClassValue"s**
303
299
304
300
.. code-block:: ql
305
301
306
302
import python
307
303
308
-
from ClassObject cls
304
+
from ClassValue cls
309
305
where cls.hasAttribute("__iter__")
310
306
select cls
311
307
312
-
➤ `See this in the query console <https://lgtm.com/query/688180005/>`__ This query returns a list of classes for the projects analyzed. If you want to include the results for `builtin classes <http://docs.python.org/library/stdtypes.html>`__, which do not have any Python source code, show the non-source results.
308
+
➤ `See this in the query console <https://lgtm.com/query/5151030165280978402/>`__ This query returns a list of classes for the projects analyzed. If you want to include the results for `builtin classes <http://docs.python.org/library/stdtypes.html>`__, which do not have any Python source code, show the non-source results.
These classes are explained in more detail in :doc:`Tutorial: Points-to analysis and type inference <pointsto-type-infer>`.
324
320
321
+
Taint-tracking classes
322
+
----------------------
323
+
324
+
The QL library for Python also supplies classes to specify taint-tracking analyses. The ``Configuration`` class can be overrridden to specify a taint-tracking analysis, by specifying source, sinks, sanitizers and additional flow steps. For those analyses that require additional types of taint to be tracked the ``TaintKind`` class can be overridden.
These classes are explained in more detail in :doc:`Tutorial: Taint tracking and data flow analysis in Python <taint-tracking>`.
334
+
335
+
325
336
What next?
326
337
----------
327
338
328
-
- Experiment with the worked examples in the QL for Python tutorial topics: :doc:`Functions <functions>`, :doc:`Statements and expressions <statements-expressions>`, :doc:`Control flow <control-flow>` and :doc:`Points-to analysis and type inference <pointsto-type-infer>`.
339
+
- Experiment with the worked examples in the QL for Python tutorial topics: :doc:`Functions <functions>`, :doc:`Statements and expressions <statements-expressions>`, :doc:`Control flow <control-flow>`, :doc:`Points-to analysis and type inference <pointsto-type-infer>` and :doc:`Taint tracking and data flow analysis in Python <taint-tracking>`.
329
340
- Find out more about QL in the `QL language handbook <https://help.semmle.com/QL/ql-handbook/index.html>`__ and `QL language specification <https://help.semmle.com/QL/QLLanguageSpecification.html>`__.
Copy file name to clipboardExpand all lines: docs/language/learn-ql/python/statements-expressions.rst
+3-11Lines changed: 3 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -101,12 +101,10 @@ Each kind of Python expression has its own class. Here is the full class hierarc
101
101
- ``BoolExpr`` – Short circuit logical operations, ``x and y``, ``x or y``
102
102
- ``Bytes`` – A bytes literal, ``b"x"`` or (in Python 2) ``"x"``
103
103
- ``Call`` – A function call, ``f(arg)``
104
-
- ``ClassExpr`` – An artificial expression representing the right hand side a ``ClassDef`` assignment
105
104
- ``Compare`` – A comparison operation, ``0 < x < 10``
106
105
- ``Dict`` – A dictionary literal, ``{'a': 2}``
107
106
- ``DictComp`` – A dictionary comprehension, ``{k: v for ...}``
108
107
- ``Ellipsis`` – An ellipsis expression, ``...``
109
-
- ``FunctionExpr`` – An artificial expression representing the right hand side a ``FunctionDef`` assignment
110
108
- ``GeneratorExp`` – A generator expression
111
109
- ``IfExp`` – A conditional expression, ``x if cond else y``
112
110
- ``ImportExpr`` – An artificial expression representing the module imported
@@ -255,9 +253,9 @@ checks that the value of the attribute (the expression to the left of the dot in
255
253
Class and function definitions
256
254
------------------------------
257
255
258
-
As Python is a dynamically typed language, class, and function definitions are executable statements. This means that a class statement is both a statement and a scope containing statements. To represent this cleanly the class definition is broken into a number of parts. At runtime, when a class definition is executed a class object is created and then assigned to a variable of the same name in the scope enclosing the class. This class is created from a code-object representing the source code for the body of the class. To represent this the ``ClassDef`` class (which represents a ``class`` statement) subclasses ``Assign``. The right hand side of the ``ClassDef`` is a ``ClassExpr`` representing the creation of the class. The ``Class`` class, which represents the body of the class, can be accessed via the ``ClassExpr.getInnerScope()``
256
+
As Python is a dynamically typed language, class, and function definitions are executable statements. This means that a class statement is both a statement and a scope containing statements. To represent this cleanly the class definition is broken into a number of parts. At runtime, when a class definition is executed a class object is created and then assigned to a variable of the same name in the scope enclosing the class. This class is created from a code-object representing the source code for the body of the class. To represent this the ``ClassDef`` class (which represents a ``class`` statement) subclasses ``Assign``. The ``Class`` class, which represents the body of the class, can be accessed via the ``ClassDef.getDefinedClass()``
259
257
260
-
``FunctionDef``, ``FunctionExpr`` and ``Function`` are handled similarly.
258
+
``FunctionDef``, ``Function`` are handled similarly.
261
259
262
260
Here is the relevant part of the class hierarchy:
263
261
@@ -268,12 +266,6 @@ Here is the relevant part of the class hierarchy:
268
266
- ``ClassDef``
269
267
- ``FunctionDef``
270
268
271
-
- ``Expr``
272
-
273
-
- ``ClassExp``
274
-
275
-
- ``FunctionExpr``
276
-
277
269
- ``Scope``
278
270
279
271
- ``Class``
@@ -283,4 +275,4 @@ What next?
283
275
----------
284
276
285
277
- Experiment with the worked examples in the QL for Python tutorial topics: :doc:`Control flow <control-flow>`, :doc:`Points-to analysis and type inference <pointsto-type-infer>`.
286
-
- Find out more about QL in the `QL language handbook <https://help.semmle.com/QL/ql-handbook/index.html>`__ and `QL language specification <https://help.semmle.com/QL/QLLanguageSpecification.html>`__.
278
+
- Find out more about QL in the `QL language handbook <https://help.semmle.com/QL/ql-handbook/index.html>`__ and `QL language specification <https://help.semmle.com/QL/QLLanguageSpecification.html>`__.
Copy file name to clipboardExpand all lines: docs/language/learn-ql/python/taint-tracking.rst
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -96,7 +96,7 @@ The sink is defined by using a custom ``TaintTracking::Sink`` class.
96
96
class UnsafeSink extends TaintTracking::Sink {
97
97
98
98
UnsafeSink() {
99
-
exists(FunctionObject unsafe |
99
+
exists(FunctionValue unsafe |
100
100
unsafe.getName() = "unsafe" and
101
101
unsafe.getACall().(CallNode).getAnArg() = this
102
102
)
@@ -172,7 +172,7 @@ Thus, our example query becomes:
172
172
class UnsafeSink extends TaintTracking::Sink {
173
173
174
174
UnsafeSink() {
175
-
exists(FunctionObject unsafe |
175
+
exists(FunctionValue unsafe |
176
176
unsafe.getName() = "unsafe" and
177
177
unsafe.getACall().(CallNode).getAnArg() = this
178
178
)
@@ -255,4 +255,4 @@ What next?
255
255
----------
256
256
257
257
- Experiment with the worked examples in the QL for Python tutorial topics: :doc:`Control flow <control-flow>`, and :doc:`Points-to analysis and type inference <pointsto-type-infer>`.
258
-
- Find out more about QL in the `QL language handbook <https://help.semmle.com/QL/ql-handbook/index.html>`__ and `QL language specification <https://help.semmle.com/QL/QLLanguageSpecification.html>`__.
258
+
- Find out more about QL in the `QL language handbook <https://help.semmle.com/QL/ql-handbook/index.html>`__ and `QL language specification <https://help.semmle.com/QL/QLLanguageSpecification.html>`__.
0 commit comments