Hi Max, Max Filippov wrote,
Loops with 'loop forever' annotation inside strcmp are actually meant to loop forever. Falling through the end of the first loop may result in equal strings being compared unequal, e.g.:
#include <string.h>
int main(void) { char a[4096] __attribute__((aligned(4))); char b[4096] __attribute__((aligned(4)));
memset(a, ' ', 258 * 8); memset(b, ' ', 258 * 8); a[255 * 8] = 0; a[256 * 8] = 'a'; b[255 * 8] = 0; b[256 * 8] = 'b'; return !(strcmp(a, b) == 0);
}
Falling through the end of the second loop may result in unequal strings being compared as equal, e.g.:
#include <string.h>
int main(void) { char a[4096] __attribute__((aligned(4))); char b[4096] __attribute__((aligned(4)));
memset(a, ' ', 514 * 6); memset(b, ' ', 514 * 6); a[514 * 6 + 0] = 'a'; a[514 * 6 + 1] = 0; b[514 * 6 + 0] = 'b'; b[514 * 6 + 1] = 0; return !(strcmp(a, b) != 0);
}
Use 0 as a loop counter to make 2^32 - 1 iterations which is enough to cover all addressable memory. While at it drop useless nop at the end of the first loop and use a11 for all loop counters.
Signed-off-by: Max Filippov jcmvbkbc@gmail.com
Changes v1->v2:
- wrong test case for the second loop, fixed.
Applied and pushed, thx Waldemar