Hi
Pardon, I should have sent it to the list.
Karl Dahlke schrieb am 05.04.2024, 4:29 -0400:
the latest edbrowse 3.8.9 on Debian, compiled with GCC 12.2. It segfaults on
startup, and the backtrace suggests it is in main.c:1926, where it nzFree's
[…]
[…]
An excerpt of the build output is below this e-mail; it includes the build
flags.
I am rather stunned by this. I have been using C since 1980. Ever since the
original K&R, global uninitialized variables are 0. I don't understand how
[…]
I am bored by C standards and alike. I have been writing MISRA C for several
years and I do remember the checkre requiring us to initialise explicitly
every static (i.e. global) as its initialisation was either depending on the
type or implementation defined, I do not recall.
Here is what nm says:
% nm src/edbrowse | grep 'sslCerts'
0000000000247088 D sslCerts
% nm src/edbrowse | fgrep allowJS
% nm src/edbrowse | fgrep allowJS
0000000000247079 D allowJS
but that's not simple because there are dozens of global variables, and some
static variables too, that are not initialized, that I count on being zero.
If we got past sslCerts we would just run into another one. We'd have to
[…]
Agreed. I actually just looked whether I can call up my.test.website and with
this set, it worked :). I actually was trying out the QuicJS support.
Cheers
Sebastian
=== Build Output
cc -g -O2 -ffile-prefix-map=/tmp/edbrowse=. -fstack-protector-strong -Wformat
-Werror=format-security -Wall -Wno-unused -D_FILE_OFFSET_BITS=64
-DEDBROWSE_ON_LINUX -I/usr/include/x86_64-linux-gnu -g -ggdb -Wextra
-Wdate-time -D_FORTIFY_SOURCE=2 -c -o dbodbc.o dbodbc.c
isup.c: In function ‘decodePostData’:
isup.c:1276:30: warning: ‘c’ may be used uninitialized [-Wmaybe-uninitialized]
1276 | *w++ = c;
| ~~~~~^~~
isup.c:1230:14: note: ‘c’ was declared here
1230 | char c;
| ^
css.c: In function ‘hashSortCrunch’:
css.c:3222:37: warning: ‘j’ may be used uninitialized [-Wmaybe-uninitialized]
3222 | mark->body[j++] = v->t;
| ~^~
css.c:3202:16: note: ‘j’ was declared here
3202 | int i, j, distinct = 0;
| ^
css.c: In function ‘do_rules’:
css.c:3106:9: warning: ‘tn’ may be used uninitialized [-Wmaybe-uninitialized]
3106 | set_property_bool_t(tn, "inj$css", true);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
css.c:2957:20: note: ‘tn’ was declared here
2957 | const Tag *tn; // the text node that holds before or after text
| ^~
dbops.c: In function ‘stringDate’:
dbops.c:505:17: warning: ‘__builtin_strncpy’ output may be truncated copying 4
bytes from a string of length 7 [-Wstringop-truncation]
505 | strncpy(buf, buf + 4, 4);
| ^
dbodbc.c: In function ‘retsFromOdbc’:
dbodbc.c:937:30: warning: ‘input_length’ may be used uninitialized
[-Wmaybe-uninitialized]
937 | rc = SQLGetData(hstmt, (ushort) (i + 1),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
938 | c_type, q1, input_length,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
939 | &output_length);
| ~~~~~~~~~~~~~~~
dbodbc.c:827:14: note: ‘input_length’ was declared here
827 | long input_length, output_length;
| ^~~~~~~~~~~~
dbodbc.c:937:30: warning: ‘c_type’ may be used uninitialized
[-Wmaybe-uninitialized]
937 | rc = SQLGetData(hstmt, (ushort) (i + 1),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
938 | c_type, q1, input_length,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
939 | &output_length);
| ~~~~~~~~~~~~~~~
dbodbc.c:826:15: note: ‘c_type’ was declared here
826 | short c_type; /* C data type */
| ^~~~~~
dbops.c: In function ‘stringTime’:
dbops.c:636:28: warning: ‘c’ may be used uninitialized [-Wmaybe-uninitialized]
636 | if (c == 'A')
| ^
dbops.c:593:14: note: ‘c’ was declared here
593 | char c;
| ^
css.c: In function ‘cssParseLeft’:
css.c:1336:52: warning: ‘sel2’ may be used uninitialized [-Wmaybe-uninitialized]
1336 | sel2->next = sel, sel2 = sel;
| ~~~~~~~~~~~^~~~~
css.c:1258:21: note: ‘sel2’ was declared here
1258 | struct sel *sel2;
| ^~~~
dbodbc.c: In function ‘oneRetValue.constprop’:
dbodbc.c:1114:19: warning: ‘f’ may be used uninitialized [-Wmaybe-uninitialized]
1114 | n = f;
| ~~^~~
dbodbc.c:1097:16: note: ‘f’ was declared here
1097 | double f;
| ^
dbodbc.c:1126:19: warning: ‘c’ may be used uninitialized [-Wmaybe-uninitialized]
1126 | n = c;
| ~~^~~
dbodbc.c:1095:14: note: ‘c’ was declared here
1095 | char c;
| ^
dbodbc.c:1133:16: warning: ‘n’ may be used uninitialized [-Wmaybe-uninitialized]
1133 | return n;
| ^
dbodbc.c:1096:14: note: ‘n’ was declared here
1096 | long n;
| ^
dbops.c: In function ‘lineFormatStack’:
dbops.c:191:40: warning: ‘dn’ may be used uninitialized [-Wmaybe-uninitialized]
191 | (pdir == 'f' && dn == nullfloat) ||
dbops.c:101:16: note: ‘dn’ was declared here
101 | double dn; /* double number */
| ^~
dbops.c:189:37: warning: ‘n’ may be used uninitialized [-Wmaybe-uninitialized]
189 | if ((pdir == 'c' && !n) ||
| ^~
dbops.c:100:14: note: ‘n’ was declared here
100 | long n;
| ^
css.c: In function ‘cssPieces’:
css.c:1008:42: warning: ‘d2’ may be used uninitialized [-Wmaybe-uninitialized]
1008 | d2->next = d, d2 = d;
| ~~~~~~~~~^~~
css.c:802:31: note: ‘d2’ was declared here
802 | struct desc *d1 = 0, *d2, *d = 0;
| ^~
In function ‘uncomment’,
inlined from ‘cssPieces’ at css.c:815:2:
css.c:176:56: warning: ‘url0’ may be used uninitialized [-Wmaybe-uninitialized]
176 | *w++ = *u;
| ^~
css.c: In function ‘cssPieces’:
css.c:147:23: note: ‘url0’ was declared here
147 | char *w = s, *url0;
| ^~~~
cc -I/usr/include/quickjs -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2
-ffile-prefix-map=/tmp/edbrowse=. -fstack-protector-strong -Wformat
-Werror=format-security -Wall -Wno-unused -D_FILE_OFFSET_BITS=64
-DEDBROWSE_ON_LINUX -I/usr/include/x86_64-linux-gnu -g -ggdb -Wextra -c
jseng-quick.c
In function ‘cursor_comm’,
inlined from ‘syncup_table’ at dbops.c:2051:2:
dbops.c:1945:31: warning: ‘sortval2’ may be used uninitialized
[-Wmaybe-uninitialized]
1943 | ((sorttype == 'S'
| ~~~~~~~~~~~~~~~~~
1944 | && strcmp(sortstring1, sortstring2) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1945 | || (sorttype != 'S' && sortval1 <
sortval2)))) {
|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dbops.c: In function ‘syncup_table’:
dbops.c:1835:23: note: ‘sortval2’ was declared here
1835 | int sortval1, sortval2;
| ^~~~~~~~
In function ‘cursor_comm’,
inlined from ‘syncup_table’ at dbops.c:2051:2:
dbops.c:1945:31: warning: ‘sortval1’ may be used uninitialized
[-Wmaybe-uninitialized]
1943 | ((sorttype == 'S'
| ~~~~~~~~~~~~~~~~~
1944 | && strcmp(sortstring1, sortstring2) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1945 | || (sorttype != 'S' && sortval1 <
sortval2)))) {
|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dbops.c: In function ‘syncup_table’:
dbops.c:1835:13: note: ‘sortval1’ was declared here
1835 | int sortval1, sortval2;
| ^~~~~~~~
css.c: In function ‘qsaMatch’:
css.c:2387:28: warning: ‘rc’ may be used uninitialized [-Wmaybe-uninitialized]
2387 | if (rc)
| ^
css.c:2100:14: note: ‘rc’ was declared here
2100 | bool rc;
| ^~
In file included from /usr/include/quickjs/quickjs-libc.h:30,
from jseng-quick.c:18:
/usr/include/quickjs/quickjs.h: In function ‘JS_NewCFunctionMagic’:
/usr/include/quickjs/quickjs.h:969:34: warning: cast between incompatible
function types from ‘JSValue (*)(JSContext *, JSValue, int, JSValue *, int)’
to ‘JSValue (*)(JSContext *, JSValue, int, JSValue *)’ [-Wcast-function-type]
969 | return JS_NewCFunction2(ctx, (JSCFunction *)func, name, length,
cproto, magic);
| ^
cc -g -O2 -ffile-prefix-map=/tmp/edbrowse=. -fstack-protector-strong -Wformat
-Werror=format-security -Wall -Wno-unused -D_FILE_OFFSET_BITS=64
-DEDBROWSE_ON_LINUX -I/usr/include/x86_64-linux-gnu -g -ggdb -Wextra
-Wdate-time -D_FORTIFY_SOURCE=2 -c -o ebrc.o ebrc.c
cc -g -O2 -ffile-prefix-map=/tmp/edbrowse=. -fstack-protector-strong -Wformat
-Werror=format-security -Wall -Wno-unused -D_FILE_OFFSET_BITS=64
-DEDBROWSE_ON_LINUX -I/usr/include/x86_64-linux-gnu -g -ggdb -Wextra
-Wdate-time -D_FORTIFY_SOURCE=2 -c -o msg-strings.o msg-strings.c
jseng-quick.c: In function ‘setup_window_2’:
jseng-quick.c:3787:9: warning: ignoring return value of ‘asprintf’ declared
with attribute ‘warn_unused_result’ [-Wunused-result]
3787 | asprintf(&wpc, "Wp`Set@%s", cf->fileName);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jseng-quick.c: In function ‘set_basehref’:
jseng-quick.c:4448:17: warning: ignoring return value of ‘asprintf’ declared
with attribute ‘warn_unused_result’ [-Wunused-result]
4448 | asprintf(&wpc, "Wp`Set@%s", h);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc -g -O2 -ffile-prefix-map=/tmp/edbrowse=. -fstack-protector-strong -Wformat
-Werror=format-security -Wall -Wno-unused -D_FILE_OFFSET_BITS=64
-DEDBROWSE_ON_LINUX -I/usr/include/x86_64-linux-gnu -g -ggdb -Wextra
-Wdate-time -D_FORTIFY_SOURCE=2 -c -o startwindow.o startwindow.c
jseng-quick.c: In function ‘embedNodeName’:
jseng-quick.c:2012:17: warning: ‘__builtin___strncpy_chk’ specified bound
depends on the length of the source argument [-Wstringop-truncation]
2012 | strncpy(b, nodeName, length);
| ^
jseng-quick.c:2009:26: note: length computed here
2009 | length = strlen(nodeName);
| ^~~~~~~~~~~~~~~~
cc main.o buffers.o sendmail.o fetchmail.o html.o html-tags.o format.o
stringfile.o ebrc.o msg-strings.o http.o isup.o css.o startwindow.o dbops.o
dbodbc.o jseng-quick.o /usr/lib/x86_64-linux-gnu/quickjs/libquickjs.a -ldl
-latomic -Wl,-z,relro -Wl,-z,now -lcurl -lodbc -lpcre2-8 -lreadline -lssl
-lcrypto -lpthread -lm -lssl -lcrypto -o edbrowse