Gtest-nomalloc.c revision 576b59e4b15ddf2f2d3f17036b9c2f43c7504777
1576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma/* libunwind - a platform-independent unwind library
2576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma   Copyright (C) 2009 Google, Inc
3576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma	Contributed by Arun Sharma <arun.sharma@google.com>
4576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
5576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaPermission is hereby granted, free of charge, to any person obtaining
6576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaa copy of this software and associated documentation files (the
7576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma"Software"), to deal in the Software without restriction, including
8576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmawithout limitation the rights to use, copy, modify, merge, publish,
9576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmadistribute, sublicense, and/or sell copies of the Software, and to
10576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmapermit persons to whom the Software is furnished to do so, subject to
11576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmathe following conditions:
12576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
13576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaThe above copyright notice and this permission notice shall be
14576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaincluded in all copies or substantial portions of the Software.
15576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
16576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun SharmaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
23576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
24576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#ifdef HAVE_CONFIG_H
25576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma# include "config.h"
26576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#endif
27576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
28576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#include <unistd.h>
29576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#include <stdio.h>
30576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#include <stdlib.h>
31576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#include <dlfcn.h>
32576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#include <libunwind.h>
33576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
34576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma#define panic(args...)				\
35576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma	{ fprintf (stderr, args); exit (-1); }
36576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
37576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaint verbose;
38576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaint num_errors;
39576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaint in_unwind;
40576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
41576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmavoid *
42576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmamalloc(size_t s)
43576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
44576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  static void * (*func)();
45576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
46576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  if(!func)
47576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
48576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
49576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  if (in_unwind) {
50576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    num_errors++;
51576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    return NULL;
52576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  } else {
53576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    return func(s);
54576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  }
55576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
56576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
57576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmastatic void
58576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmado_backtrace (void)
59576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
60576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  unw_word_t ip, sp;
61576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  unw_cursor_t cursor;
62576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  unw_context_t uc;
63576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  int ret;
64576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
65576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  in_unwind = 1;
66576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  unw_getcontext (&uc);
67576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  if (unw_init_local (&cursor, &uc) < 0)
68576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    panic ("unw_init_local failed!\n");
69576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
70576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  do
71576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    {
72576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      unw_get_reg (&cursor, UNW_REG_IP, &ip);
73576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      unw_get_reg (&cursor, UNW_REG_SP, &sp);
74576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
75576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      ret = unw_step (&cursor);
76576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      if (ret < 0)
77576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma	{
78576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma	  ++num_errors;
79576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma	}
80576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    }
81576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  while (ret > 0);
82576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  in_unwind = 0;
83576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
84576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
85576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmavoid
86576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmafoo3 ()
87576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
88576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  do_backtrace ();
89576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
90576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
91576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmavoid
92576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmafoo2 ()
93576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
94576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  foo3 ();
95576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
96576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
97576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmavoid
98576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmafoo1 ()
99576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
100576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  foo2 ();
101576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
102576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
103576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmaint
104576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharmamain (int argc, char **argv)
105576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma{
106576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  foo1();
107576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma
108576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  if (num_errors > 0)
109576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    {
110576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
111576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma      exit (-1);
112576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma    }
113576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma  return 0;
114576b59e4b15ddf2f2d3f17036b9c2f43c7504777Arun Sharma}
115