[uclibc-ng-devel] [PATCH v2] xtensa: fix strcmp

Waldemar Brodkorb wbx at uclibc-ng.org
Mon Jan 15 21:04:02 CET 2018


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 at gmail.com>
> ---
> Changes v1->v2:
> - wrong test case for the second loop, fixed.
> 

Applied and pushed,
 thx
  Waldemar


More information about the devel mailing list