Blame tests/leb128.c

Packit Service 97d2fb
/* Test program for leb128
Packit Service 97d2fb
   Copyright (C) 2020 Tom Tromey
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of the GNU General Public License as published by
Packit Service 97d2fb
   the Free Software Foundation; either version 3 of the License, or
Packit Service 97d2fb
   (at your option) any later version.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 97d2fb
   GNU General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received a copy of the GNU General Public License
Packit Service 97d2fb
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#include <config.h>
Packit Service 97d2fb
#include <stddef.h>
Packit Service 97d2fb
#include <stdbool.h>
Packit Service 97d2fb
#include <stdint.h>
Packit Service 97d2fb
#include <libdw.h>
Packit Service 97d2fb
#include "../libdw/libdwP.h"
Packit Service 97d2fb
#include "../libdw/memory-access.h"
Packit Service 97d2fb
Packit Service 97d2fb
#define OK 0
Packit Service 97d2fb
#define FAIL 1
Packit Service 97d2fb
Packit Service 97d2fb
static const unsigned char v0[] = { 0x0 };
Packit Service 97d2fb
static const unsigned char v1[] = { 0x1 };
Packit Service 97d2fb
static const unsigned char v23[] = { 23 };
Packit Service 97d2fb
static const unsigned char vm_1[] = { 0x7f };
Packit Service 97d2fb
static const unsigned char vm_2[] = { 0x7e };
Packit Service 97d2fb
static const unsigned char s127[] = { 0xff, 0x00 };
Packit Service 97d2fb
static const unsigned char v128[] = { 0x80, 0x01 };
Packit Service 97d2fb
static const unsigned char v129[] = { 0x81, 0x01 };
Packit Service 97d2fb
static const unsigned char vm_127[] = { 0x81, 0x7f };
Packit Service 97d2fb
static const unsigned char vm_128[] = { 0x80, 0x7f };
Packit Service 97d2fb
static const unsigned char vm_129[] = { 0xff, 0x7e };
Packit Service 97d2fb
static const unsigned char vhuge[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0xff, 0x0
Packit Service 97d2fb
  };
Packit Service 97d2fb
static const unsigned char most_positive[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0x3f
Packit Service 97d2fb
  };
Packit Service 97d2fb
static const unsigned char most_negative[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0x80, 0x80, 0x80, 0x80, 0x80,
Packit Service 97d2fb
    0x80, 0x80, 0x80, 0x40
Packit Service 97d2fb
  };
Packit Service 97d2fb
static const unsigned char minus_one[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0x7f
Packit Service 97d2fb
  };
Packit Service 97d2fb
static const unsigned char int64_max_m1[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0xfe, 0xff, 0xff, 0xff, 0xff,
Packit Service 97d2fb
    0xff, 0xff, 0xff, 0xff, 0x00
Packit Service 97d2fb
  };
Packit Service 97d2fb
static const unsigned char int64_min_p1[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    0x81, 0x80, 0x80, 0x80, 0x80,
Packit Service 97d2fb
    0x80, 0x80, 0x80, 0x80, 0x7f
Packit Service 97d2fb
  };
Packit Service 97d2fb
Packit Service 97d2fb
static int
Packit Service 97d2fb
test_one_sleb (const unsigned char *data, size_t len, int64_t expect)
Packit Service 97d2fb
{
Packit Service 97d2fb
  int64_t value;
Packit Service 97d2fb
  const unsigned char *p;
Packit Service 97d2fb
Packit Service 97d2fb
  p = data;
Packit Service 97d2fb
  get_sleb128 (value, p, p + len);
Packit Service 97d2fb
  if (value != expect || p != data + len)
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  p = data;
Packit Service 97d2fb
  get_sleb128_unchecked (value, p);
Packit Service 97d2fb
  if (value != expect || p != data + len)
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  return OK;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static int
Packit Service 97d2fb
test_sleb (void)
Packit Service 97d2fb
{
Packit Service 97d2fb
#define TEST(ARRAY, V)				      \
Packit Service 97d2fb
  if (test_one_sleb (ARRAY, sizeof (ARRAY), V) != OK) \
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  TEST (v0, 0);
Packit Service 97d2fb
  TEST (v1, 1);
Packit Service 97d2fb
  TEST (v23, 23);
Packit Service 97d2fb
  TEST (vm_1, -1);
Packit Service 97d2fb
  TEST (vm_2, -2);
Packit Service 97d2fb
  TEST (s127, 127);
Packit Service 97d2fb
  TEST (v128, 128);
Packit Service 97d2fb
  TEST (v129, 129);
Packit Service 97d2fb
  TEST (vm_127, -127);
Packit Service 97d2fb
  TEST (vm_128, -128);
Packit Service 97d2fb
  TEST (vm_129, -129);
Packit Service 97d2fb
  TEST (vhuge, 9223372036854775807ll);
Packit Service 97d2fb
  TEST (most_positive, 4611686018427387903ll);
Packit Service 97d2fb
  TEST (most_negative, -4611686018427387904ll);
Packit Service 97d2fb
  TEST (minus_one, -1);
Packit Service 97d2fb
  TEST (int64_max_m1, INT64_MAX - 1);
Packit Service 97d2fb
  TEST (int64_min_p1, INT64_MIN + 1);
Packit Service 97d2fb
Packit Service 97d2fb
#undef TEST
Packit Service 97d2fb
Packit Service 97d2fb
  return OK;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static int
Packit Service 97d2fb
test_one_uleb (const unsigned char *data, size_t len, uint64_t expect)
Packit Service 97d2fb
{
Packit Service 97d2fb
  uint64_t value;
Packit Service 97d2fb
  const unsigned char *p;
Packit Service 97d2fb
Packit Service 97d2fb
  p = data;
Packit Service 97d2fb
  get_uleb128 (value, p, p + len);
Packit Service 97d2fb
  if (value != expect || p != data + len)
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  p = data;
Packit Service 97d2fb
  get_uleb128_unchecked (value, p);
Packit Service 97d2fb
  if (value != expect || p != data + len)
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  return OK;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static int
Packit Service 97d2fb
test_uleb (void)
Packit Service 97d2fb
{
Packit Service 97d2fb
#define TEST(ARRAY, V)				      \
Packit Service 97d2fb
  if (test_one_uleb (ARRAY, sizeof (ARRAY), V) != OK) \
Packit Service 97d2fb
    return FAIL;
Packit Service 97d2fb
Packit Service 97d2fb
  TEST (v0, 0);
Packit Service 97d2fb
  TEST (v1, 1);
Packit Service 97d2fb
  TEST (v23, 23);
Packit Service 97d2fb
  TEST (vm_1, 127);
Packit Service 97d2fb
  TEST (vm_2, 126);
Packit Service 97d2fb
  TEST (s127, 127);
Packit Service 97d2fb
  TEST (v128, 128);
Packit Service 97d2fb
  TEST (v129, 129);
Packit Service 97d2fb
  TEST (vm_127, 16257);
Packit Service 97d2fb
  TEST (vm_128, 16256);
Packit Service 97d2fb
  TEST (vm_129, 16255);
Packit Service 97d2fb
  TEST (vhuge, 9223372036854775807ull);
Packit Service 97d2fb
  TEST (most_positive, 4611686018427387903ull);
Packit Service 97d2fb
  TEST (most_negative, 4611686018427387904ull);
Packit Service 97d2fb
  TEST (minus_one, 9223372036854775807ull);
Packit Service 97d2fb
  TEST (int64_max_m1, INT64_MAX - 1);
Packit Service 97d2fb
  TEST (int64_min_p1, INT64_MIN + 1);
Packit Service 97d2fb
Packit Service 97d2fb
#undef TEST
Packit Service 97d2fb
Packit Service 97d2fb
  return OK;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
int
Packit Service 97d2fb
main (void)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return test_sleb () || test_uleb ();
Packit Service 97d2fb
}