{
  "filename": "write_all.c",
  "rule": "- name: partial-writes-advance-by-count\n  where: \"write_all.c\"\n  ensure: >-\n    After a successful write, offset must advance by the number of bytes actually written, not assume the full buffer was accepted.",
  "corrected": "#include <errno.h>\n#include <stddef.h>\n#include <unistd.h>\n\nint write_all(int fd, const char *data, size_t length) {\n    size_t offset = 0;\n    while (offset < length) {\n        ssize_t written = write(fd, data + offset, length - offset);\n        if (written < 0) {\n            if (errno == EINTR) continue;\n            return -1;\n        }\n        if (written == 0) { errno = EIO; return -1; }\n        offset += (size_t)written;\n    }\n    return 0;\n}\n",
  "broken": "#include <errno.h>\n#include <stddef.h>\n#include <unistd.h>\n\nint write_all(int fd, const char *data, size_t length) {\n    size_t offset = 0;\n    while (offset < length) {\n        ssize_t written = write(fd, data + offset, length - offset);\n        if (written < 0) {\n            if (errno == EINTR) continue;\n            return -1;\n        }\n        if (written == 0) { errno = EIO; return -1; }\n        offset = length;\n    }\n    return 0;\n}\n",
  "regression": [
    "        offset += (size_t)written;",
    "        offset = length;"
  ],
  "test_scenarios": [
    [
      "Full write",
      "Returns success"
    ],
    [
      "Several short writes",
      "All bytes eventually sent in order"
    ],
    [
      "EINTR before a write",
      "Retried"
    ],
    [
      "Zero write or fatal error",
      "Failure without an infinite loop"
    ]
  ],
  "test_source": null,
  "test_command": "cc -std=c11 -Wall -Wextra -Werror write_all.c tests/write_all_test.c -o write_all_test && ./write_all_test"
}