TODO.md section 2.1 recorded six defects reproduced against the built
library, and section 2.2 seventeen contract gaps. Both are closed. The
four tests registered in AKSL_KNOWN_FAILING_TESTS are folded back into
the tests for the things they test, and that list is now empty.
The defects:
2.1.1 aksl_list_append conflated Floyd cycle detection with finding
the tail, so `tail` tracked the node behind the midpoint. Any
append to a list of 2+ nodes silently dropped everything after
it. Two separate walks now: Floyd to prove the list is finite,
then a plain walk to the end.
2.1.2 aksl_list_iterate started visiting from Floyd's `slow` cursor,
so the whole first half of the list -- head included -- was
never passed to the callback. It starts at the head.
2.1.3 AKERR_ITERATOR_BREAK did not stop a tree traversal: the frame
that raised it handled it and returned success, so the parent
carried on into the sibling subtree. The recursion is split out
and propagates the break; only the public entry swallows it.
2.1.4 va_end now matches every va_start on every path.
2.1.5 The ato* family had no error channel at all. Reimplemented over
a new strto* family with errno cleared, an endptr check and a
range check: AKERR_VALUE for junk, ERANGE for overflow.
2.1.6 aksl_realpath never checked resolved_path, could not be told
the buffer size, and formatted an unspecified buffer with %s on
its own error path. It takes a length; aksl_realpath_alloc is
the allocating form.
The contract gaps, in brief: errno is cleared before every wrapped call
and read back through a fallback so no error can carry status 0; fopen
validates pathname and mode; fread/fwrite report the transferred count
through a required out-param and no longer call a short transfer a
success; aksl_sprintf is gone in favour of aksl_snprintf, which treats
truncation as an error; the variadic wrappers carry format attributes;
djb2 reads bytes as unsigned; tree traversal is depth- and cycle-bounded
and implements BFS, so lalloc/lfree are used rather than merely stored;
an unknown searchmode is AKERR_VALUE rather than silent success;
list_pop takes the head by reference; aksl_freep, the node initialisers
and extern "C" are new.
Build: -pg is out of the default build (it never reached the C compiler
anyway, and it is what produced the stray gmon.out), -Wall -Wextra are
in, and there is a .gitignore.
Tests: 11 binaries, all green under the normal and sanitizer builds.
Visit-order assertions replace the step counts that could not tell the
three depth-first orders apart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
28 lines
729 B
Plaintext
28 lines
729 B
Plaintext
# Build trees. The names are conventional rather than enforced -- AGENTS.md uses
|
|
# build/, build-asan/ and build-coverage/ -- so anything build* is ignored.
|
|
build*/
|
|
|
|
# Profiling output. -pg is no longer in the default build (see CMakeLists.txt),
|
|
# but a deliberate profiling run still drops these wherever it was started.
|
|
gmon.out
|
|
*.gcda
|
|
*.gcno
|
|
*.gcov
|
|
|
|
# Test and report artifacts written into the source root by CI-style invocations.
|
|
ctest-junit.xml
|
|
mutation-junit.xml
|
|
coverage-summary.txt
|
|
coverage.xml
|
|
|
|
# Emacs. The backup files and the lock symlinks both; a dangling .#file symlink
|
|
# pointing at user@host:pid is not something anyone wants in a diff.
|
|
*~
|
|
\#*\#
|
|
.\#*
|
|
|
|
# Editor and OS noise
|
|
*.swp
|
|
.DS_Store
|
|
compile_commands.json
|