Author: Stan Eisenstat
Subject: Common bugs
Date: Thursday, 27 Feb 2020, 14:04:51
1. strwrs times out on Test #12.
Likely cause: The run-time of a loop like
char copy[strlen(line)];
for (int i = 0; i < strlen(line); i++)
copy[i] = line[i];
depends quadratically on strlen(line) since there are
strlen(line) iterations and the time to compute the
stopping criterion on each iteration depends linearly
on strlen(line).
Fix: Compute the value of strlen(line) outside the
loop.
2. valgrind reports an invalid read or write in a block
that was previously freed by realloc() during a call
to another function.
Likely cause: main() passes a char* line to a function
such as the following:
void foo (char *bar) {
bar = realloc (bar, 2 * strlen(bar) + 1);
return;
}
and realloc() allocates a new block of storage,
assigning the address to the argument bar. When
foo() returns, line is still pointing to the old
block.
Fix: Pass &line to foo() and change all references
of bar to *bar (but be aware that the predence of *
is lower than that of [] so that *bar[i] is the same
as *(bar[i]), not (*bar)[i] as you might expect).
3. valgrind reports "Conditional jump or move depends on
uninitialised value(s)" on a call to strlen().
Likely cause: The string is not null-terminated.
Fix: Add the null character (but make sure that you
allocated space for it).
--Stan-
PREV
INDEX
NEXT