@@ -507,6 +507,119 @@ module Path {
507
507
}
508
508
}
509
509
510
+ /**
511
+ * Provides classes for some functions in the `strconv` package for
512
+ * converting strings to numbers.
513
+ */
514
+ module StrConv {
515
+ /** A function that parses integers. */
516
+ class Atoi extends Function {
517
+ Atoi ( ) { this .hasQualifiedName ( "strconv" , "Atoi" ) }
518
+ }
519
+
520
+ /** A function that parses floating-point numbers. */
521
+ class ParseFloat extends Function {
522
+ ParseFloat ( ) { this .hasQualifiedName ( "strconv" , "ParseFloat" ) }
523
+ }
524
+
525
+ /** A function that parses integers with a specifiable bitSize. */
526
+ class ParseInt extends Function {
527
+ ParseInt ( ) { this .hasQualifiedName ( "strconv" , "ParseInt" ) }
528
+ }
529
+
530
+ /** A function that parses unsigned integers with a specifiable bitSize. */
531
+ class ParseUint extends Function {
532
+ ParseUint ( ) { this .hasQualifiedName ( "strconv" , "ParseUint" ) }
533
+ }
534
+
535
+ /**
536
+ * A constant that gives the size in bits of an int or uint
537
+ * value on the current architecture (32 or 64).
538
+ */
539
+ class IntSize extends DeclaredConstant {
540
+ IntSize ( ) { this .hasQualifiedName ( "strconv" , "IntSize" ) }
541
+ }
542
+ }
543
+
544
+ /** Provides a class for modeling calls to number-parsing functions. */
545
+ module ParserCall {
546
+ /** A data-flow call node that parses a number. */
547
+ abstract class Range extends DataFlow:: CallNode {
548
+ /** Gets the bit size of the type of the result number. */
549
+ abstract int getTargetBitSize ( ) ;
550
+
551
+ /** Holds if the type of the result number is signed. */
552
+ abstract boolean getTargetIsSigned ( ) ;
553
+
554
+ /** Gets the name of the parser function. */
555
+ abstract string getParserName ( ) ;
556
+ }
557
+ }
558
+
559
+ /** A call to a number-parsing function */
560
+ class ParserCall extends DataFlow:: CallNode {
561
+ ParserCall:: Range self ;
562
+
563
+ ParserCall ( ) { this = self }
564
+
565
+ /** Gets the bit size of the type of the result number. */
566
+ int getTargetBitSize ( ) { result = self .getTargetBitSize ( ) }
567
+
568
+ /** Holds if the type of the result number is signed. */
569
+ boolean getTargetIsSigned ( ) { result = self .getTargetIsSigned ( ) }
570
+
571
+ /** Gets the name of the parser function. */
572
+ string getParserName ( ) { result = self .getParserName ( ) }
573
+
574
+ /** Gets a string describing the size of the integer parsed. */
575
+ string getBitSizeString ( ) {
576
+ if getTargetBitSize ( ) != 0
577
+ then result = "a " + getTargetBitSize ( ) + "-bit integer"
578
+ else result = "an integer with architecture-dependent bit-width"
579
+ }
580
+ }
581
+
582
+ /** A call to `strconv.Atoi` */
583
+ class AtoiCall extends DataFlow:: CallNode , ParserCall:: Range {
584
+ AtoiCall ( ) { exists ( StrConv:: Atoi atoi | this = atoi .getACall ( ) ) }
585
+
586
+ override int getTargetBitSize ( ) { result = 0 }
587
+
588
+ override boolean getTargetIsSigned ( ) { result = true }
589
+
590
+ override string getParserName ( ) { result = "strconv.Atoi" }
591
+ }
592
+
593
+ /** A call to `strconv.ParseInt` */
594
+ class ParseIntCall extends DataFlow:: CallNode , ParserCall:: Range {
595
+ ParseIntCall ( ) { exists ( StrConv:: ParseInt parseInt | this = parseInt .getACall ( ) ) }
596
+
597
+ override int getTargetBitSize ( ) {
598
+ if exists ( StrConv:: IntSize intSize | this .getArgument ( 2 ) .( DataFlow:: ReadNode ) .reads ( intSize ) )
599
+ then result = 0
600
+ else result = this .getArgument ( 2 ) .getIntValue ( )
601
+ }
602
+
603
+ override boolean getTargetIsSigned ( ) { result = true }
604
+
605
+ override string getParserName ( ) { result = "strconv.ParseInt" }
606
+ }
607
+
608
+ /** A call to `strconv.ParseUint` */
609
+ class ParseUintCall extends DataFlow:: CallNode , ParserCall:: Range {
610
+ ParseUintCall ( ) { exists ( StrConv:: ParseUint parseUint | this = parseUint .getACall ( ) ) }
611
+
612
+ override int getTargetBitSize ( ) {
613
+ if exists ( StrConv:: IntSize intSize | this .getArgument ( 2 ) .( DataFlow:: ReadNode ) .reads ( intSize ) )
614
+ then result = 0
615
+ else result = this .getArgument ( 2 ) .getIntValue ( )
616
+ }
617
+
618
+ override boolean getTargetIsSigned ( ) { result = false }
619
+
620
+ override string getParserName ( ) { result = "strconv.ParseUint" }
621
+ }
622
+
510
623
/** Provides models of commonly used functions in the `strings` package. */
511
624
module Strings {
512
625
/** The `Join` function. */
0 commit comments