Menu

Commit [r13014]  Maximize  Restore  History

Fix the real bugs behind the remaining compiler warnings

These are the ones set aside earlier as "the interesting shortlist" - every
warning here was pointing at code that does not do what it was written to do.
A full clean build stays at exit 0 and drops from 754 to 721 warnings.

Memory:

- compilers/4glc/parsehelp.c: malloc(sizeof(expr_str)) followed by memcpy of
sizeof(l->list.list_val[a]) - the size of the *pointer*. It copied 8 bytes
and left the rest of the new expr_str uninitialised.
- lib/libaubit4gl/sql_common.c: A4GL_free_prepare() called
blank_any_cursors_using(sid) after free(sid). That function only compares the
pointer, so it now runs before the free - otherwise any cursor still holding
the sid keeps a dangling statement pointer.
- lib/libsql/odbc/sqlex.c: A4GL_debug("-%p", ptr) after free(ptr). Reading the
pointer value after the free is undefined even just to print it; logs first.
- lib/liblogical/processor/process_report.c: fclose() on a stream from popen().
Now pclose(), so the child is reaped and its status collected. The fwrite in
the copy loop was also inside an assert(), so a build with NDEBUG would have
dropped the copy entirely - it is now a separate statement.
- compilers/4glc/compile.c: two sprintf calls passing incl_path as both the
destination and the first argument. Overlapping source and destination is
undefined; they now format the suffix into a temporary and strcat it.

Logic that never ran, or always ran:

- compilers/4glc/lint.c: "whencode & 0x15 == WHEN_CALL" - 0x15 masks off bit 1
and WHEN_CALL is 2, so the WHENEVER ERROR CALL branch could never be taken and
lint never checked the named function existed. The action is the low nibble
(php.c uses & 0xf for the action, >> 4 for the condition), so it is now 0xf.
- compilers/4glc/lint.c: system_function_dtype() fell off the end without
returning. Callers test for -2, and the two other copies of this function
(calltree.c, prototypes.c) both end with return -2 - this one now does too.
- compilers/fcompile/dump_scr.c: get_attr_from_field() fell off the end when it
found nothing, returning whatever was in the register. Returns 0, which is
what its own "not applicable" path returns and what callers test for.
- lib/libaubit4gl/function_call_stack.c: "moduleName == '\0'" compared the
pointer against NULL, but its unset value is "" - so the no-module branch
never fired. Tests the string now.
- lib/libui/ui_xml/uilib/uilib.c and ui_json/uilib/uilib.c: "rval < 0" where
rval is the size_t returned by iconv(), which reports failure as (size_t)-1.
Conversion errors were silently ignored in both copies.
- compilers/4glc/variables_new.c: "if (idtype!=idtype)" - a self comparison, so
dead. What it meant is not recoverable; removed with a note.
- 16 -Waddress cases across sqlexpr.c, report.c, stack.c, mod.c, json.c, xml.c
and two generic_ui.c copies: tests on the address of a struct's char array,
which is never NULL. Each had a real test beside it (strlen, [0], or a
function call), so the redundant half is gone and the meaning is unchanged.

Format strings:

- compilers/4glc/prototypes.c: three fprintf calls passing arguments to format
strings with no conversions at all.
- tools/asql/parse.l: "%d" given strlen() and sizeof() results, ie size_t.

Left alone deliberately: compile_c.c's "arr_subscripts_len >= 0" was always true
on an unsigned member, but changing it to "> 0" would alter what happens for an
empty subscript list, so only the dead half was dropped.

mikeaubury 2026-08-27

changed /aubit4glsrc/trunk/compilers/4glc/compile.c
changed /aubit4glsrc/trunk/compilers/4glc/lint.c
changed /aubit4glsrc/trunk/compilers/4glc/mod.c
changed /aubit4glsrc/trunk/compilers/4glc/parsehelp.c
changed /aubit4glsrc/trunk/compilers/4glc/prototypes.c
changed /aubit4glsrc/trunk/compilers/4glc/variables_new.c
changed /aubit4glsrc/trunk/compilers/fcompile/dump_scr.c
changed /aubit4glsrc/trunk/lib/libaubit4gl/function_call_stack.c
changed /aubit4glsrc/trunk/lib/libaubit4gl/report.c
changed /aubit4glsrc/trunk/lib/libaubit4gl/sql_common.c
changed /aubit4glsrc/trunk/lib/libaubit4gl/sqlexpr.c
changed /aubit4glsrc/trunk/lib/libaubit4gl/stack.c
changed /aubit4glsrc/trunk/lib/liblex/lex_esqlc/compile_c.c
changed /aubit4glsrc/trunk/lib/liblogical/processor/process_report.c
changed /aubit4glsrc/trunk/lib/libsql/odbc/sqlex.c
changed /aubit4glsrc/trunk/lib/libui/ui_curses/generic_ui.c
changed /aubit4glsrc/trunk/lib/libui/ui_highlevel/generic_ui.c
changed /aubit4glsrc/trunk/lib/libui/ui_json/json.c
changed /aubit4glsrc/trunk/lib/libui/ui_json/uilib/uilib.c
changed /aubit4glsrc/trunk/lib/libui/ui_xml/uilib/uilib.c
changed /aubit4glsrc/trunk/lib/libui/ui_xml/xml.c
changed /aubit4glsrc/trunk/tools/asql/parse.l
/aubit4glsrc/trunk/compilers/4glc/compile.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/4glc/lint.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/4glc/mod.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/4glc/parsehelp.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/4glc/prototypes.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/4glc/variables_new.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/compilers/fcompile/dump_scr.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libaubit4gl/function_call_stack.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libaubit4gl/report.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libaubit4gl/sql_common.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libaubit4gl/sqlexpr.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libaubit4gl/stack.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/liblex/lex_esqlc/compile_c.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/liblogical/processor/process_report.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libsql/odbc/sqlex.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_curses/generic_ui.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_highlevel/generic_ui.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_json/json.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_json/uilib/uilib.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_xml/uilib/uilib.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/lib/libui/ui_xml/xml.c Diff Switch to side-by-side view
Loading...
/aubit4glsrc/trunk/tools/asql/parse.l Diff Switch to side-by-side view
Loading...