I think valgrind intercepts strcmp, especially it may do that for optimized functions like SSE-optimized ones.
Here's the code of the interceptor:
http://valgrind.sourcearchive.com/documentation/1:3.6.0~svn11254/h__intercepts_8c-source.html
It does return 1:
if ((unsigned char)c1 < (unsigned char)c2) return -1; \
if ((unsigned char)c1 > (unsigned char)c2) return 1; \
glibc, on the other hard, does return a difference:
https://github.com/zerovm/glibc/blob/master/string/strcmp.c
return c1 - c2;
Both implementations are valid, as @retired-ninja said: "strcmp has no guarantees on return value. It is 0, less than zero, or more than zero."
This question is interesting, because, for example, there was one about when strcmp result can be different:
When will strcmp not return -1, 0 or 1?
and many pointed that it can vary on different platforms. But this one shows that it can vary even from run to run if a profiler changes the implementation.