)]}'
{
  "log": [
    {
      "commit": "4ae773633aac9ceba5ec62bb8e1aa22c3c56ebde",
      "tree": "08855d690e35a16d9c1cbe68148da64f54f5ebd1",
      "parents": [
        "3875744f89600027c69ea68650fff1eeb4b29723"
      ],
      "author": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Fri Apr 17 18:16:57 2015 -0400"
      },
      "committer": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Fri Apr 17 21:17:12 2015 -0400"
      },
      "message": "add fortified memchr/memrchr implementations\n\nChange-Id: I38c473cc0c608b08f971409a95eb8b853cb2ba1c\n"
    },
    {
      "commit": "3cfb52aab2548df635e9672218cc433e14922fd3",
      "tree": "eebbf162a1e5e1ed8726a9129ea17a410ebaa3ed",
      "parents": [
        "3e1b5f46c07aef5983ecf2feb1c3369b2cd200c0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 18 21:29:13 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 18 22:02:56 2015 -0800"
      },
      "message": "Add GNU extensions mempcpy and wmemcpy.\n\nUsed by elfutils. On the bright side, they stopped using __mempcpy.\n\nBug: 18374026\nChange-Id: Id29bbe6ef1c5ed5a171bb6c32182f129d8332abb\n"
    },
    {
      "commit": "5038b19cef207b526f9993951e4a04c8df91ce1d",
      "tree": "0b28230d8ca0b0cd311a0d2a590f04b6f17e4da2",
      "parents": [
        "cd1959b0c506cfa9e89ac7deb56bdb6461b28c3a"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 21:02:34 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jan 29 20:12:13 2015 -0800"
      },
      "message": "Break two incorrect transitive includes.\n\nChange-Id: I95519caa5258cf5c6b8053f1c7e08ade2a824e49\n"
    },
    {
      "commit": "76f8916b904db14facf811ae44e1265261349702",
      "tree": "cf49d5313eb0e5a05463dbe519de48d4fddf84a9",
      "parents": [
        "419ed122aa21cf04334f21baab135ac4f9f49840"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 26 13:34:58 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 26 14:28:41 2015 -0800"
      },
      "message": "Clean up \u003cstdlib.h\u003e slightly.\n\nInterestingly, this mostly involves cleaning up our implementation of\nvarious \u003cstring.h\u003e functions.\n\nChange-Id: Ifaef49b5cb997134f7bc0cc31bdac844bdb9e089\n"
    },
    {
      "commit": "b20c24456e43df430ec5626a68e5dc0dc6929344",
      "tree": "c9b85b4d913f8f2738bdc8772b9b9a21d6ab51dc",
      "parents": [
        "08a70184b42ef2963794a56233b0253e0b367253"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 06 15:04:08 2014 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 06 15:52:22 2014 -0800"
      },
      "message": "Implement all the POSIX _l functions.\n\nStrictly speaking, this only implements the _l variants of the functions\nwe actually have. We\u0027re still missing nl_langinfo_l, for example, but we\ndon\u0027t have nl_langinfo either.\n\nChange-Id: Ie711c7b04e7b9100932a13f5a5d5b28847eb4c12\n"
    },
    {
      "commit": "658727e111ed6dee7be5239494f0764f7b1b02f8",
      "tree": "253051956500d39d0a9e8d282aacebe78dc21def",
      "parents": [
        "eeb9aa02b7f307a1d9b80731dd69ef9dd2f47e47"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Oct 07 11:10:36 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Oct 07 16:46:47 2014 -0700"
      },
      "message": "Inline helpers need to be exported unmangled.\n\n__open_2() is used by the fortify implementation of open(2) in\nfcntl.h, and as such needs an unmangled C name. For some reason\n(inlining?), this doesn\u0027t cause problems at the default optimization\nlevel, but does for -O0.\n\nThe rest of these didn\u0027t cause build failures, but they look suspect\nand probably will, we just haven\u0027t caught them yet.\n\nBug: 17784968\nChange-Id: I7391a7a8999ee204eaf6abd14a3d5373ea419d5b\n"
    },
    {
      "commit": "b84f667e9312611536a564700daea11c12b6fcfa",
      "tree": "f28e9b9edd7b0d27a233febe1e301523e6112cee",
      "parents": [
        "ae97a776ea900e5923d6d320d72dcc04b224796e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sun Oct 05 06:52:24 2014 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sun Oct 05 06:52:24 2014 -0700"
      },
      "message": "further cleanup memcpy fortify implementation\n\nChange-Id: I0380f3c8ca8f9bb8a206accd839c32c9daf13c56\n"
    },
    {
      "commit": "48be71d02b6cc4e6493d38cdd6b7779032c38901",
      "tree": "5c562cf12fcb46b262782fc0893d26c13366dafa",
      "parents": [
        "4ef0e59f339ad138eabe3bc408beda6004f5ea83"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Oct 04 15:20:00 2014 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Oct 04 15:20:00 2014 -0700"
      },
      "message": "string.h: remove unused variable\n\nChange-Id: I08b7dab1b374ad427fcbee4183f2c7d93d0199a9\n"
    },
    {
      "commit": "416d7ddaff0946d480b6aa945a741b3eeaca5569",
      "tree": "d3fa6382f7d6d26ab7e3ecb95a715328e5f50b5e",
      "parents": [
        "f4e721dd519db89c504c8944763811a3df956b32"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 17:28:32 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 28 16:37:09 2014 -0700"
      },
      "message": "Add GNU-compatible strerror_r.\n\nWe already had the POSIX strerror_r, but some third-party code defines\n_GNU_SOURCE and expects to get the GNU strerror_r instead.\n\nThis exposed a bug in the libc internal logging functions where unlike\ntheir standard brethren they wouldn\u0027t return the number of bytes they\u0027d\nhave liked to have written.\n\nBug: 16243479\nChange-Id: I1745752ccbdc569646d34f5071f6df2be066d5f4\n"
    },
    {
      "commit": "09c39d6df0e952620f8c1751377b559a04e023aa",
      "tree": "1ca25e04d3ed7ebea1dde6f4d3baaeee9526c0e5",
      "parents": [
        "c5d6df6f2fe57fd5aadbd9ebb131023234c30a0c"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Aug 19 14:30:30 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Aug 19 14:30:30 2014 -0700"
      },
      "message": "Implement the GNU basename(3) in addition to the POSIX one.\n\nCode like perf(1) needs this.\n\nBug: 11860789\nChange-Id: I907eb448052a7b165e4012d74303330d32328cb2\n"
    },
    {
      "commit": "2cfb4e8e2e217ef0e4140dcbf9b3da809781158c",
      "tree": "19a83c3a73ba3c613de106fd1b6ae8e83f75d3d4",
      "parents": [
        "2b6cdb5e459661727c99e81660c7c3df5cdbe024"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 14:45:42 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 14:45:42 2014 -0700"
      },
      "message": "Improve \u003csys/cdefs.h\u003e.\n\nFix and use __RENAME (and lose ___RENAME --- two underscores should be\nenough for anybody). This was the point of this change, because I want\nto use __RENAME to support the two basename variants and the two\nstrerror_r variants.\n\nLose a bunch of macros that weren\u0027t being used.\n\nLose three dead files from the DNS code.\n\nChange-Id: I3ef645c566b16a52217bc2e68c7d54b37c7c9522\n"
    },
    {
      "commit": "28285f85a1c15c5b500b78ed63f12dd8eddb8ac9",
      "tree": "c0001d2d3ca85b5b8069ea568d6ea02a55188ffe",
      "parents": [
        "8b91980e4c139558f9cca4e9a0980dad07c06e68"
      ],
      "author": {
        "name": "Dehao Chen",
        "email": "dehao@google.com",
        "time": "Tue Aug 05 15:23:00 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 06 11:43:38 2014 -0700"
      },
      "message": "Workaround b/16818336 which fails build under aggressive inlining.\n\n(cherry-pick of 7aa27e1c1a53afe28f6180fd1fc50d096cabea7b.)\n\nChange-Id: Ifcd596714c427a2ec39502b9c0af9082ded91884\n"
    },
    {
      "commit": "dfb5ce42bcc5a275af49211c0bbe64c5ec3d2668",
      "tree": "4ff3d2f96f0c5e00edac99cd86119f2ecc5cfa73",
      "parents": [
        "76df69d1f5cbbc8a2c1e899bc1ad5ada8b083e1e"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:51:34 2014 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Jul 11 16:21:31 2014 +0000"
      },
      "message": "Revert \"Revert \"Add locale aware APIs.\"\"\n\nThis reverts commit 063e20c26943ec82ef1d53a544545e79054e93d3.\n\nChange-Id: Ib8c9004efefe75a5346b3af50dfe37952d91eb21\n"
    },
    {
      "commit": "063e20c26943ec82ef1d53a544545e79054e93d3",
      "tree": "486076b9e0dd6439cea5f0108ecf6154df6e4aab",
      "parents": [
        "e087eac404b0e30de427392065e2750acf92bd4a"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:50:43 2014 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:50:43 2014 +0000"
      },
      "message": "Revert \"Add locale aware APIs.\"\n\nAccidentally verified against a dirty tree. Needs the companion change to libc++ to land upstream before I can submit this.\n\nThis reverts commit e087eac404b0e30de427392065e2750acf92bd4a.\n\nChange-Id: I317ecd0923114f415eaad7603002f77feffb5e3f\n"
    },
    {
      "commit": "e087eac404b0e30de427392065e2750acf92bd4a",
      "tree": "c547e35ffc82ee9afd441d2e3739a87de73103fd",
      "parents": [
        "6cdd0cfd2f279dfb20b9f7cccc963eb9ee91c666"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 10:09:04 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 15:41:53 2014 -0700"
      },
      "message": "Add locale aware APIs.\n\nSince we only support the C locale, we can just forward all of these to\ntheir non-locale equivalents for correct behavior.\n\nChange-Id: Ib7be71b7f636309c0cc3be1096a4c1f693f04fbb\n"
    },
    {
      "commit": "40fca0f08b1eb87e283d6f634d9759ed3161f517",
      "tree": "22a02418b0c225b4e994d8625970c3affe900eda",
      "parents": [
        "431aa4dc9282e23231ba9243f43fd3d49b5f88b3"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jun 04 08:53:33 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jun 05 11:05:10 2014 -0700"
      },
      "message": "Removes index() from bionic.\n\nThis function has been removed from POSIX.\n\nUnfortunately, we can\u0027t leave #define index(a, b) strchr((a), (b)) in its place\nbecause defining a preprocessor macro for index() breaks a whole lot of code.\n\nBug: 13935372\nChange-Id: Ifda348acde06da61c12e7ee2f8fe6950a3174dd1\n"
    },
    {
      "commit": "950a58e24d1019eb9d814dbb16f111a6b61e3f23",
      "tree": "5a91099e0ce1b9d552e7210fb914ba8d4d5ddb10",
      "parents": [
        "5f149f1bdef31d198c0e84fd8c904204d263e825"
      ],
      "author": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Fri Apr 04 14:38:18 2014 -0700"
      },
      "committer": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Mon Apr 07 16:41:53 2014 -0700"
      },
      "message": "Add stpcpy/stpncpy.\n\nAdd tests for the above.\n\nAdd the fortify implementations of __stpcpy_chk and __stpncpy_chk.\n\nModify the strncpy test to cover more cases and use this template for\nstpncpy.\n\nAdd all of the fortify test cases.\n\nBug: 13746695\nChange-Id: I8c0f0d4991a878b8e8734fff12c8b73b07fdd344\n"
    },
    {
      "commit": "152b9de19ade833ada124390ef153e53d3d3e2ed",
      "tree": "96e0f98537c7420007bbb3452dcbe5d57bbf5fe3",
      "parents": [
        "638e7892c63c9d6968c0cf2e98ace89b9c5b2f26"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Mar 10 15:54:40 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Mar 10 15:54:40 2014 -0700"
      },
      "message": "Remove non-standard memswap.\n\nChange-Id: I06548dda339987b755ef7139c590ca3e1f9fe0a9\n"
    },
    {
      "commit": "53e43292aac91bf62995788cd5ca2ceb7caea283",
      "tree": "003679a1e2288bad947f714ee45bfa6febf479b6",
      "parents": [
        "ba40a560176e6ea753d09a6a71343b81ea4c8c1e"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 24 18:00:43 2014 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 24 18:02:05 2014 -0800"
      },
      "message": "More OpenBSD cleanup (primarily string).\n\nThis patch removes the string/ and wchar/ directories.\n\nChange-Id: Ia489904bc67047e4bc79acb1f3eec21aa3fe5f0d\n"
    },
    {
      "commit": "d13c2b1ba6681fdbee73a044d988c3f9e1172d30",
      "tree": "009f871a52478fef08570ac9365b5be3af08c397",
      "parents": [
        "8427b7450fe068db6484d161f7004661c4698858"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Sep 27 13:21:24 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Sep 27 13:21:24 2013 -0700"
      },
      "message": "Fix unnecessary call to __strncpy_chk2\n\nIf \"n\" is smaller than the size of \"src\", then we\u0027ll\nnever read off the end of src. It makes no sense to call\n__strncpy_chk2 in those circumstances.\n\nFor example, consider the following code:\n\nint main() {\n  char src[10];\n  char dst[5];\n  memcpy(src, \"0123456789\", sizeof(src));\n  strncpy(dst, src, sizeof(dst));\n  dst[4] \u003d \u0027\\0\u0027;\n  printf(\"%s\\n\", dst);\n  return 0;\n}\n\nIn this code, it\u0027s clear that the strncpy will never read off\nthe end of src.\n\nChange-Id: I9cf58857a0c5216b4576d21d3c1625e2913ccc03\n"
    },
    {
      "commit": "3c4b50fd8cce143d9ba8f03a93f0fccba4e54d14",
      "tree": "f1db656c0c18b55cdbb471f413c05701a4e055b8",
      "parents": [
        "99b859cf786f208300f7fc3a6fa5b570c3333433"
      ],
      "author": {
        "name": "Pavel Chupin",
        "email": "pavel.v.chupin@intel.com",
        "time": "Fri Jul 26 16:50:11 2013 +0400"
      },
      "committer": {
        "name": "Pavel Chupin",
        "email": "pavel.v.chupin@intel.com",
        "time": "Tue Sep 03 16:20:52 2013 +0400"
      },
      "message": "Fix strchr for basic non-sse case on x86\n\nFix source location. Move declaration of __strchr_chk out of\nifdef __BIONIC_FORTIFY which should be available for strchr.cpp\ncompilation when __BIONIC_FORTIFY is not defined.\n\nChange-Id: I552a6e16656e59b276b322886cfbf57bbfb2e6a7\nSigned-off-by: Pavel Chupin \u003cpavel.v.chupin@intel.com\u003e\n"
    },
    {
      "commit": "bd8e6749b78567af62ec126d7cc057386ebee25a",
      "tree": "949ca8147c4675afb9f0af51e404f535dbd38a93",
      "parents": [
        "eb8f36223e51db626a23b8032f03c095be80998b"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 13:22:52 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 14:27:14 2013 -0700"
      },
      "message": "cdefs.h: introduce __bos0\n\nIntroduce __bos0 as a #define for __builtin_object_size((s), 0).\nThis macro is intended to be used for places where the standard\n__bos macro isn\u0027t appropriate.\n\nmemcpy, memmove, and memset deliberately use __bos0. This is done\nfor two reasons:\n\n1) I haven\u0027t yet tested to see if __bos is safe to use.\n2) glibc uses __bos0 for these methods.\n\nChange-Id: Ifbe02efdb10a72fe3529dbcc47ff647bde6feeca\n"
    },
    {
      "commit": "93501d3ab81156bcef251bb817a49e9ca46a6ec1",
      "tree": "38deed513bd1e1ec2cc316a4bd5de6689ee991da",
      "parents": [
        "2557433d8ea4c489f061170822f34f038b930b96"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 10:47:43 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 12:39:06 2013 -0700"
      },
      "message": "FORTIFY_SOURCE: introduce __strncpy_chk2\n\nThis change detects programs reading beyond the end of \"src\" when\ncalling strncpy.\n\nChange-Id: Ie1b42de923385d62552b22c27b2d4713ab77ee03\n"
    },
    {
      "commit": "a6cde392765eb955cb4be5faa6ee62dcf77e8aa5",
      "tree": "c1553a2002af8470615afecb1a2fff9c29c2f916",
      "parents": [
        "227b47a461b27d746b373feb66001cdddc9ba1db"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jun 29 08:15:25 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jun 29 08:16:22 2013 -0700"
      },
      "message": "More FORTIFY_SOURCE functions under clang\n\n* bzero\n* umask\n* strlcat\n\nChange-Id: I65065208e0b8b37e10f6a266d5305de8fa9e59fc\n"
    },
    {
      "commit": "8bafa7452ec0892572b0b49f86022ce945c5e908",
      "tree": "92c021e3852b1f8b5cee464c5ff5500c84eb0f80",
      "parents": [
        "4eed65090b1f0d0d087f26bd7367da90a0cca92d"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 20 12:17:44 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 20 12:17:44 2013 -0700"
      },
      "message": "libc: enable FORTIFY_SOURCE clang strlcpy\n\nChange-Id: Idcfe08f5afc3dde592416df9eba83f64e130c7c2\n"
    },
    {
      "commit": "16d1af167f8e36a9aa4a07ae77034ad519b00463",
      "tree": "61abe872a5f2ebebc4fe15205a77158bc8372ec2",
      "parents": [
        "b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Jun 17 14:49:19 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 12:14:20 2013 -0700"
      },
      "message": "libc: add limited FORTIFY_SOURCE support for clang\n\nIn 829c089f83ddee37203b52bcb294867a9ae7bdbc, we disabled all\nFORTIFY_SOURCE support when compiling under clang. At the time,\nwe didn\u0027t have proper test cases, and couldn\u0027t easily create targeted\nclang tests.\n\nThis change re-enables FORTIFY_SOURCE support under clang for a\nlimited set of functions, where we have explicit unittests available.\nThe functions are:\n\n* memcpy\n* memmove\n* strcpy\n* strncpy\n* strcat\n* strncat\n* memset\n* strlen (with modifications)\n* strchr (with modifications)\n* strrchr (with modifications)\n\nIt may be possible, in the future, to enable other functions. However,\nI need to write unittests first.\n\nFor strlen, strchr, and strrchr, clang unconditionally calls the\nfortified version of the relevant function. If it doesn\u0027t know the\nsize of the buffer it\u0027s dealing with, it passes in ((size_t) -1),\nwhich is the largest possible size_t.\n\nI added two new clang specific unittest files, primarily copied\nfrom fortify?_test.cpp.\n\nI\u0027ve also rebuild the entire system with these changes, and didn\u0027t\nobserve any obvious problems.\n\nChange-Id: If12a15089bb0ffe93824b485290d05b14355fcaa\n"
    },
    {
      "commit": "b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5",
      "tree": "918218d294c845db4b5fda6f9fb9a211a443bb54",
      "parents": [
        "977a33137d2be0093f474055f839cf665b82b588"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 10:46:02 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 12:13:52 2013 -0700"
      },
      "message": "libc: Introduce __errordecl()\n\nDefine __errordecl and replace __attribute__((__error__(\"foo\")))\nwith __errordecl. Make sure __errordecl is a no-op on clang, as it\ngenerates a compile time warning.\n\nChange-Id: Ifa1a2d3afd6881de9d479fc2adac6737871a2949\n"
    },
    {
      "commit": "cf870199d576bdfc339b7fb016c9f6fe7f2c87ed",
      "tree": "e4bdb361862de3efd9b907379d0fe3f2ad3f4ae2",
      "parents": [
        "72f59c84fd73a0a701ce6448d103e9021c1cb060"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu May 30 16:48:53 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri May 31 09:07:46 2013 -0700"
      },
      "message": "FORTIFY_SOURCE: strcat / strncat optimize\n\n__strcat_chk and __strncat_chk are slightly inefficient,\nbecause they end up traversing over the same memory region\ntwo times.\n\nThis change optimizes __strcat_chk / __strncat_chk so they\nonly access the memory once. Although I haven\u0027t benchmarked these\nchanges, it should improve the performance of these functions.\n\n__strlen_chk - expose this function, even if -D_FORTIFY_SOURCE\nisn\u0027t defined. This is needed to compile libc itself without\n-D_FORTIFY_SOURCE.\n\nChange-Id: Id2c70dff55a276b47c59db27a03734d659f84b74\n"
    },
    {
      "commit": "1c462b7a04fc6afc99d8544728dd6d8f2a471fa2",
      "tree": "ac011571325064bb82f77b4e44c7cdfbe6611585",
      "parents": [
        "b01f7afd5fd5df5f8fe925b4fe493269191b62a2"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue May 07 10:00:21 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue May 07 10:00:21 2013 -0700"
      },
      "message": "Use restrict pointers for various libc functions.\n\nAll the cool kids say this is the best thing since sliced bread.\nhttp://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html\n\nFor the most part, these changes match what glibc does.\n\nChange-Id: I176268f27f82800162fe5f2515b08d5469ea2dfe\n"
    },
    {
      "commit": "3b2e6bc9acf5223db6e9967e46066219c76ee56f",
      "tree": "2f88c2c3c967fda99f5f17c5bbaa417a52206364",
      "parents": [
        "c46871302e7bd099aaf54d91da93a2248acbf733"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 14:19:23 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 14:19:23 2013 -0700"
      },
      "message": "libc: upgrade strrchr to FORTIFY_SOURCE\u003d2\n\nChange-Id: I4c34c2ce22c5092c4446dc1ab55f37604c1c223f\n"
    },
    {
      "commit": "9020fd503c9eb073f70dbc239a212f8ece19359d",
      "tree": "bd7f3027f2ccaede0e78d9e789ac3579c46eff00",
      "parents": [
        "b94b2851d72187cc9095864a9c99429ee62d7786"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 11:31:35 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 11:31:35 2013 -0700"
      },
      "message": "libc: upgrade some libc functions to _FORTIFY_SOURCE\u003d2\n\nUpgrade the following functions:\n\n* vsnprintf\n* vsprintf\n* snprintf\n* fgets\n* strcpy\n* strcat\n* strncat\n* strlcpy\n* strlcat\n* strlen\n* strchr\n\nChange-Id: Icc036fc7f0bb317e05f7c051617887a1601271aa\n"
    },
    {
      "commit": "1aae9bd170883805f2e7975cd3dbd2502b083cc1",
      "tree": "de73c01b4e8b61a11b54e8c4ecc8de222c4b0872",
      "parents": [
        "c6dc62f09c814b9688aee83e80dcfe80cb0ef604"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Apr 29 14:07:06 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Apr 29 15:22:10 2013 -0700"
      },
      "message": "strncpy: implement _FORTIFY_SOURCE\u003d2\n\nAdd support for fortify source level 2 to strncpy.\nThis will enable detection of more areas where strncpy\nis used inappropriately. For example, this would have detected\nbug 8727221.\n\nMove the fortify_source tests out of string_test.cpp, and\nput it into fortify1_test.cpp.\n\nCreate a new fortify2_test.cpp file, which copies all\nthe tests in fortify1_test.cpp, and adds fortify_source level\n2 specific tests.\n\nChange-Id: Ica0fba531cc7d0609e4f23b8176739b13f7f7a83\n"
    },
    {
      "commit": "890c8ed6ef773160cd6840a92e0d469fe530871f",
      "tree": "6689569955f500ea13697ea928386dd9c64d1af3",
      "parents": [
        "34895c1bdfa5df48ee9a7b4368b6def403f24cf1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 22 10:58:55 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 22 10:58:55 2013 -0700"
      },
      "message": "Fix builds where _FORTIFY_SOURCE is off.\n\nAlso add a more intention-revealing guard so we don\u0027t have loads of\nplaces checking whether our inlining macro is defined.\n\nChange-Id: I168860cedcfc798b07a5145bc48a125700265e47\n"
    },
    {
      "commit": "538f6fc202b07219ce78de54c0e05ab81e937154",
      "tree": "a8ed6260b45d305d695f99c7aa1b96e1617caaee",
      "parents": [
        "a0259b42eba08e6d71a274fa3f770afccbb93107"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 21 17:39:06 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 21 17:39:06 2013 -0800"
      },
      "message": "Stop advertising rindex(3), which is both deprecated and unimplemented.\n\nChange-Id: I3c775d9974e49c3f76a53e46e022659657b89034\n"
    },
    {
      "commit": "a44e9afdd16105d6f36319cb538666d9cc78435a",
      "tree": "8606530bcdef438dc305894c805f0713edad5306",
      "parents": [
        "f3fe19459fd9263e8cc8a413a5313b1ec3cf3975"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jan 17 15:41:33 2013 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jan 17 15:41:33 2013 -0800"
      },
      "message": "FORTIFY_SOURCE: optimize\n\nDon\u0027t do the fortify_source checks if we can determine, at\ncompile time, that the provided operation is safe.\n\nThis avoids silliness like calling fortify source on things like:\n\n  size_t len \u003d strlen(\"asdf\");\n  printf(\"%d\\n\", len);\n\nand allows the compiler to optimize this code to:\n\n  printf(\"%d\\n\", 4);\n\nDefer to gcc\u0027s builtin functions instead of pointing our code\nto the libc implementation.\n\nChange-Id: I5e1dcb61946461c4afaaaa983e39f07c7a0df0ae\n"
    },
    {
      "commit": "57874753900865312d7d265d2ca15cb4edb00ef2",
      "tree": "344ba9328ef618db3dec557b592ec5f1f64e272e",
      "parents": [
        "5dfdb701292c53e74e319f277d808e598389c8e7"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Dec 07 09:57:01 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Dec 07 09:57:01 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: remove memcpy overlap checks\n\nThese checks haven\u0027t been as useful as I hoped, and it\u0027s\ncausing a false positive finding.  Remove the overlap\ncompile time checks.\n\nChange-Id: I5d45dde10ae4663d728230d41fa904adf20acaea\n"
    },
    {
      "commit": "9a4d305340e6ce2fc6c3f371f2d7ede446f8c6d4",
      "tree": "e6c29deaf1b6789aa94bb1074db1b9b554033267",
      "parents": [
        "60fb68338b7541b6022fc343857b90c088c399cd"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 03 10:36:13 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 03 10:39:16 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: fortify strrchr\n\nThis change compliments 049e58369c37fdeacd0380a6bf1e078d9baf819f\n\nChange-Id: I27d015d70a520713c7472558a3c427f546d36ee4\n"
    },
    {
      "commit": "049e58369c37fdeacd0380a6bf1e078d9baf819f",
      "tree": "039599b75477a0759c69af2295e3dd20f293caff",
      "parents": [
        "16c61f088524756ef0fa1b030719f6745eaef2db"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Nov 30 15:15:58 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Nov 30 15:19:15 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: fortify strchr\n\nDetect when strchr reads off the end of a buffer.\n\nChange-Id: I0e952eedcff5c36d646a9c3bc4e1337b959224f2\n"
    },
    {
      "commit": "829c089f83ddee37203b52bcb294867a9ae7bdbc",
      "tree": "95fb7297694601b1ff65ba0296cfff3a5ee66fd6",
      "parents": [
        "069c64cdf2d3da7b7ff6ea5d1041f982fb10ab22"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 29 12:40:53 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 29 12:47:41 2012 -0700"
      },
      "message": "disable _FORTIFY_SOURCE under clang\n\nClang and _FORTIFY_SOURCE are just plain incompatible with\neach other.  First of all, clang doesn\u0027t understand the\n__attribute__((gnu_inline)) header. Second of all,\nClang doesn\u0027t have support for __builtin_va_arg_pack()\nand __builtin_va_arg_pack_len() (see\nhttp://clang.llvm.org/docs/UsersManual.html#c_unimpl_gcc)\n\nUntil we can resolve these issues, don\u0027t even try using\n_FORTIFY_SOURCE under clang.\n\nChange-Id: I81c2b8073bb3276fa9a4a6b93c427b641038356a\n"
    },
    {
      "commit": "d600617645e85435cf98fc30139a6945aaadc1ca",
      "tree": "0fc63ef4c40101a78a58f3f94463d5fbab7d2458",
      "parents": [
        "9a3d53fad062cdadb4df81f6998a5e09336c637b"
      ],
      "author": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 10:57:37 2012 -0700"
      },
      "committer": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 10:57:37 2012 -0700"
      },
      "message": "When compiling with clang, don\u0027t \"fortify_source\" the strlcpy and\nstrlcat.\n\nChange-Id: I91f58322f28e425ab9d22b51c23fcd6b772ede97\n"
    },
    {
      "commit": "9a3d53fad062cdadb4df81f6998a5e09336c637b",
      "tree": "4692a1999871977640b81adb826da2efb649dc4e",
      "parents": [
        "1c861728e5c8dda7589e6595f4850d77ec21a236"
      ],
      "author": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 09:50:56 2012 -0700"
      },
      "committer": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 09:50:56 2012 -0700"
      },
      "message": "When compiling with clang, don\u0027t \"fortify_source\" the strlen.\n\nAt this point, FORTIFY_SOURCE and clang are just plain incompatible.\nNeed to solve the underlying incompatibility first.\n\nChange-Id: I3366477d19461e1ec93b1c30e0c7e8145b391b9b\n"
    },
    {
      "commit": "c37fc1ab6a3ac3956a8c9ba3ac089d41969815ed",
      "tree": "8fd21828b1fc97423bbe5e3652513772260604f3",
      "parents": [
        "e1d909f71e183ac3d1e21af5bb1af35d30e9de5b"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 17:49:10 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 17:58:37 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: revert memcpy changes.\n\nPerformance regressions.  Hopefully this is a temporary\nrollback.\n\nBug: 6821003\nChange-Id: I84abbb89e1739d506b583f2f1668f31534127764\n"
    },
    {
      "commit": "9b6cc223a36835c4367a036d4cfeff14d25bc742",
      "tree": "8fcd143b253225860fbd817cdad02afac00f1be8",
      "parents": [
        "260bf8cfe00f83bc579dfe81c78b75bd9973f051"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 14:46:36 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 14:49:33 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: introduce __BIONIC_FORTIFY_UNKNOWN_SIZE macro\n\nReplace all occurances of \"(size_t) -1\" with a\n__BIONIC_FORTIFY_UNKNOWN_SIZE macro.\n\nChange-Id: I0b188f6cf31417d2dbef0e1bd759de3f9782873a\n"
    },
    {
      "commit": "260bf8cfe00f83bc579dfe81c78b75bd9973f051",
      "tree": "b8ff686500d30625cb9d5908ecba4895f20a1467",
      "parents": [
        "b2060b027c9eb2748895b53a0d69d40b52371a4e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 11:27:06 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 13:49:59 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: strlen check.\n\nThis test is designed to detect code such as:\n\nint main() {\n  char buf[10];\n  memcpy(buf, \"1234567890\", sizeof(buf));\n  size_t len \u003d strlen(buf); // segfault here with _FORTIFY_SOURCE\n  printf(\"%d\\n\", len);\n  return 0;\n}\n\nor anytime strlen reads beyond an object boundary. This should\nhelp address memory leakage vulnerabilities and make other\nunrelated vulnerabilities harder to exploit.\n\nChange-Id: I354b425be7bef4713c85f6bab0e9738445e00182\n"
    },
    {
      "commit": "f3913b5b68347ce9a4cb17977df2c33f1e8f6000",
      "tree": "fae959e2f8c146b61eb43af80d9ae4918640d2c0",
      "parents": [
        "86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jul 12 15:10:03 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jul 12 15:38:15 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: enhanced memcpy protections.\n\nTwo changes:\n\n1) Detect memory read overruns.\n\nFor example:\n\nint main() {\n  char buf[10];\n  memcpy(buf, \"abcde\", sizeof(buf));\n  sprintf(\"%s\\n\", buf);\n}\n\nbecause \"abcde\" is only 6 bytes, copying 10 bytes from it is a bug.\nThis particular bug will be detected at compile time.  Other similar\nbugs may be detected at runtime.\n\n2) Detect overlapping buffers on memcpy()\n\nIt is a bug to call memcpy() on buffers which overlap. For\nexample, the following code is buggy:\n\n  char buf3[0x800];\n  char *first_half  \u003d \u0026buf3[0x400];\n  char *second_half \u003d \u0026buf3[1];\n  memset(buf3, 0, sizeof(buf3));\n  memcpy(first_half, second_half, 0x400);\n  printf(\"1: %s\\n\", buf3);\n\nWe now detect this at compile and run time.\n\nChange-Id: I092bd89f11f18e08e8a9dda0ca903aaea8e06d91\n"
    },
    {
      "commit": "cb228fb4a91bdccfd974b8a4f45e2b6002e90728",
      "tree": "bef755285588a49afc5344e0bedcab6de517b84e",
      "parents": [
        "b52e4385c403d18a68309e568ac729c787d900c4"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 26 16:05:19 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 26 16:05:19 2012 -0700"
      },
      "message": "libc: cleanups\n\nPrefix private functions with underscores, to prevent name\nconflicts.\n\nUse __error__ instead of error, since occasionally programs will\ncreate their own \"#define error ...\".\n\nChange-Id: I7bb171df58aec5627e61896032a140db547fd95d\n"
    },
    {
      "commit": "8df49ad2467ec2d48f94a925162185c34bf6e68b",
      "tree": "00161cd65c6292eebd000699534b554b2c52be0a",
      "parents": [
        "4442d512c66aa32a26fe2e652e55ad05249ea3da"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Jun 13 16:57:27 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 14 12:52:42 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: add strlcpy / strlcat support\n\nAdd strlcpy / strlcat support to FORTIFY_SOURCE. This allows\nus to do consistency checks on to ensure we don\u0027t overflow buffers\nwhen the compiler is able to tell us the size of the buffer we\u0027re\ndealing with.\n\nUnlike previous changes, this change DOES NOT use the compiler\u0027s\nbuiltin support. Instead, we do everything the compiler would\nnormally do.\n\nChange-Id: I47c099a911382452eafd711f8e9bfe7c2d0a0d22\n"
    },
    {
      "commit": "71a18dd435e96564539b5af71b8ea5093a2109a1",
      "tree": "fd59c2a7cc23b663d090b0b8843a5d19c97df7d0",
      "parents": [
        "7d11009a970732ea18f8a0599d63c94eab9ec3f0"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 07 14:01:26 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 07 14:19:52 2012 -0700"
      },
      "message": "_FORTIFY_SOURCE: add memset / bzero support\n\nAdd _FORTIFY_SOURCE support for the following functions:\n\n* memset\n* bzero\n\nMove the __BIONIC_FORTIFY_INLINE definition to cdefs.h so it\ncan be used from multiple header files.\n\nChange-Id: Iead4d5e35de6ec97786d58ee12573f9b11135bb7\n"
    },
    {
      "commit": "0a2301598c207fd1b50015984942fee5e8511593",
      "tree": "161496d8ec411c14f7f82990e82e970c7e328a2a",
      "parents": [
        "31431f454a9d3d3dde46de0e3c39cc409a39c436"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Jun 04 15:20:25 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 05 15:44:31 2012 -0700"
      },
      "message": "libc: implement some FORTIFY_SOURCE functions\n\nAdd initial support for -D_FORTIFY_SOURCE to bionic for the\nfollowing functions:\n\n* memcpy\n* memmove\n* strcpy\n* strcat\n* strncpy\n* strncat\n\nThis change adds a new version of the above functions which passes\nthe size of the destination buffer to __builtin___*_chk.\n\nIf the compiler can determine, at compile time, that the destination\nbuffer is large enough, or the destination buffer can point to an object\nof unknown size, then the check call is bypassed.\n\nIf the compiler can\u0027t make a compile time decision, then it calls\nthe __*_chk() function, which does a runtime buffer size check\n\nThese options are only enabled if the code is compiled with\n-D_FORTIFY_SOURCE\u003d1 or 2, and only when optimizations are enabled.\n\nPlease see\n* http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html\n* http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html\n\nfor additional details on FORTIFY_SOURCE.\n\nTesting: Compiled the entire Android tree with -D_FORTIFY_SOURCE\u003d1,\nand verified that everything appears to be working properly.\nAlso created a test buffer overflow, and verified that it was\ncaught by this change.\n\nChange-Id: I4fddb445bafe92b16845b22458d72e6dedd24fbc\n"
    },
    {
      "commit": "a677907ee8ecca034318fdb97902fa73e7392c4f",
      "tree": "e937fcefb5cc8719a7a388cfdb45c9425443ae20",
      "parents": [
        "aac0dc97a9ad91231fa89878e745548d693366c1"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Mar 21 08:48:18 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Mar 21 08:54:54 2012 -0700"
      },
      "message": "string.h: add __attribute__ ((pure)) to string functions\n\ncdefs.h: Introduce the __purefunc attribute, which allows us to mark\ncertain functions as being \"pure\".\n\nhttp://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html\n\n  Many functions have no effects except the return value and their\n  return value depends only on the parameters and/or global variables.\n  Such a function can be subject to common subexpression elimination\n  and loop optimization just as an arithmetic operator would be.\n\nstring.h: Mark many commently used string functions as \"pure\", to\nallow for additional compiler optimizations.\n\nChange-Id: I42961f90f822b6dbcbc3fd72cdbe774a7adc8785\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": "9f65adf2ba3bb15feb8b7a7b3eef788df3fd270e",
      "tree": "c06064fc9022ef63a40f83a91292103784f49780",
      "parents": [
        "d37527501c85edcb3a6a7c8a0b6297d52d434897"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@130745\n"
    },
    {
      "commit": "6d6c82c7a0a6b9a89f61b61c66f9b90d9c7177dc",
      "tree": "8de86895228b63728c3a134c8b1fcab003db467d",
      "parents": [
        "4e468ed2eb86a2406e14f1eca82072ee501d05fd"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\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"
    }
  ]
}
