parse_mrsets used loop local variables which were not initialized.
The regression worked with low compiler optimization levels because
the value for "delimiter" was kept over the loop iterations.
get_text_token did not set the delimiter value when only delimiters
are left in the string. I set the delimiter value to the last value
in the string in that case. I initialized the variables to see the
bug also in -O0.
Closes: https://savannah.gnu.org/bugs/?58943
text = open_text_record (r, record, false);
for (;;)
{
- struct sfm_mrset *mrset;
- size_t allocated_vars;
- char delimiter;
+ struct sfm_mrset *mrset = NULL;
+ size_t allocated_vars = 0;
+ char delimiter = '4';
/* Skip extra line feeds if present. */
while (text_match (text, '\n'))
char *end;
if (!ss_tokenize (text->buffer, delimiters, &text->pos, &token))
- return NULL;
+ {
+ if (delimiter != NULL)
+ *delimiter = ss_data (text->buffer)[text->pos-1];
+ return NULL;
+ }
end = &ss_data (token)[ss_length (token)];
if (delimiter != NULL)
ss_get_bytes (&ss, ss_cspan (ss, delimiters), token);
found_token = ss_length (*token) > 0;
- *save_idx += ss_length (*token) + found_token;
+ *save_idx += ss_length (*token) + (found_token?1:0);
return found_token;
}
size_t
ss_find_byte (struct substring ss, char c)
{
- const char *p = memchr (ss.string, c, ss.length);
+ const char *p = memchr (ss.string, (int) c, ss.length);
return p != NULL ? p - ss.string : SIZE_MAX;
}