Python: Fix a bunch of class QLDoc

This commit is contained in:
Taus
2022-03-04 16:39:02 +00:00
committed by GitHub
parent af7f532212
commit d2603884ca
55 changed files with 136 additions and 121 deletions

View File

@@ -1,6 +1,6 @@
import python import python
/** Syntactic node (Class, Function, Module, Expr, Stmt or Comprehension) corresponding to a flow node */ /** A syntactic node (Class, Function, Module, Expr, Stmt or Comprehension) corresponding to a flow node */
abstract class AstNode extends AstNode_ { abstract class AstNode extends AstNode_ {
/* /*
* Special comment for documentation generation. * Special comment for documentation generation.
@@ -61,31 +61,31 @@ abstract class AstNode extends AstNode_ {
} }
/* Parents */ /* Parents */
/** Internal implementation class */ /** The parent of a `Function`. Internal implementation class */
class FunctionParent extends FunctionParent_ { } class FunctionParent extends FunctionParent_ { }
/** Internal implementation class */ /** The parent of an `Arguments` node. Internal implementation class */
class ArgumentsParent extends ArgumentsParent_ { } class ArgumentsParent extends ArgumentsParent_ { }
/** Internal implementation class */ /** The parent of an `ExprList`. Internal implementation class */
class ExprListParent extends ExprListParent_ { } class ExprListParent extends ExprListParent_ { }
/** Internal implementation class */ /** The parent of an `ExprContext`. Internal implementation class */
class ExprContextParent extends ExprContextParent_ { } class ExprContextParent extends ExprContextParent_ { }
/** Internal implementation class */ /** The parent of a `StmtList`. Internal implementation class */
class StmtListParent extends StmtListParent_ { } class StmtListParent extends StmtListParent_ { }
/** Internal implementation class */ /** The parent of a `StrList`. Internal implementation class */
class StrListParent extends StrListParent_ { } class StrListParent extends StrListParent_ { }
/** Internal implementation class */ /** The parent of an `Expr`. Internal implementation class */
class ExprParent extends ExprParent_ { } class ExprParent extends ExprParent_ { }
/** Internal implementation class */ /** The parent of a `PatternList`. Internal implementation class */
class PatternListParent extends PatternListParent_ { } class PatternListParent extends PatternListParent_ { }
/** Internal implementation class */ /** The parent of a `Pattern`. Internal implementation class */
class PatternParent extends PatternParent_ { } class PatternParent extends PatternParent_ { }
class DictItem extends DictItem_, AstNode { class DictItem extends DictItem_, AstNode {
@@ -120,7 +120,7 @@ class Comprehension extends Comprehension_, AstNode {
class BytesOrStr extends BytesOrStr_ { } class BytesOrStr extends BytesOrStr_ { }
/** /**
* Part of a string literal formed by implicit concatenation. * A part of a string literal formed by implicit concatenation.
* For example the string literal "abc" expressed in the source as `"a" "b" "c"` * For example the string literal "abc" expressed in the source as `"a" "b" "c"`
* would be composed of three `StringPart`s. * would be composed of three `StringPart`s.
*/ */

View File

@@ -1,6 +1,6 @@
import python import python
/** Base class for list, set and dictionary comprehensions, and generator expressions. */ /** The base class for list, set and dictionary comprehensions, and generator expressions. */
abstract class Comp extends Expr { abstract class Comp extends Expr {
abstract Function getFunction(); abstract Function getFunction();

View File

@@ -315,7 +315,7 @@ class Ellipsis extends Ellipsis_ {
} }
/** /**
* Immutable literal expressions (except tuples). * An immutable literal expression (except tuples).
* Consists of string (both unicode and byte) literals and numeric literals. * Consists of string (both unicode and byte) literals and numeric literals.
*/ */
abstract class ImmutableLiteral extends Expr { abstract class ImmutableLiteral extends Expr {
@@ -687,7 +687,7 @@ class False extends BooleanLiteral {
override boolean booleanValue() { result = false } override boolean booleanValue() { result = false }
} }
/** `None` */ /** The `None` constant. */
class None extends NameConstant { class None extends NameConstant {
/* syntax: None */ /* syntax: None */
None() { name_consts(this, "None") } None() { name_consts(this, "None") }
@@ -730,20 +730,20 @@ class Guard extends Guard_ {
/** A context in which an expression used */ /** A context in which an expression used */
class ExprContext extends ExprContext_ { } class ExprContext extends ExprContext_ { }
/** Load context, the context of var in len(var) */ /** The load context, the context of var in len(var) */
class Load extends Load_ { } class Load extends Load_ { }
/** Store context, the context of var in var = 0 */ /** The store context, the context of var in var = 0 */
class Store extends Store_ { } class Store extends Store_ { }
/** Delete context, the context of var in del var */ /** The delete context, the context of var in del var */
class Del extends Del_ { } class Del extends Del_ { }
/** This is an artifact of the Python grammar which includes an AugLoad context, even though it is never used. */ /** The context of an augmented load. This is an artifact of the Python grammar which includes an AugLoad context, even though it is never used. */
class AugLoad extends AugLoad_ { } class AugLoad extends AugLoad_ { }
/** Augmented store context, the context of var in var += 1 */ /** The augmented store context, the context of var in var += 1 */
class AugStore extends AugStore_ { } class AugStore extends AugStore_ { }
/** Parameter context, the context of var in def f(var): pass */ /** The parameter context, the context of var in def f(var): pass */
class Param extends Param_ { } class Param extends Param_ { }

View File

@@ -1,6 +1,6 @@
import python import python
/** Base class for operators */ /** The base class for operators */
class Operator extends Operator_ { class Operator extends Operator_ {
/** Gets the name of the special method used to implement this operator */ /** Gets the name of the special method used to implement this operator */
string getSpecialMethodName() { none() } string getSpecialMethodName() { none() }
@@ -131,7 +131,7 @@ class Compare extends Compare_ {
} }
} }
/** List of comparison operators in a comparison */ /** A list of comparison operators in a comparison */
class CmpopList extends CmpopList_ { } class CmpopList extends CmpopList_ { }
/** A comparison operator */ /** A comparison operator */

View File

@@ -31,7 +31,7 @@ private predicate self_attribute(Attribute attr, Class cls) {
) )
} }
/** Helper class for UndefinedClassAttribute.ql & MaybeUndefinedClassAttribute.ql */ /** A helper class for UndefinedClassAttribute.ql & MaybeUndefinedClassAttribute.ql */
class SelfAttributeRead extends SelfAttribute { class SelfAttributeRead extends SelfAttribute {
SelfAttributeRead() { SelfAttributeRead() {
this.getCtx() instanceof Load and this.getCtx() instanceof Load and

View File

@@ -227,7 +227,7 @@ private module SensitiveDataModeling {
} }
/** /**
* Any kind of variable assignment (also including with/for) where the name indicates * A variable assignment (also including with/for) where the name indicates
* it contains sensitive data. * it contains sensitive data.
* *
* Note: We _could_ make any access to a variable with a sensitive name a source of * Note: We _could_ make any access to a variable with a sensitive name a source of

View File

@@ -6,14 +6,14 @@
private import python private import python
private import internal.TypeTracker as Internal private import internal.TypeTracker as Internal
/** Any string that may appear as the name of an attribute or access path. */ /** A string that may appear as the name of an attribute or access path. */
class AttributeName = Internal::ContentName; class AttributeName = Internal::ContentName;
/** Either an attribute name, or the empty string (representing no attribute). */ /** An attribute name, or the empty string (representing no attribute). */
class OptionalAttributeName = Internal::OptionalContentName; class OptionalAttributeName = Internal::OptionalContentName;
/** /**
* Summary of the steps needed to track a value to a given dataflow node. * The summary of the steps needed to track a value to a given dataflow node.
* *
* This can be used to track objects that implement a certain API in order to * This can be used to track objects that implement a certain API in order to
* recognize calls to that API. Note that type-tracking does not by itself provide a * recognize calls to that API. Note that type-tracking does not by itself provide a

View File

@@ -613,7 +613,7 @@ newtype TDataFlowCallable =
TLambda(Function lambda) { lambda.isLambda() } or TLambda(Function lambda) { lambda.isLambda() } or
TModule(Module m) TModule(Module m)
/** Represents a callable. */ /** A callable. */
abstract class DataFlowCallable extends TDataFlowCallable { abstract class DataFlowCallable extends TDataFlowCallable {
/** Gets a textual representation of this element. */ /** Gets a textual representation of this element. */
abstract string toString(); abstract string toString();
@@ -714,7 +714,7 @@ newtype TDataFlowCall =
TClassCall(CallNode call) { call = any(ClassValue c | not c.isAbsent()).getACall() } or TClassCall(CallNode call) { call = any(ClassValue c | not c.isAbsent()).getACall() } or
TSpecialCall(SpecialMethodCallNode special) TSpecialCall(SpecialMethodCallNode special)
/** Represents a call. */ /** A call. */
abstract class DataFlowCall extends TDataFlowCall { abstract class DataFlowCall extends TDataFlowCall {
/** Gets a textual representation of this element. */ /** Gets a textual representation of this element. */
abstract string toString(); abstract string toString();
@@ -739,7 +739,7 @@ abstract class DataFlowCall extends TDataFlowCall {
} }
/** /**
* Represents a call to a function/lambda. * A call to a function/lambda.
* This excludes calls to bound methods, classes, and special methods. * This excludes calls to bound methods, classes, and special methods.
* Bound method calls and class calls insert an argument for the explicit * Bound method calls and class calls insert an argument for the explicit
* `self` parameter, and special method calls have special argument passing. * `self` parameter, and special method calls have special argument passing.
@@ -826,7 +826,7 @@ class ClassCall extends DataFlowCall, TClassCall {
override DataFlowCallable getEnclosingCallable() { result.getScope() = call.getScope() } override DataFlowCallable getEnclosingCallable() { result.getScope() = call.getScope() }
} }
/** Represents a call to a special method. */ /** A call to a special method. */
class SpecialCall extends DataFlowCall, TSpecialCall { class SpecialCall extends DataFlowCall, TSpecialCall {
SpecialMethodCallNode special; SpecialMethodCallNode special;

View File

@@ -79,7 +79,7 @@ abstract class AttributePath extends TAttributePath {
predicate noAttribute() { this = TNoAttribute() } predicate noAttribute() { this = TNoAttribute() }
} }
/** AttributePath for no attribute. */ /** The `AttributePath` for no attribute. */
class NoAttribute extends TNoAttribute, AttributePath { class NoAttribute extends TNoAttribute, AttributePath {
override string toString() { result = "no attribute" } override string toString() { result = "no attribute" }
@@ -88,7 +88,7 @@ class NoAttribute extends TNoAttribute, AttributePath {
override AttributePath fromAttribute(string name) { none() } override AttributePath fromAttribute(string name) { none() }
} }
/** AttributePath for an attribute. */ /** The `AttributePath` for an attribute. */
class NamedAttributePath extends TAttribute, AttributePath { class NamedAttributePath extends TAttribute, AttributePath {
override string toString() { override string toString() {
exists(string attr | exists(string attr |
@@ -124,8 +124,8 @@ newtype TTaintTrackingNode =
} }
/** /**
* Class representing the (node, context, path, kind) tuple. * A class representing the (node, context, path, kind) tuple.
* Used for context-sensitive path-aware taint-tracking. * Used for context-sensitive path-aware taint-tracking.
*/ */
class TaintTrackingNode extends TTaintTrackingNode { class TaintTrackingNode extends TTaintTrackingNode {
/** Gets a textual representation of this element. */ /** Gets a textual representation of this element. */

View File

@@ -180,7 +180,7 @@ abstract class TaintKind extends string {
} }
/** /**
* Alias of `TaintKind`, so the two types can be used interchangeably. * An Alias of `TaintKind`, so the two types can be used interchangeably.
*/ */
class FlowLabel = TaintKind; class FlowLabel = TaintKind;
@@ -561,7 +561,7 @@ module DataFlowExtension {
ControlFlowNode getACalleeSuccessorNode(CallNode call) { none() } ControlFlowNode getACalleeSuccessorNode(CallNode call) { none() }
} }
/** Data flow variable that modifies the basic data-flow. */ /** A data flow variable that modifies the basic data-flow. */
class DataFlowVariable extends EssaVariable { class DataFlowVariable extends EssaVariable {
/** /**
* Gets a successor node for data-flow. * Gets a successor node for data-flow.
@@ -608,7 +608,7 @@ private import semmle.python.pointsto.PointsTo
*/ */
module DataFlow { module DataFlow {
/** /**
* Generic taint kind, source and sink classes for convenience and * The generic taint kind, source and sink classes for convenience and
* compatibility with other language libraries * compatibility with other language libraries
*/ */
class Extension = DataFlowExtension::DataFlowNode; class Extension = DataFlowExtension::DataFlowNode;

View File

@@ -134,7 +134,7 @@ private newtype TEssaDefinition =
TPhiFunction(SsaSourceVariable v, BasicBlock b) { EssaDefinitions::phiNode(v, b) } TPhiFunction(SsaSourceVariable v, BasicBlock b) { EssaDefinitions::phiNode(v, b) }
/** /**
* Definition of an extended-SSA (ESSA) variable. * A definition of an extended-SSA (ESSA) variable.
* There is exactly one definition for each variable, * There is exactly one definition for each variable,
* and exactly one variable for each definition. * and exactly one variable for each definition.
*/ */
@@ -515,7 +515,7 @@ class AssignmentDefinition extends EssaNodeDefinition {
override string getAPrimaryQlClass() { result = "AssignmentDefinition" } override string getAPrimaryQlClass() { result = "AssignmentDefinition" }
} }
/** Capture of a raised exception `except ExceptionType ex:` */ /** A capture of a raised exception `except ExceptionType ex:` */
class ExceptionCapture extends EssaNodeDefinition { class ExceptionCapture extends EssaNodeDefinition {
ExceptionCapture() { ExceptionCapture() {
SsaSource::exception_capture(this.getSourceVariable(), this.getDefiningNode()) SsaSource::exception_capture(this.getSourceVariable(), this.getDefiningNode())
@@ -631,7 +631,7 @@ class DeletionDefinition extends EssaNodeDefinition {
} }
/** /**
* Definition of variable at the entry of a scope. Usually this represents the transfer of * A definition of variable at the entry of a scope. Usually this represents the transfer of
* a global or non-local variable from one scope to another. * a global or non-local variable from one scope to another.
*/ */
class ScopeEntryDefinition extends EssaNodeDefinition { class ScopeEntryDefinition extends EssaNodeDefinition {
@@ -645,7 +645,7 @@ class ScopeEntryDefinition extends EssaNodeDefinition {
override string getAPrimaryQlClass() { result = "ScopeEntryDefinition" } override string getAPrimaryQlClass() { result = "ScopeEntryDefinition" }
} }
/** Possible redefinition of variable via `from ... import *` */ /** A possible redefinition of variable via `from ... import *` */
class ImportStarRefinement extends EssaNodeRefinement { class ImportStarRefinement extends EssaNodeRefinement {
ImportStarRefinement() { ImportStarRefinement() {
SsaSource::import_star_refinement(this.getSourceVariable(), _, this.getDefiningNode()) SsaSource::import_star_refinement(this.getSourceVariable(), _, this.getDefiningNode())
@@ -654,7 +654,7 @@ class ImportStarRefinement extends EssaNodeRefinement {
override string getAPrimaryQlClass() { result = "ImportStarRefinement" } override string getAPrimaryQlClass() { result = "ImportStarRefinement" }
} }
/** Assignment of an attribute `obj.attr = val` */ /** An assignment of an attribute `obj.attr = val` */
class AttributeAssignment extends EssaNodeRefinement { class AttributeAssignment extends EssaNodeRefinement {
AttributeAssignment() { AttributeAssignment() {
SsaSource::attribute_assignment_refinement(this.getSourceVariable(), _, this.getDefiningNode()) SsaSource::attribute_assignment_refinement(this.getSourceVariable(), _, this.getDefiningNode())
@@ -693,7 +693,7 @@ class ArgumentRefinement extends EssaNodeRefinement {
override string getAPrimaryQlClass() { result = "ArgumentRefinement" } override string getAPrimaryQlClass() { result = "ArgumentRefinement" }
} }
/** Deletion of an attribute `del obj.attr`. */ /** A deletion of an attribute `del obj.attr`. */
class EssaAttributeDeletion extends EssaNodeRefinement { class EssaAttributeDeletion extends EssaNodeRefinement {
EssaAttributeDeletion() { EssaAttributeDeletion() {
SsaSource::attribute_deletion_refinement(this.getSourceVariable(), _, this.getDefiningNode()) SsaSource::attribute_deletion_refinement(this.getSourceVariable(), _, this.getDefiningNode())
@@ -734,7 +734,7 @@ class SingleSuccessorGuard extends EssaNodeRefinement {
} }
/** /**
* Implicit definition of the names of sub-modules in a package. * An implicit definition of the names of sub-modules in a package.
* Although the interpreter does not pre-define these names, merely populating them * Although the interpreter does not pre-define these names, merely populating them
* as they are imported, this is a good approximation for static analysis. * as they are imported, this is a good approximation for static analysis.
*/ */
@@ -784,7 +784,7 @@ class SelfCallsiteRefinement extends MethodCallsiteRefinement {
override string getAPrimaryQlClass() { result = "SelfCallsiteRefinement" } override string getAPrimaryQlClass() { result = "SelfCallsiteRefinement" }
} }
/** Python specific sub-class of generic EssaEdgeRefinement */ /** A Python specific sub-class of generic EssaEdgeRefinement */
class PyEdgeRefinement extends EssaEdgeRefinement { class PyEdgeRefinement extends EssaEdgeRefinement {
override string getRepresentation() { override string getRepresentation() {
/* /*

View File

@@ -112,7 +112,7 @@ abstract class SpecificGeneratedFile extends GeneratedFile {
} }
/** File generated by the spitfire templating engine */ /** A file generated by the spitfire templating engine */
class SpitfireGeneratedFile extends SpecificGeneratedFile { class SpitfireGeneratedFile extends SpecificGeneratedFile {
SpitfireGeneratedFile() { SpitfireGeneratedFile() {
exists(Module m | m.getFile() = this and not m instanceof SpitfireTemplate | exists(Module m | m.getFile() = this and not m instanceof SpitfireTemplate |
@@ -127,14 +127,14 @@ class SpitfireGeneratedFile extends SpecificGeneratedFile {
override string getTool() { result = "spitfire" } override string getTool() { result = "spitfire" }
} }
/** File generated by the pyxl templating engine */ /** A file generated by the pyxl templating engine */
class PyxlGeneratedFile extends SpecificGeneratedFile { class PyxlGeneratedFile extends SpecificGeneratedFile {
PyxlGeneratedFile() { this.getSpecifiedEncoding() = "pyxl" } PyxlGeneratedFile() { this.getSpecifiedEncoding() = "pyxl" }
override string getTool() { result = "pyxl" } override string getTool() { result = "pyxl" }
} }
/** File generated by the mako templating engine */ /** A file generated by the mako templating engine */
class MakoGeneratedFile extends SpecificGeneratedFile { class MakoGeneratedFile extends SpecificGeneratedFile {
MakoGeneratedFile() { MakoGeneratedFile() {
exists(Module m | m.getFile() = this | exists(Module m | m.getFile() = this |
@@ -166,7 +166,7 @@ string from_mako_import(Module m) {
) )
} }
/** File generated by Google's protobuf tool. */ /** A file generated by Google's protobuf tool. */
class ProtobufGeneratedFile extends SpecificGeneratedFile { class ProtobufGeneratedFile extends SpecificGeneratedFile {
ProtobufGeneratedFile() { ProtobufGeneratedFile() {
this.getAbsolutePath().regexpMatch(".*_pb2?.py") and this.getAbsolutePath().regexpMatch(".*_pb2?.py") and

View File

@@ -15,7 +15,7 @@ class UnitTestClass extends TestScope {
abstract class Test extends TestScope { } abstract class Test extends TestScope { }
/** Class of test function that uses the `unittest` framework */ /** A test function that uses the `unittest` framework */
class UnitTestFunction extends Test { class UnitTestFunction extends Test {
UnitTestFunction() { UnitTestFunction() {
this.getScope+() instanceof UnitTestClass and this.getScope+() instanceof UnitTestClass and
@@ -37,7 +37,7 @@ class NoseTestFunction extends Test {
} }
} }
/** Class of functions that are clearly tests, but don't belong to a specific framework */ /** A function that is clearly a test, but doesn't belong to a specific framework */
class UnknownTestFunction extends Test { class UnknownTestFunction extends Test {
UnknownTestFunction() { UnknownTestFunction() {
this.(Function).getName().matches("test%") and this.(Function).getName().matches("test%") and

View File

@@ -47,7 +47,7 @@ private module Aiomysql {
} }
/** /**
* Calling `execute` on a `Cursor` constructs a query. * A query. Calling `execute` on a `Cursor` constructs a query.
* See https://aiomysql.readthedocs.io/en/stable/cursors.html#Cursor.execute * See https://aiomysql.readthedocs.io/en/stable/cursors.html#Cursor.execute
*/ */
class CursorExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode { class CursorExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode {
@@ -73,7 +73,7 @@ private module Aiomysql {
} }
/** /**
* Awaiting the result of calling `execute` executes the query. * An awaited query. Awaiting the result of calling `execute` executes the query.
* See https://aiomysql.readthedocs.io/en/stable/cursors.html#Cursor.execute * See https://aiomysql.readthedocs.io/en/stable/cursors.html#Cursor.execute
*/ */
class AwaitedCursorExecuteCall extends SqlExecution::Range { class AwaitedCursorExecuteCall extends SqlExecution::Range {
@@ -104,7 +104,7 @@ private module Aiomysql {
API::Node saConnection() { result = engine().getMember("acquire").getReturn().getAwaited() } API::Node saConnection() { result = engine().getMember("acquire").getReturn().getAwaited() }
/** /**
* Calling `execute` on a `SAConnection` constructs a query. * A query. Calling `execute` on a `SAConnection` constructs a query.
* See https://aiomysql.readthedocs.io/en/stable/sa.html#aiomysql.sa.SAConnection.execute * See https://aiomysql.readthedocs.io/en/stable/sa.html#aiomysql.sa.SAConnection.execute
*/ */
class SAConnectionExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode { class SAConnectionExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode {
@@ -132,7 +132,7 @@ private module Aiomysql {
} }
/** /**
* Awaiting the result of calling `execute` executes the query. * An awaited query. Awaiting the result of calling `execute` executes the query.
* See https://aiomysql.readthedocs.io/en/stable/sa.html#aiomysql.sa.SAConnection.execute * See https://aiomysql.readthedocs.io/en/stable/sa.html#aiomysql.sa.SAConnection.execute
*/ */
class AwaitedSAConnectionExecuteCall extends SqlExecution::Range { class AwaitedSAConnectionExecuteCall extends SqlExecution::Range {

View File

@@ -47,7 +47,7 @@ private module Aiopg {
} }
/** /**
* Calling `execute` on a `Cursor` constructs a query. * A query. Calling `execute` on a `Cursor` constructs a query.
* See https://aiopg.readthedocs.io/en/stable/core.html#aiopg.Cursor.execute * See https://aiopg.readthedocs.io/en/stable/core.html#aiopg.Cursor.execute
*/ */
class CursorExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode { class CursorExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode {
@@ -73,7 +73,7 @@ private module Aiopg {
} }
/** /**
* Awaiting the result of calling `execute` executes the query. * An awaited query. Awaiting the result of calling `execute` executes the query.
* See https://aiopg.readthedocs.io/en/stable/core.html#aiopg.Cursor.execute * See https://aiopg.readthedocs.io/en/stable/core.html#aiopg.Cursor.execute
*/ */
class AwaitedCursorExecuteCall extends SqlExecution::Range { class AwaitedCursorExecuteCall extends SqlExecution::Range {
@@ -100,7 +100,7 @@ private module Aiopg {
API::Node saConnection() { result = engine().getMember("acquire").getReturn().getAwaited() } API::Node saConnection() { result = engine().getMember("acquire").getReturn().getAwaited() }
/** /**
* Calling `execute` on a `SAConnection` constructs a query. * A query. Calling `execute` on a `SAConnection` constructs a query.
* See https://aiopg.readthedocs.io/en/stable/sa.html#aiopg.sa.SAConnection.execute * See https://aiopg.readthedocs.io/en/stable/sa.html#aiopg.sa.SAConnection.execute
*/ */
class SAConnectionExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode { class SAConnectionExecuteCall extends SqlConstruction::Range, DataFlow::CallCfgNode {
@@ -128,7 +128,7 @@ private module Aiopg {
} }
/** /**
* Awaiting the result of calling `execute` executes the query. * An awaited query. Awaiting the result of calling `execute` executes the query.
* See https://aiopg.readthedocs.io/en/stable/sa.html#aiopg.sa.SAConnection.execute * See https://aiopg.readthedocs.io/en/stable/sa.html#aiopg.sa.SAConnection.execute
*/ */
class AwaitedSAConnectionExecuteCall extends SqlExecution::Range { class AwaitedSAConnectionExecuteCall extends SqlExecution::Range {

View File

@@ -46,7 +46,7 @@ private module Asyncpg {
} }
} }
/** `Connection`s and `ConnectionPool`s provide some methods that access the file system. */ /** A model of `Connection` and `ConnectionPool`, which provide some methods that access the file system. */
class FileAccessOnConnection extends FileSystemAccess::Range, DataFlow::MethodCallNode { class FileAccessOnConnection extends FileSystemAccess::Range, DataFlow::MethodCallNode {
string methodName; string methodName;

View File

@@ -20,7 +20,7 @@ private import semmle.python.frameworks.PEP249
*/ */
module ClickhouseDriver { module ClickhouseDriver {
/** /**
* `clickhouse_driver` implements PEP249, * A model of `clickhouse-driver`, which implements PEP249,
* providing ways to execute SQL statements against a database. * providing ways to execute SQL statements against a database.
*/ */
class ClickHouseDriverPEP249 extends PEP249::PEP249ModuleApiNode { class ClickHouseDriverPEP249 extends PEP249::PEP249ModuleApiNode {

View File

@@ -1862,7 +1862,8 @@ module PrivateDjango {
// routing modeling // routing modeling
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** /**
* In order to recognize a class as being a django view class, based on the `as_view` * A class that may be a django view class. In order to recognize a class as being a django view class,
* based on the `as_view`
* call, we need to be able to track such calls on _any_ class. This is provided by * call, we need to be able to track such calls on _any_ class. This is provided by
* the member predicates of this QL class. * the member predicates of this QL class.
* *
@@ -1973,7 +1974,7 @@ module PrivateDjango {
/** Provides a class for modeling new django route handlers. */ /** Provides a class for modeling new django route handlers. */
module DjangoRouteHandler { module DjangoRouteHandler {
/** /**
* Extend this class to model new APIs. If you want to refine existing API models, * A django route handler. Extend this class to model new APIs. If you want to refine existing API models,
* extend `DjangoRouteHandler` instead. * extend `DjangoRouteHandler` instead.
*/ */
abstract class Range extends Function { } abstract class Range extends Function { }

View File

@@ -27,7 +27,10 @@ private module MySQLdb {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// MySQLdb // MySQLdb
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** MySQLdb implements PEP 249, providing ways to execute SQL statements against a database. */ /**
* A model for MySQLdb as a module that implements PEP 249, providing ways to execute SQL statements
* against a database.
*/
class MySQLdb extends PEP249::PEP249ModuleApiNode { class MySQLdb extends PEP249::PEP249ModuleApiNode {
MySQLdb() { this = API::moduleImport("MySQLdb") } MySQLdb() { this = API::moduleImport("MySQLdb") }
} }

View File

@@ -22,7 +22,10 @@ private module Psycopg2 {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Psycopg // Psycopg
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** psycopg2 implements PEP 249, providing ways to execute SQL statements against a database. */ /**
* A model of psycopg2 as a module that implements PEP 249, providing ways to execute SQL statements
* against a database.
*/
class Psycopg2 extends PEP249::PEP249ModuleApiNode { class Psycopg2 extends PEP249::PEP249ModuleApiNode {
Psycopg2() { this = API::moduleImport("psycopg2") } Psycopg2() { this = API::moduleImport("psycopg2") }
} }

View File

@@ -15,7 +15,10 @@ private import semmle.python.frameworks.PEP249
* See https://pypi.org/project/PyMySQL/ * See https://pypi.org/project/PyMySQL/
*/ */
private module PyMySQL { private module PyMySQL {
/** PyMySQL implements PEP 249, providing ways to execute SQL statements against a database. */ /**
* A model of PyMySQL as a module that implements PEP 249, providing ways to execute SQL statements
* against a database.
*/
class PyMySQLPEP249 extends PEP249::PEP249ModuleApiNode { class PyMySQLPEP249 extends PEP249::PEP249ModuleApiNode {
PyMySQLPEP249() { this = API::moduleImport("pymysql") } PyMySQLPEP249() { this = API::moduleImport("pymysql") }
} }

View File

@@ -2338,7 +2338,8 @@ private module StdlibPrivate {
// sqlite3 // sqlite3
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** /**
* sqlite3 implements PEP 249, providing ways to execute SQL statements against a database. * A model of sqlite3 as a module that implements PEP 249, providing ways to execute SQL statements
* against a database.
* *
* See https://devdocs.io/python~3.9/library/sqlite3 * See https://devdocs.io/python~3.9/library/sqlite3
*/ */

View File

@@ -53,7 +53,7 @@ abstract class CallableObjectInternal extends ObjectInternal {
override ObjectInternal getIterNext() { none() } override ObjectInternal getIterNext() { none() }
} }
/** Class representing Python functions */ /** A Python function. */
class PythonFunctionObjectInternal extends CallableObjectInternal, TPythonFunctionObject { class PythonFunctionObjectInternal extends CallableObjectInternal, TPythonFunctionObject {
override Function getScope() { override Function getScope() {
exists(CallableExpr expr | exists(CallableExpr expr |
@@ -167,7 +167,7 @@ private BasicBlock blockReturningNone(Function func) {
) )
} }
/** Class representing built-in functions such as `len` or `print`. */ /** A built-in function such as `len` or `print`. */
class BuiltinFunctionObjectInternal extends CallableObjectInternal, TBuiltinFunctionObject { class BuiltinFunctionObjectInternal extends CallableObjectInternal, TBuiltinFunctionObject {
override Builtin getBuiltin() { this = TBuiltinFunctionObject(result) } override Builtin getBuiltin() { this = TBuiltinFunctionObject(result) }
@@ -290,7 +290,7 @@ private Builtin getBuiltinFunctionReturnType(Builtin func) {
) )
} }
/** Class representing methods of built-in classes (otherwise known as method-descriptors) such as `list.append`. */ /** A method of a built-in class (otherwise known as method-descriptors) such as `list.append`. */
class BuiltinMethodObjectInternal extends CallableObjectInternal, TBuiltinMethodObject { class BuiltinMethodObjectInternal extends CallableObjectInternal, TBuiltinMethodObject {
override Builtin getBuiltin() { this = TBuiltinMethodObject(result) } override Builtin getBuiltin() { this = TBuiltinMethodObject(result) }
@@ -380,7 +380,7 @@ class BuiltinMethodObjectInternal extends CallableObjectInternal, TBuiltinMethod
} }
/** /**
* Class representing bound-methods. * A bound-method.
* Note that built-in methods, such as `[].append` are also represented as bound-methods. * Note that built-in methods, such as `[].append` are also represented as bound-methods.
* Although built-in methods and bound-methods are distinct classes in CPython, their behavior * Although built-in methods and bound-methods are distinct classes in CPython, their behavior
* is the same and we treat them identically. * is the same and we treat them identically.

View File

@@ -6,7 +6,7 @@ private import semmle.python.pointsto.PointsToContext
private import semmle.python.pointsto.MRO private import semmle.python.pointsto.MRO
private import semmle.python.types.Builtins private import semmle.python.types.Builtins
/** Class representing classes */ /** A class. */
abstract class ClassObjectInternal extends ObjectInternal { abstract class ClassObjectInternal extends ObjectInternal {
override string getName() { result = this.getClassDeclaration().getName() } override string getName() { result = this.getClassDeclaration().getName() }
@@ -109,7 +109,7 @@ abstract class ClassObjectInternal extends ObjectInternal {
override predicate isNotSubscriptedType() { any() } override predicate isNotSubscriptedType() { any() }
} }
/** Class representing Python source classes */ /** A class that is defined in Python source. */
class PythonClassObjectInternal extends ClassObjectInternal, TPythonClassObject { class PythonClassObjectInternal extends ClassObjectInternal, TPythonClassObject {
/** Gets the scope for this Python class */ /** Gets the scope for this Python class */
Class getScope() { Class getScope() {
@@ -163,7 +163,7 @@ class PythonClassObjectInternal extends ClassObjectInternal, TPythonClassObject
} }
} }
/** Class representing built-in classes, except `type` */ /** A built-in class, except `type`. */
class BuiltinClassObjectInternal extends ClassObjectInternal, TBuiltinClassObject { class BuiltinClassObjectInternal extends ClassObjectInternal, TBuiltinClassObject {
override Builtin getBuiltin() { this = TBuiltinClassObject(result) } override Builtin getBuiltin() { this = TBuiltinClassObject(result) }

View File

@@ -7,7 +7,7 @@ private import semmle.python.pointsto.PointsToContext
private import semmle.python.types.Builtins private import semmle.python.types.Builtins
/** /**
* Class representing constants. * A constant.
* Includes `None`, `True` and `False` as * Includes `None`, `True` and `False` as
* well as strings and integers. * well as strings and integers.
*/ */

View File

@@ -6,7 +6,7 @@ private import semmle.python.pointsto.PointsToContext
private import semmle.python.pointsto.MRO private import semmle.python.pointsto.MRO
private import semmle.python.types.Builtins private import semmle.python.types.Builtins
/** Class representing property objects in Python */ /** A property object. */
class PropertyInternal extends ObjectInternal, TProperty { class PropertyInternal extends ObjectInternal, TProperty {
/** Gets the name of this property */ /** Gets the name of this property */
override string getName() { result = this.getGetter().getName() } override string getName() { result = this.getGetter().getName() }

View File

@@ -26,7 +26,7 @@ class ClassScope = Class;
class ModuleScope = Module; class ModuleScope = Module;
/** /**
* Class representing values in the Python program * A value in the Python program.
* Each `Value` is a static approximation to a set of one or more real objects. * Each `Value` is a static approximation to a set of one or more real objects.
*/ */
class Value extends TObject { class Value extends TObject {
@@ -144,7 +144,7 @@ class Value extends TObject {
} }
/** /**
* Class representing modules in the Python program * A module in the Python program.
* Each `ModuleValue` represents a module object in the Python program. * Each `ModuleValue` represents a module object in the Python program.
*/ */
class ModuleValue extends Value instanceof ModuleObjectInternal { class ModuleValue extends Value instanceof ModuleObjectInternal {
@@ -339,7 +339,7 @@ module Value {
} }
/** /**
* Class representing callables in the Python program * A callable in the Python program.
* Callables include Python functions, built-in functions and bound-methods, * Callables include Python functions, built-in functions and bound-methods,
* but not classes. * but not classes.
*/ */
@@ -447,7 +447,7 @@ class CallableValue extends Value {
} }
/** /**
* Class representing bound-methods, such as `o.func`, where `o` is an instance * A bound-method, such as `o.func`, where `o` is an instance
* of a class that has a callable attribute `func`. * of a class that has a callable attribute `func`.
*/ */
class BoundMethodValue extends CallableValue instanceof BoundMethodObjectInternal { class BoundMethodValue extends CallableValue instanceof BoundMethodObjectInternal {
@@ -468,7 +468,7 @@ class BoundMethodValue extends CallableValue instanceof BoundMethodObjectInterna
} }
/** /**
* Class representing classes in the Python program, both Python and built-in. * A class in the Python program, both Python and built-in.
*/ */
class ClassValue extends Value { class ClassValue extends Value {
ClassValue() { this.(ObjectInternal).isClass() = true } ClassValue() { this.(ObjectInternal).isClass() = true }
@@ -655,7 +655,7 @@ class ClassValue extends Value {
} }
/** /**
* Class representing functions in the Python program, both Python and built-in. * A function in the Python program, both Python and built-in.
* Note that this does not include other callables such as bound-methods. * Note that this does not include other callables such as bound-methods.
*/ */
abstract class FunctionValue extends CallableValue { abstract class FunctionValue extends CallableValue {
@@ -721,7 +721,7 @@ abstract class FunctionValue extends CallableValue {
predicate isLambda() { this.getOrigin().getNode() instanceof Lambda } predicate isLambda() { this.getOrigin().getNode() instanceof Lambda }
} }
/** Class representing Python functions */ /** A Python function. */
class PythonFunctionValue extends FunctionValue { class PythonFunctionValue extends FunctionValue {
PythonFunctionValue() { this instanceof PythonFunctionObjectInternal } PythonFunctionValue() { this instanceof PythonFunctionObjectInternal }
@@ -769,7 +769,7 @@ class PythonFunctionValue extends FunctionValue {
} }
} }
/** Class representing builtin functions, such as `len` or `print` */ /** A builtin function, such as `len` or `print`. */
class BuiltinFunctionValue extends FunctionValue { class BuiltinFunctionValue extends FunctionValue {
BuiltinFunctionValue() { this instanceof BuiltinFunctionObjectInternal } BuiltinFunctionValue() { this instanceof BuiltinFunctionObjectInternal }
@@ -796,7 +796,7 @@ class BuiltinFunctionValue extends FunctionValue {
} }
} }
/** Class representing builtin methods, such as `list.append` or `set.add` */ /** A builtin method, such as `list.append` or `set.add` */
class BuiltinMethodValue extends FunctionValue { class BuiltinMethodValue extends FunctionValue {
BuiltinMethodValue() { this instanceof BuiltinMethodObjectInternal } BuiltinMethodValue() { this instanceof BuiltinMethodObjectInternal }

View File

@@ -23,6 +23,8 @@ private newtype TTInvocation =
} }
/** /**
* A function invocation.
*
* This class represents a static approximation to the * This class represents a static approximation to the
* dynamic call-graph. A `FunctionInvocation` represents * dynamic call-graph. A `FunctionInvocation` represents
* all calls made to a function for a given context. * all calls made to a function for a given context.

View File

@@ -126,7 +126,7 @@ module Context {
} }
/** /**
* Points-to context. Context can be one of: * A points-to context. Context can be one of:
* * "main": Used for scripts. * * "main": Used for scripts.
* * "import": Use for non-script modules. * * "import": Use for non-script modules.
* * "default": Use for functions and methods without caller context. * * "default": Use for functions and methods without caller context.

View File

@@ -13,7 +13,7 @@
import python import python
/** Subset of ControlFlowNodes which might raise an exception */ /** The subset of ControlFlowNodes which might raise an exception */
class RaisingNode extends ControlFlowNode { class RaisingNode extends ControlFlowNode {
RaisingNode() { RaisingNode() {
exists(this.getAnExceptionalSuccessor()) exists(this.getAnExceptionalSuccessor())
@@ -363,7 +363,7 @@ predicate scope_raises_unknown(Scope s) {
) )
} }
/** ControlFlowNode for an 'except' statement. */ /** The ControlFlowNode for an 'except' statement. */
class ExceptFlowNode extends ControlFlowNode { class ExceptFlowNode extends ControlFlowNode {
ExceptFlowNode() { this.getNode() instanceof ExceptStmt } ExceptFlowNode() { this.getNode() instanceof ExceptStmt }

View File

@@ -65,7 +65,7 @@ abstract deprecated class CustomPointsToAttribute extends Object {
} }
/* An example */ /* An example */
/** Any variable iterating over range or xrange must be an integer */ /** An extension representing the fact that a variable iterating over range or xrange must be an integer */
class RangeIterationVariableFact extends PointsToExtension { class RangeIterationVariableFact extends PointsToExtension {
RangeIterationVariableFact() { RangeIterationVariableFact() {
exists(For f, ControlFlowNode iterable | exists(For f, ControlFlowNode iterable |

View File

@@ -14,6 +14,8 @@ private predicate is_an_object(@py_object obj) {
} }
/** /**
* An object.
*
* Instances of this class represent objects in the Python program. However, since * Instances of this class represent objects in the Python program. However, since
* the QL database is static and Python programs are dynamic, there are necessarily a * the QL database is static and Python programs are dynamic, there are necessarily a
* number of approximations. * number of approximations.
@@ -217,7 +219,7 @@ private Object findByName3(string longName) {
} }
/** /**
* Numeric objects (ints and floats). * A numeric object (int or float).
* Includes those occurring in the source as a literal * Includes those occurring in the source as a literal
* or in a builtin module as a value. * or in a builtin module as a value.
*/ */
@@ -269,7 +271,7 @@ class NumericObject extends Object {
} }
/** /**
* String objects (unicode or bytes). * A string object (unicode or bytes).
* Includes those occurring in the source as a literal * Includes those occurring in the source as a literal
* or in a builtin module as a value. * or in a builtin module as a value.
*/ */
@@ -299,7 +301,7 @@ class StringObject extends Object {
} }
/** /**
* Sequence objects (lists and tuples) * A sequence object (list or tuple)
* Includes those occurring in the source as a literal * Includes those occurring in the source as a literal
* or in a builtin module as a value. * or in a builtin module as a value.
*/ */

View File

@@ -12,7 +12,7 @@ import semmle.python.web.bottle.General
deprecated FunctionValue bottle_redirect() { result = theBottleModule().attr("redirect") } deprecated FunctionValue bottle_redirect() { result = theBottleModule().attr("redirect") }
/** /**
* Represents an argument to the `bottle.redirect` function. * An argument to the `bottle.redirect` function.
*/ */
deprecated class BottleRedirect extends TaintSink { deprecated class BottleRedirect extends TaintSink {
override string toString() { result = "bottle.redirect" } override string toString() { result = "bottle.redirect" }

View File

@@ -68,7 +68,7 @@ deprecated class UntrustedFile extends TaintKind {
// TO DO.. File uploads -- Should check about file uploads for other frameworks as well. // TO DO.. File uploads -- Should check about file uploads for other frameworks as well.
// Move UntrustedFile to shared location // Move UntrustedFile to shared location
// //
/** Parameter to a bottle request handler function */ /** A parameter to a bottle request handler function */
deprecated class BottleRequestParameter extends HttpRequestTaintSource { deprecated class BottleRequestParameter extends HttpRequestTaintSource {
BottleRequestParameter() { BottleRequestParameter() {
exists(BottleRoute route | route.getANamedArgument() = this.(ControlFlowNode).getNode()) exists(BottleRoute route | route.getANamedArgument() = this.(ControlFlowNode).getNode())

View File

@@ -1,7 +1,7 @@
import python import python
private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsTo
/** Helper class for UndefinedClassAttribute.ql and MaybeUndefinedClassAttribute.ql */ /** A helper class for UndefinedClassAttribute.ql and MaybeUndefinedClassAttribute.ql */
class CheckClass extends ClassObject { class CheckClass extends ClassObject {
private predicate ofInterest() { private predicate ofInterest() {
not this.unknowableAttributes() and not this.unknowableAttributes() and

View File

@@ -2,7 +2,7 @@ import python
import Loop import Loop
import semmle.python.dataflow.TaintTracking import semmle.python.dataflow.TaintTracking
/** Marker for "uninitialized". */ /** A marker for "uninitialized". */
class Uninitialized extends TaintKind { class Uninitialized extends TaintKind {
Uninitialized() { this = "undefined" } Uninitialized() { this = "undefined" }
} }

View File

@@ -467,7 +467,7 @@ Definition getUniqueDefinition(Expr use) {
not result = TLocalDefinition(use) not result = TLocalDefinition(use)
} }
/** Helper class to get suitable locations for attributes */ /** A helper class to get suitable locations for attributes */
class NiceLocationExpr extends Expr { class NiceLocationExpr extends Expr {
/** Gets a textual representation of this element. */ /** Gets a textual representation of this element. */
override string toString() { result = this.(Expr).toString() } override string toString() { result = this.(Expr).toString() }

View File

@@ -18,7 +18,7 @@ import ClientSuppliedIpUsedInSecurityCheckLib
import DataFlow::PathGraph import DataFlow::PathGraph
/** /**
* Taint-tracking configuration tracing flow from obtaining a client ip from an HTTP header to a sensitive use. * A taint-tracking configuration tracing flow from obtaining a client ip from an HTTP header to a sensitive use.
*/ */
class ClientSuppliedIpUsedInSecurityCheckConfig extends TaintTracking::Configuration { class ClientSuppliedIpUsedInSecurityCheckConfig extends TaintTracking::Configuration {
ClientSuppliedIpUsedInSecurityCheckConfig() { this = "ClientSuppliedIpUsedInSecurityCheckConfig" } ClientSuppliedIpUsedInSecurityCheckConfig() { this = "ClientSuppliedIpUsedInSecurityCheckConfig" }

View File

@@ -8,7 +8,7 @@ import experimental.semmle.python.templates.SSTISink
deprecated ClassValue theAirspeedTemplateClass() { result = Value::named("airspeed.Template") } deprecated ClassValue theAirspeedTemplateClass() { result = Value::named("airspeed.Template") }
/** /**
* Sink representing the `airspeed.Template` class instantiation argument. * A sink representing the `airspeed.Template` class instantiation argument.
* *
* import airspeed * import airspeed
* temp = airspeed.Template(`"sink"`) * temp = airspeed.Template(`"sink"`)

View File

@@ -10,7 +10,7 @@ deprecated ClassValue theBottleSimpleTemplateClass() {
} }
/** /**
* Sink representing the `bottle.SimpleTemplate` class instantiation argument. * A sink representing the `bottle.SimpleTemplate` class instantiation argument.
* *
* from bottle import SimpleTemplate * from bottle import SimpleTemplate
* template = SimpleTemplate(`sink`) * template = SimpleTemplate(`sink`)
@@ -29,7 +29,7 @@ deprecated class BottleSimpleTemplateSink extends SSTISink {
} }
/** /**
* Sink representing the `bottle.template` function call argument. * A sink representing the `bottle.template` function call argument.
* *
* from bottle import template * from bottle import template
* tmp = template(`sink`) * tmp = template(`sink`)

View File

@@ -10,7 +10,7 @@ deprecated ClassValue theChameleonPageTemplateClass() {
} }
/** /**
* Sink representing the `chameleon.PageTemplate` class instantiation argument. * A sink representing the `chameleon.PageTemplate` class instantiation argument.
* *
* from chameleon import PageTemplate * from chameleon import PageTemplate
* template = PageTemplate(`sink`) * template = PageTemplate(`sink`)

View File

@@ -10,7 +10,7 @@ deprecated ClassValue theCheetahTemplateClass() {
} }
/** /**
* Sink representing the instantiation argument of any class which derives from * A sink representing the instantiation argument of any class which derives from
* the `Cheetah.Template.Template` class . * the `Cheetah.Template.Template` class .
* *
* from Cheetah.Template import Template * from Cheetah.Template import Template

View File

@@ -8,7 +8,7 @@ import experimental.semmle.python.templates.SSTISink
deprecated Value theChevronRenderFunc() { result = Value::named("chevron.render") } deprecated Value theChevronRenderFunc() { result = Value::named("chevron.render") }
/** /**
* Sink representing the `chevron.render` function call argument. * A sink representing the `chevron.render` function call argument.
* *
* import chevron * import chevron
* tmp = chevron.render(`sink`,{ 'key' : 'value' }) * tmp = chevron.render(`sink`,{ 'key' : 'value' })

View File

@@ -7,7 +7,7 @@ import experimental.semmle.python.templates.SSTISink
deprecated ClassValue theDjangoTemplateClass() { result = Value::named("django.template.Template") } deprecated ClassValue theDjangoTemplateClass() { result = Value::named("django.template.Template") }
/** /**
* Sink representng `django.template.Template` class instantiation argument. * A sink representng `django.template.Template` class instantiation argument.
* *
* from django.template import Template * from django.template import Template
* template = Template(`sink`) * template = Template(`sink`)

View File

@@ -9,7 +9,7 @@ deprecated Value theFlaskRenderTemplateClass() {
} }
/** /**
* Sink representng `flask.render_template_string` function call argument. * A sink representng `flask.render_template_string` function call argument.
* *
* from flask import render_template_string * from flask import render_template_string
* render_template_string(`sink`) * render_template_string(`sink`)

View File

@@ -15,7 +15,7 @@ deprecated ClassValue theGenshiMarkupTemplateClass() {
} }
/** /**
* Sink representing the `genshi.template.TextTemplate` class instantiation argument. * A sink representing the `genshi.template.TextTemplate` class instantiation argument.
* *
* from genshi.template import TextTemplate * from genshi.template import TextTemplate
* tmpl = TextTemplate('sink') * tmpl = TextTemplate('sink')
@@ -34,7 +34,7 @@ deprecated class GenshiTextTemplateSink extends SSTISink {
} }
/** /**
* Sink representing the `genshi.template.MarkupTemplate` class instantiation argument. * A sink representing the `genshi.template.MarkupTemplate` class instantiation argument.
* *
* from genshi.template import MarkupTemplate * from genshi.template import MarkupTemplate
* tmpl = MarkupTemplate('sink') * tmpl = MarkupTemplate('sink')

View File

@@ -11,7 +11,7 @@ deprecated ClassValue theJinja2TemplateClass() { result = Value::named("jinja2.T
deprecated Value theJinja2FromStringValue() { result = Value::named("jinja2.from_string") } deprecated Value theJinja2FromStringValue() { result = Value::named("jinja2.from_string") }
/** /**
* Sink representing the `jinja2.Template` class instantiation argument. * A sink representing the `jinja2.Template` class instantiation argument.
* *
* from jinja2 import Template * from jinja2 import Template
* template = Template(`sink`) * template = Template(`sink`)
@@ -30,7 +30,7 @@ deprecated class Jinja2TemplateSink extends SSTISink {
} }
/** /**
* Sink representing the `jinja2.from_string` function call argument. * A sink representing the `jinja2.from_string` function call argument.
* *
* from jinja2 import from_string * from jinja2 import from_string
* template = from_string(`sink`) * template = from_string(`sink`)

View File

@@ -8,7 +8,7 @@ import experimental.semmle.python.templates.SSTISink
deprecated ClassValue theMakoTemplateClass() { result = Value::named("mako.template.Template") } deprecated ClassValue theMakoTemplateClass() { result = Value::named("mako.template.Template") }
/** /**
* Sink representing the `mako.template.Template` class instantiation argument. * A sink representing the `mako.template.Template` class instantiation argument.
* *
* from mako.template import Template * from mako.template import Template
* mytemplate = Template("hello world!") * mytemplate = Template("hello world!")

View File

@@ -8,7 +8,7 @@ import experimental.semmle.python.templates.SSTISink
deprecated ClassValue theTRenderTemplateClass() { result = Value::named("trender.TRender") } deprecated ClassValue theTRenderTemplateClass() { result = Value::named("trender.TRender") }
/** /**
* Sink representing the `trender.TRender` class instantiation argument. * A sink representing the `trender.TRender` class instantiation argument.
* *
* from trender import TRender * from trender import TRender
* template = TRender(`sink`) * template = TRender(`sink`)

View File

@@ -88,7 +88,7 @@ private newtype TCallGraphResolver =
TPointsToResolver() or TPointsToResolver() or
TTypeTrackerResolver() TTypeTrackerResolver()
/** Describes a method of call graph resolution */ /** A method of call graph resolution */
abstract class CallGraphResolver extends TCallGraphResolver { abstract class CallGraphResolver extends TCallGraphResolver {
abstract predicate callEdge(Call call, Function callable); abstract predicate callEdge(Call call, Function callable);

View File

@@ -2,7 +2,7 @@ import python
private import semmle.python.objects.ObjectInternal private import semmle.python.objects.ObjectInternal
private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsTo
/** Make unknown type visible */ /** An unknown type. Not usually visible. */
class UnknownType extends UnknownClassInternal { class UnknownType extends UnknownClassInternal {
override string toString() { result = "*UNKNOWN TYPE" } override string toString() { result = "*UNKNOWN TYPE" }
} }

View File

@@ -2,7 +2,7 @@ import python
private import semmle.python.objects.ObjectInternal private import semmle.python.objects.ObjectInternal
private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsTo
/** Make unknown type visible */ /** An unknown type. Not usually visible. */
class UnknownType extends UnknownClassInternal { class UnknownType extends UnknownClassInternal {
override string toString() { result = "*UNKNOWN TYPE" } override string toString() { result = "*UNKNOWN TYPE" }
} }

View File

@@ -1,7 +1,7 @@
import python import python
private import semmle.python.objects.ObjectInternal private import semmle.python.objects.ObjectInternal
/** Make unknown type visible */ /** An unknown type. Not usually visible. */
class UnknownType extends UnknownClassInternal { class UnknownType extends UnknownClassInternal {
override string toString() { result = "*UNKNOWN TYPE" } override string toString() { result = "*UNKNOWN TYPE" }
} }

View File

@@ -17,7 +17,7 @@ class Wally extends Engineer {
Wally() { this = "Wally" } Wally() { this = "Wally" }
} }
/** Then the configuration */ /** The configuration for this example. */
class DilbertConfig extends TaintTracking::Configuration { class DilbertConfig extends TaintTracking::Configuration {
DilbertConfig() { this = "Dilbert config" } DilbertConfig() { this = "Dilbert config" }

View File

@@ -162,7 +162,7 @@ private Builtin traverse_qualname(Builtin parent, string qualname) {
} }
/** /**
* Class of recorded calls where we can identify both the `call` and the `callee` uniquely. * Arecorded call where we can identify both the `call` and the `callee` uniquely.
*/ */
class IdentifiedRecordedCall extends XMLRecordedCall { class IdentifiedRecordedCall extends XMLRecordedCall {
IdentifiedRecordedCall() { IdentifiedRecordedCall() {
@@ -212,14 +212,14 @@ class IdentifiedRecordedCall extends XMLRecordedCall {
} }
/** /**
* Class of recorded calls where we cannot identify both the `call` and the `callee` uniquely. * A recorded call where we cannot identify both the `call` and the `callee` uniquely.
*/ */
class UnidentifiedRecordedCall extends XMLRecordedCall { class UnidentifiedRecordedCall extends XMLRecordedCall {
UnidentifiedRecordedCall() { not this instanceof IdentifiedRecordedCall } UnidentifiedRecordedCall() { not this instanceof IdentifiedRecordedCall }
} }
/** /**
* Recorded calls made from outside project folder, that can be ignored when evaluating * A Recorded call made from outside the project folder. These can be ignored when evaluating
* call-graph quality. * call-graph quality.
*/ */
class IgnoredRecordedCall extends XMLRecordedCall { class IgnoredRecordedCall extends XMLRecordedCall {