How do I reproduce this? I tried:

dpkg-buildflags --export=sh > export.out
source export.out
make clean && make

But edbrowse doesn't crash for me.

This is on a new Debian 12.5 machine.

On 4/5/2024 3:43 AM, Sebastian Humenda wrote:
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

Reply via email to