)]}'
{
  "log": [
    {
      "commit": "323d4b6f6839b472ac02c31105727147660dc4db",
      "tree": "e5374de63274cd89e3bfcee3adfd4a0a3b89da00",
      "parents": [
        "ae189740de6b03f06a06214122183a3774f5cb62"
      ],
      "author": {
        "name": "Vadim Markovtsev",
        "email": "gmarkhor@gmail.com",
        "time": "Mon Jan 13 11:54:42 2014 +0400"
      },
      "committer": {
        "name": "Vadim Markovtsev",
        "email": "gmarkhor@gmail.com",
        "time": "Wed Jan 15 07:32:52 2014 +0000"
      },
      "message": "Add \"__noreturn\" to assert and assert2\n\nThese functions should print assertion violation messages and then\ncall abort(). They do really not return control flow afterwards.\nConsider the declaration of the similar __assert_fail from glibc:\n\nextern void __assert_fail (const char *__assertion,\n                           const char *__file,\n\t\t\t   unsigned int __line,\n                           const char *__function)\n     __THROW __attribute__ ((__noreturn__));\n\nBionic has __noreturn defined in sys/cdefs.h to be that GNU\nnoreturn attribute.\n\nThis patch has a practical value. Consider the following function:\n\nvoid check(void* ptr) {\n  assert(ptr !\u003d NULL);\n}\n\nWithout this patch applied, gcc (and presumably clang) shows even in\ndebug mode:\n\nwarning: unused parameter \u0027ptr\u0027 [-Wunused-parameter]\n\nIn release mode, NDEBUG is defined and assert() becomes a no-op, as\none should expect. Thus, the warning is shown correctly then.\n\nAnother code sample:\n\nfloat array[2];\nint i \u003d 3;\n...\nassert(i \u003c 2);\narray[i] \u003d 0;\n\ngcc says,\n\nwarning: array subscript is below array bounds [-Warray-bounds]\n\nIn other words, without noreturn attribute, assertions do not\nallow a compiler\u0027s static analyzer to properly understand\nthe preconditions.\n\nChange-Id: I3be92e99787c528899cf243ed448c4730c00c45b\nSigned-off-by: Vadim Markovtsev \u003cgmarkhor@gmail.com\u003e\n"
    },
    {
      "commit": "1dc9e472e19acfe6dc7f41e429236e7eef7ceda1",
      "tree": "3be0c520fae17689bbf5584e1136fb820caef26f",
      "parents": [
        "1767f908af327fa388b1c66883760ad851267013"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "1767f908af327fa388b1c66883760ad851267013",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "a799b53f10e5a6fd51fef4436cfb7ec99836a516"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349",
      "tree": "defd1cc07d16ad2f3b21154114e092d11c94c5bb",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
