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