LWN.net Logo

multiple returns in C

multiple returns in C

Posted Jan 28, 2010 3:46 UTC (Thu) by thedevil (subscriber, #32913)
In reply to: LCA: Static analysis with GCC plugins by jwakely
Parent article: LCA: Static analysis with GCC plugins

Actually there's a better way to do this even in C:

static int foobar_return_handler(void* some_pointer, int destruct, int result)
{
  if (some_pointer)
    free(some_pointer);
  if (destruct)
    do_destruct();
  return result;
}

int foobar()
{
  void* some_pointer = malloc(sizeof(some_type));
  if (!some_pointer)
    return foobar_return_handler(0, 1, -1);
  int foo_result = foo(some_pointer);
  if (foo_result < 0)
    return foobar_return_handler(some_pointer, 1, foo_result);
  int bar_result = bar(some_pointer, foo_result);
  if (bar_result < 0)
    return foobar_return_handler(some_pointer, 1, bar_result);
  return foobar_return_handler(some_pointer, 0, bar_result);
}


(Log in to post comments)

multiple returns in C

Posted Jan 28, 2010 10:04 UTC (Thu) by dgm (subscriber, #49227) [Link]

Another idiom I often use is separating resource allocation from actual computation:
int foobar1 (some_type * some_pointer)
{
  int result = foo (some_pointer);
  if (result < 0)
    result = bar (some_pointer, result);
  return result;
}

int foobar()
{
  int result = -1;
  void * some_pointer = malloc (sizeof (some_type));
  if (some_pointer) {
    result = foobar1 (some_pointer);
    free (some_pointer);
  }
  return result;
}

Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds