On (09/27/12 00:09), Magnus Fromreide wrote:
> That they fail to throw exceptions from new is no reason to disable
> set_new_handler, the newhandler is called by the runtime on out of memory
> and is intended to allow the user to try fixing the issue. This is true for
> the noexcept version as well. Is this yet another incompatibility?
>
right. the funny thing is, guess what, gcc actually has "#ifdef __EXCEPTIONS"
within operator new()
44 _GLIBCXX_WEAK_DEFINITION void *
45 operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
46 {
47 void *p;
48
49 /* malloc (0) is unpredictable; avoid it. */
50 if (sz == 0)
51 sz = 1;
52 p = (void *) malloc (sz);
53 while (p == 0)
54 {
55 new_handler handler = __new_handler;
56 if (! handler)
57 #ifdef __EXCEPTIONS
58 throw bad_alloc();
59 #else
60 std::abort();
61 #endif
62 handler ();
63 p = (void *) malloc (sz);
64 }
65
66 return p;
67 }
It tourned out, that __EXCEPTIONS with us (for operator new and STL) since 2001
"2001-02-15 Benjamin Kosnik <[email protected]>"
So, I guess this is how Google has came up with the idea of C++ w/o exceptions.
Wow.
-ss
> > +/* define stubs for C++ exception handling */
> > +#define try if (true)
> > +#define catch(x) if (false)
>
> If you should do this then I think it should be spelled
>
> #define try if (true)
> #define catch else if (false)
>
> in order to not break
>
> if (condition)
> try {
> } catch(type variable) {
> }
>
> but it still breaks the syntax for it which can be shown by simply adding an
> else clause to the if statement.
>
> Oh, and furthermore I consider that Android needs a C++ compiler.
>
> > +
> > +/* Define __NR_perf_event_open if not already defined */
> > +#if __arm__
> > +#ifndef __NR_perf_event_open
> > +#define __NR_perf_event_open 364
> > +#endif
> > +#endif
> > +
> > +/*
> > + * bionic libc mbstowcs version returns zero when max parameter
> > + * is zero, resulting infinite loops in powertop source. Add
> > + * mbstowcs wrapper to fix it.
> > + */
> > +namespace pandroid {
> > + extern "C" inline size_t mbstowcs(wchar_t *dst,
> > + const char *src, size_t len)
> > + {
> > + return ::mbstowcs(dst, src, ::strlen(src));
> > + }
> > +}
> > +
> > +#define mbstowcs(dst, src, len) pandroid::mbstowcs(dst, src,
> > len)
>
> Still broken.
> If dst isn't a NULL pointer then len is the limit on the length of the
> destination buffer. In throwing away this you open up for stack smashing
> attacks.
>
_______________________________________________
linaro-dev mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/linaro-dev