@@ -1540,49 +1540,19 @@ private module StdlibPrivate {
1540
1540
1541
1541
/** Helper module for tracking compiled regexes. */
1542
1542
private module CompiledRegexes {
1543
- private import semmle.python.dataflow.new.DataFlow4
1544
- private import semmle.python.RegexTreeView
1545
-
1546
- // TODO: This module should be refactored once API graphs are more expressive.
1547
- // For now it uses data flow, so we pick the version with least chance of collision (4) .
1548
- /** A configuration for finding uses of compiled regexes. */
1549
- class RegexDefinitionConfiguration extends DataFlow4:: Configuration {
1550
- RegexDefinitionConfiguration ( ) { this = "RegexDefinitionConfiguration" }
1551
-
1552
- override predicate isSource ( DataFlow:: Node source ) { source instanceof RegexDefinitonSource }
1553
-
1554
- override predicate isSink ( DataFlow:: Node sink ) { sink instanceof RegexDefinitionSink }
1555
- }
1556
-
1557
- /** A regex compilation. */
1558
- class RegexDefinitonSource extends DataFlow:: CallCfgNode {
1559
- DataFlow:: Node regexNode ;
1560
-
1561
- RegexDefinitonSource ( ) {
1562
- this = API:: moduleImport ( "re" ) .getMember ( "compile" ) .getACall ( ) and
1563
- regexNode in [ this .getArg ( 0 ) , this .getArgByName ( "pattern" ) ]
1564
- }
1565
-
1566
- /** Gets the data flow node for the regex being compiled by this node. */
1567
- DataFlow:: Node getRegexNode ( ) { result = regexNode }
1543
+ private DataFlow:: TypeTrackingNode compiledRegex ( DataFlow:: TypeTracker t , DataFlow:: Node regex ) {
1544
+ t .start ( ) and
1545
+ result = API:: moduleImport ( "re" ) .getMember ( "compile" ) .getACall ( ) and
1546
+ regex in [
1547
+ result .( DataFlow:: CallCfgNode ) .getArg ( 0 ) ,
1548
+ result .( DataFlow:: CallCfgNode ) .getArgByName ( "pattern" )
1549
+ ]
1550
+ or
1551
+ exists ( DataFlow:: TypeTracker t2 | result = compiledRegex ( t2 , regex ) .track ( t2 , t ) )
1568
1552
}
1569
1553
1570
- /** A use of a compiled regex. */
1571
- class RegexDefinitionSink extends DataFlow:: Node {
1572
- RegexExecutionMethod method ;
1573
- DataFlow:: CallCfgNode executingCall ;
1574
-
1575
- RegexDefinitionSink ( ) {
1576
- executingCall =
1577
- API:: moduleImport ( "re" ) .getMember ( "compile" ) .getReturn ( ) .getMember ( method ) .getACall ( ) and
1578
- this = executingCall .getFunction ( ) .( DataFlow:: AttrRead ) .getObject ( )
1579
- }
1580
-
1581
- /** Gets the method used to execute the regex. */
1582
- RegexExecutionMethod getMethod ( ) { result = method }
1583
-
1584
- /** Gets the data flow node for the executing call. */
1585
- DataFlow:: CallCfgNode getExecutingCall ( ) { result = executingCall }
1554
+ DataFlow:: Node compiledRegex ( DataFlow:: Node regex ) {
1555
+ compiledRegex ( DataFlow:: TypeTracker:: end ( ) , regex ) .flowsTo ( result )
1586
1556
}
1587
1557
}
1588
1558
@@ -1608,28 +1578,19 @@ private module StdlibPrivate {
1608
1578
*
1609
1579
* See https://docs.python.org/3/library/re.html#regular-expression-objects
1610
1580
*/
1611
- private class CompiledRegexExecution extends DataFlow:: CallCfgNode , RegexExecution:: Range {
1581
+ private class CompiledRegexExecution extends DataFlow:: MethodCallNode , RegexExecution:: Range {
1612
1582
DataFlow:: Node regexNode ;
1613
- RegexExecutionMethod method ;
1583
+ RegexExecutionMethod methodName ;
1614
1584
1615
- CompiledRegexExecution ( ) {
1616
- exists (
1617
- RegexDefinitionConfiguration conf , RegexDefinitonSource source , RegexDefinitionSink sink
1618
- |
1619
- conf .hasFlow ( source , sink ) and
1620
- regexNode = source .getRegexNode ( ) and
1621
- method = sink .getMethod ( ) and
1622
- this = sink .getExecutingCall ( )
1623
- )
1624
- }
1585
+ CompiledRegexExecution ( ) { this .calls ( compiledRegex ( regexNode ) , methodName ) }
1625
1586
1626
1587
override DataFlow:: Node getRegex ( ) { result = regexNode }
1627
1588
1628
1589
override DataFlow:: Node getString ( ) {
1629
- result in [ this .getArg ( getStringArgIndex ( method ) - 1 ) , this .getArgByName ( "string" ) ]
1590
+ result in [ this .getArg ( getStringArgIndex ( methodName ) - 1 ) , this .getArgByName ( "string" ) ]
1630
1591
}
1631
1592
1632
- override string getName ( ) { result = "re." + method }
1593
+ override string getName ( ) { result = "re." + methodName }
1633
1594
}
1634
1595
1635
1596
/**
0 commit comments