Stray character is a valid pp-token.

There is a list of pp-tokens in C11 6.4. The last entry of the list
is "each non-white-space character that cannot be one of the above".
That means any character can be a valid pp-token at the lexer level.

We rejected such stray characters at the lexer.

The difference is not significant because a stray character will
cause the compiler to fail, but that's visible if you run only the
preprocessor using -E.

(It is interesting to find that preprocessing output of GCC 4.8.2
is wrong for the following code.

a \\
 b

GCC expands this to

a \
 b

8cc and Clang correctly expands that to

a \ b

No one would really care about this because the output is not valid
C code though.)
String concatenation shouldn't be done at the preprocessing phase.

The preprocessor is phase 4, and the string concatenation is phase 6.
(See C11 5.1.1.2 about the translation phases.)
8cc concatenated strings in the preprocessor, and that difference
was observable if you pass -E option.