Home | History | Annotate | Download | only in ltrace.main
      1 # This file is part of ltrace.
      2 # Copyright (C) 2012, 2013 Petr Machata, Red Hat Inc.
      3 #
      4 # This program is free software; you can redistribute it and/or
      5 # modify it under the terms of the GNU General Public License as
      6 # published by the Free Software Foundation; either version 2 of the
      7 # License, or (at your option) any later version.
      8 #
      9 # This program is distributed in the hope that it will be useful, but
     10 # WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12 # General Public License for more details.
     13 #
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program; if not, write to the Free Software
     16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     17 # 02110-1301 USA
     18 
     19 set trivial [ltraceCompile {} [ltraceSource c {
     20     int main(void) {}
     21 }]]
     22 
     23 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     24     typedef aa = int;
     25     typedef aaa = int;
     26     typedef bbb = struct(aa);
     27 }] -- $trivial] "error" == 0
     28 
     29 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     30     typedef char_blah = char;
     31     void blah(char_blah);
     32 }] -- $trivial] "error" == 0
     33 
     34 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     35     typedef aa = int;
     36     typedef aa = int;
     37 }] -- $trivial] "error" != 0
     38 
     39 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     40     typedef aa = struct;
     41     typedef aa = int;
     42 }] -- $trivial] "error" != 0
     43 
     44 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     45     typedef aa = struct;
     46     typedef aa = struct(int);
     47     typedef aa = struct(int);
     48 }] -- $trivial] "error" != 0
     49 
     50 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     51     typedef aa = struct;
     52     typedef aa = struct();
     53     typedef aa = struct();
     54 }] -- $trivial] "error" != 0
     55 
     56 ltraceMatch1 [ltraceRun -L -F [ltraceSource conf {
     57     typedef aa = struct(int, struct;);
     58 }] -- $trivial] "error" != 0
     59 
     60 set libll [ltraceCompile libll.so [ltraceSource c {
     61     struct xxx;
     62     void ll(struct xxx *xxx) {}
     63 }]]
     64 
     65 set conf [ltraceSource conf {
     66     typedef xxx = struct;
     67     typedef xxx = struct(int, xxx*);
     68     void ll(xxx*);
     69 }]
     70 
     71 ltraceMatch [ltraceRun -F $conf -e ll [ltraceCompile {} $libll [ltraceSource c {
     72     struct xxx {
     73 	int i;
     74 	struct xxx *next;
     75     };
     76 
     77     void ll (struct xxx *xxx);
     78     int main (int argc, char *argv[])
     79     {
     80 	struct xxx a = { 1, 0 };
     81 	struct xxx b = { 2, &a };
     82 	struct xxx c = { 3, &b };
     83 	struct xxx d = { 4, &c };
     84 	ll (&d);
     85 
     86 	struct xxx e = { 1, 0 };
     87 	struct xxx f = { 2, &e };
     88 	e.next = &f;
     89 	ll (&f);
     90 
     91 	struct xxx g = { 1, &g };
     92 	ll (&g);
     93 
     94 	return 0;
     95     }
     96 }]]] {
     97     {{->ll\({ 4, { 3, { 2, { 1, nil } } } }\) *= <void>} == 1}
     98     {{->ll\({ 2, { 1, recurse\^ } }\) *= <void>} == 1}
     99     {{->ll\({ 1, recurse }\) *= <void>} == 1}
    100 }
    101 
    102 ltraceMatch1 [ltraceRun -F $conf -e ll -A 5 \
    103 -- [ltraceCompile ll $libll [ltraceSource c {
    104     #include <stdlib.h>
    105     struct ble {
    106 	int i;
    107 	struct ble *next;
    108     };
    109 
    110     void ll (struct ble *ble);
    111     int main (int argc, char *argv[])
    112     {
    113 	struct ble *b = NULL;
    114 	int i;
    115 	for (i = 0; i < 10; ++i) {
    116 	    struct ble *n = malloc(sizeof(*n));
    117 	    n->i = i;
    118 	    n->next = b;
    119 	    b = n;
    120 	}
    121 	ll (b);
    122 
    123 	return 0;
    124     }
    125 }]]] {->ll\({ 9, { 8, { 7, { 6, { 5, \.\.\. } } } } }\) *= <void>} == 1
    126 
    127 # Test using lens in typedef.
    128 
    129 ltraceMatch1 [ltraceLibTest {
    130     typedef hexptr = hex(uint*);
    131     void fun(hexptr);
    132 } {
    133     void fun(unsigned *arg);
    134 } {
    135     void fun(unsigned *arg) {}
    136 } {
    137     unsigned u = 0x123;
    138     fun(&u);
    139 }] {fun\(0x123\) *= <void>} == 1
    140 
    141 # Test support for bitvec lens.
    142 
    143 ltraceMatch [ltraceLibTest {
    144     void fun(bitvec(uint));
    145     void fun2(bitvec(array(char, 32)*));
    146 } {
    147     void fun(unsigned i);
    148     void fun2(unsigned char *arr);
    149 } {
    150     void fun(unsigned i) {}
    151     void fun2(unsigned char *arr) {}
    152 } {
    153     fun(0);
    154     fun(0x123);
    155     fun(0xfffffffe);
    156     fun(0xffffffff);
    157 
    158     unsigned char bytes[32] = {0x00};
    159     bytes[1] = 0xff;
    160     bytes[31] = 0x80;
    161     fun2(bytes);
    162 }] {
    163     {{fun\(<>\) *= <void>} == 1}
    164     {{fun\(<0-1,5,8>\) *= <void>} == 1}
    165     {{fun\(~<0>\) *= <void>} == 1}
    166     {{fun\(~<>\) *= <void>} == 1}
    167     {{fun2\(<8-15,255>\) *= <void>} == 1}
    168 }
    169 
    170 # Test support for hex(float), hex(double).
    171 
    172 ltraceMatch [ltraceLibTest {
    173     hex(float) hex_float(hex(float));
    174     hex(double) hex_double(hex(double));
    175 } {
    176     float hex_float(float f);
    177     double hex_double(double d);
    178 } {
    179     float hex_float(float f) { return f + 1; }
    180     double hex_double(double d) { return d + 1; }
    181 } {
    182     hex_float(1.5);
    183     hex_double(1.5);
    184 }] {
    185     {{hex_float\(0x1.8p\+0\) *= 0x1.4p\+1} == 1}
    186     {{hex_double\(0x1.8p\+0\) *= 0x1.4p\+1} == 1}
    187 }
    188 
    189 # Test that "addr" is recognized.
    190 
    191 ltraceMatch1 [ltraceLibTest {
    192     void fun(addr);
    193 } {
    194     #include <stdint.h>
    195     void fun(uintptr_t u);
    196 } {
    197     void fun(uintptr_t u) {}
    198 } {
    199     fun(0x1234);
    200 }] {fun\(0x1234\) *= <void>} == 1
    201 
    202 # Test that -x fun can find "fun" prototype even if "fun" is in a
    203 # library.
    204 
    205 ltraceMatch1 [ltraceLibTest {
    206     void fun();
    207 } {
    208     void libfun(void);
    209 } {
    210     void fun(void) {}
    211     void libfun(void) { fun(); }
    212 } {
    213     libfun();
    214 } {
    215     -L -x fun
    216 }] {fun@.*\(\)} == 1
    217 
    218 
    219 # Test that %p format specifier does not crash
    220 
    221 ltraceMatch1 [ltraceLibTest {
    222     void print_ptr(format);
    223 } {
    224     void print_ptr(const char *format, ...);
    225 } {
    226     void print_ptr(const char *format, ...) { }
    227 } {
    228     void *addr = (void *)0x42;
    229     print_ptr("%p\n", addr);
    230 }] {print_ptr\("%p\\n", 0x42\) *= <void>} == 1
    231 
    232 
    233 # Test that zero(EXPR) does not leak memory (needs valgrind)
    234 
    235 ltraceMatch1 [ltraceLibTest {
    236     typedef String = string(array(char, zero(256)));
    237     String *get_string();
    238 } {
    239     char *get_string();
    240 } {
    241     char *get_string() {
    242         return "FOO";
    243     }
    244 } {
    245     get_string();
    246 }] {get_string\(\) *= "FOO"} == 1
    247 
    248 # Test that void* NULL's are displayed as "nil" as well.
    249 
    250 ltraceMatch1 [ltraceLibTest {
    251     addr somefunc();
    252 } {
    253     void *somefunc(void);
    254 } {
    255     void *somefunc(void) {
    256         return 0;
    257     }
    258 } {
    259     somefunc();
    260 }] {somefunc\(\) *= nil} == 1
    261 
    262 ltraceDone
    263