Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/tokenize.c
          +++ new/usr/src/tools/smatch/src/tokenize.c
↓ open down ↓ 85 lines elided ↑ open up ↑
  86   86  
  87   87          buffer[0] = val;
  88   88          buffer[1] = 0;
  89   89          if (val >= SPECIAL_BASE)
  90   90                  strcpy(buffer, (char *) combinations[val - SPECIAL_BASE]);
  91   91          return buffer;
  92   92  }
  93   93  
  94   94  const char *show_ident(const struct ident *ident)
  95   95  {
  96      -        static char buffer[256];
       96 +        static char buff[4][256];
       97 +        static int n;
       98 +        char *buffer;
       99 +
  97  100          if (!ident)
  98  101                  return "<noident>";
      102 +        buffer = buff[3 & ++n];
  99  103          sprintf(buffer, "%.*s", ident->len, ident->name);
 100  104          return buffer;
 101  105  }
 102  106  
 103  107  static char *charstr(char *ptr, unsigned char c, unsigned char escape, unsigned char next)
 104  108  {
 105  109          if (isprint(c)) {
 106  110                  if (c == escape || c == '\\')
 107  111                          *ptr++ = '\\';
 108  112                  *ptr++ = c;
↓ open down ↓ 13 lines elided ↑ open up ↑
 122  126                  
 123  127          return ptr + sprintf(ptr, "%03o", c);
 124  128  }
 125  129  
 126  130  const char *show_string(const struct string *string)
 127  131  {
 128  132          static char buffer[4 * MAX_STRING + 3];
 129  133          char *ptr;
 130  134          int i;
 131  135  
 132      -        if (!string->length)
      136 +        if (!string || !string->length)
 133  137                  return "<bad_string>";
 134  138          ptr = buffer;
 135  139          *ptr++ = '"';
 136  140          for (i = 0; i < string->length-1; i++) {
 137  141                  const char *p = string->data + i;
 138  142                  ptr = charstr(ptr, p[0], '"', p[1]);
 139  143          }
 140  144          *ptr++ = '"';
 141  145          *ptr = '\0';
 142  146          return buffer;
↓ open down ↓ 299 lines elided ↑ open up ↑
 442  446          return nextchar_slow(stream);
 443  447  }
 444  448  
 445  449  struct token eof_token_entry;
 446  450  
 447  451  static struct token *mark_eof(stream_t *stream)
 448  452  {
 449  453          struct token *end;
 450  454  
 451  455          end = alloc_token(stream);
      456 +        eof_token_entry.pos = end->pos;
 452  457          token_type(end) = TOKEN_STREAMEND;
 453  458          end->pos.newline = 1;
 454  459  
 455  460          eof_token_entry.next = &eof_token_entry;
 456  461          eof_token_entry.pos.newline = 1;
 457  462  
 458  463          end->next =  &eof_token_entry;
 459  464          *stream->tokenlist = end;
 460  465          stream->tokenlist = NULL;
 461  466          return end;
↓ open down ↓ 19 lines elided ↑ open up ↑
 481  486  enum {
 482  487          Letter = 1,
 483  488          Digit = 2,
 484  489          Hex = 4,
 485  490          Exp = 8,
 486  491          Dot = 16,
 487  492          ValidSecond = 32,
 488  493          Quote = 64,
 489  494  };
 490  495  
 491      -static const long cclass[257] = {
 492      -        ['0' + 1 ... '7' + 1] = Digit | Hex,    /* \<octal> */
 493      -        ['8' + 1 ... '9' + 1] = Digit | Hex,
      496 +static const char cclass[257] = {
      497 +        ['0' + 1 ... '9' + 1] = Digit | Hex,
 494  498          ['A' + 1 ... 'D' + 1] = Letter | Hex,
 495  499          ['E' + 1] = Letter | Hex | Exp, /* E<exp> */
 496  500          ['F' + 1] = Letter | Hex,
 497  501          ['G' + 1 ... 'O' + 1] = Letter,
 498  502          ['P' + 1] = Letter | Exp,       /* P<exp> */
 499  503          ['Q' + 1 ... 'Z' + 1] = Letter,
 500      -        ['a' + 1 ... 'b' + 1] = Letter | Hex, /* \a, \b */
 501      -        ['c' + 1 ... 'd' + 1] = Letter | Hex,
 502      -        ['e' + 1] = Letter | Hex | Exp,/* \e, e<exp> */
 503      -        ['f' + 1] = Letter | Hex,       /* \f */
 504      -        ['g' + 1 ... 'm' + 1] = Letter,
 505      -        ['n' + 1] = Letter,     /* \n */
 506      -        ['o' + 1] = Letter,
      504 +        ['a' + 1 ... 'd' + 1] = Letter | Hex,
      505 +        ['e' + 1] = Letter | Hex | Exp, /* e<exp> */
      506 +        ['f' + 1] = Letter | Hex,
      507 +        ['g' + 1 ... 'o' + 1] = Letter,
 507  508          ['p' + 1] = Letter | Exp,       /* p<exp> */
 508      -        ['q' + 1] = Letter,
 509      -        ['r' + 1] = Letter,     /* \r */
 510      -        ['s' + 1] = Letter,
 511      -        ['t' + 1] = Letter,     /* \t */
 512      -        ['u' + 1] = Letter,
 513      -        ['v' + 1] = Letter,     /* \v */
 514      -        ['w' + 1] = Letter,
 515      -        ['x' + 1] = Letter,     /* \x<hex> */
 516      -        ['y' + 1 ... 'z' + 1] = Letter,
      509 +        ['q' + 1 ... 'z' + 1] = Letter,
 517  510          ['_' + 1] = Letter,
 518  511          ['.' + 1] = Dot | ValidSecond,
 519  512          ['=' + 1] = ValidSecond,
 520  513          ['+' + 1] = ValidSecond,
 521  514          ['-' + 1] = ValidSecond,
 522  515          ['>' + 1] = ValidSecond,
 523  516          ['<' + 1] = ValidSecond,
 524  517          ['&' + 1] = ValidSecond,
 525  518          ['|' + 1] = ValidSecond,
 526  519          ['#' + 1] = ValidSecond,
↓ open down ↓ 10 lines elided ↑ open up ↑
 537  530   *      pp-number e sign
 538  531   *      pp-number E sign
 539  532   *      pp-number p sign
 540  533   *      pp-number P sign
 541  534   *      pp-number .
 542  535   */
 543  536  static int get_one_number(int c, int next, stream_t *stream)
 544  537  {
 545  538          struct token *token;
 546  539          static char buffer[4095];
 547      -        char *p = buffer, *buf, *buffer_end = buffer + sizeof (buffer);
 548      -        int len;
      540 +        char *p = buffer, *buffer_end = buffer + sizeof (buffer);
 549  541  
 550  542          *p++ = c;
 551  543          for (;;) {
 552  544                  long class =  cclass[next + 1];
 553  545                  if (!(class & (Dot | Digit | Letter)))
 554  546                          break;
 555  547                  if (p != buffer_end)
 556  548                          *p++ = next;
 557  549                  next = nextchar(stream);
 558  550                  if (class & Exp) {
↓ open down ↓ 7 lines elided ↑ open up ↑
 566  558  
 567  559          if (p == buffer_end) {
 568  560                  sparse_error(stream_pos(stream), "number token exceeds %td characters",
 569  561                        buffer_end - buffer);
 570  562                  // Pretend we saw just "1".
 571  563                  buffer[0] = '1';
 572  564                  p = buffer + 1;
 573  565          }
 574  566  
 575  567          *p++ = 0;
 576      -        len = p - buffer;
 577      -        buf = __alloc_bytes(len);
 578      -        memcpy(buf, buffer, len);
 579      -
 580  568          token = stream->token;
 581  569          token_type(token) = TOKEN_NUMBER;
 582      -        token->number = buf;
      570 +        token->number = xmemdup(buffer, p - buffer);
 583  571          add_token(stream);
 584  572  
 585  573          return next;
 586  574  }
 587  575  
 588  576  static int eat_string(int next, stream_t *stream, enum token_type type)
 589  577  {
 590  578          static char buffer[MAX_STRING];
 591  579          struct string *string;
 592  580          struct token *token = stream->token;
↓ open down ↓ 1 lines elided ↑ open up ↑
 594  582          int escape;
 595  583          int want_hex = 0;
 596  584          char delim = type < TOKEN_STRING ? '\'' : '"';
 597  585  
 598  586          for (escape = 0; escape || next != delim; next = nextchar(stream)) {
 599  587                  if (len < MAX_STRING)
 600  588                          buffer[len] = next;
 601  589                  len++;
 602  590                  if (next == '\n') {
 603  591                          warning(stream_pos(stream),
 604      -                                "Newline in string or character constant");
 605      -                        if (delim == '\'') /* assume it's lost ' */
 606      -                                break;
      592 +                                "missing terminating %c character", delim);
      593 +                        /* assume delimiter is lost */
      594 +                        break;
 607  595                  }
 608  596                  if (next == EOF) {
 609  597                          warning(stream_pos(stream),
 610  598                                  "End of file in middle of string");
 611  599                          return next;
 612  600                  }
 613  601                  if (!escape) {
 614  602                          if (want_hex && !(cclass[next + 1] & Hex))
 615  603                                  warning(stream_pos(stream),
 616  604                                          "\\x used with no following hex digits");
↓ open down ↓ 428 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX