The semantics of signed left shifts are contentious for the case
that a '1' is shifted into the signed bit.
Assuming 32-bit integers, 1<<31 is implementation-defined
in ANSI C and C++98, but is explicitly undefined by C99,
C11 and C++11.
The current implementation generates an overflow-shl predicate, which is
then interpreted by the solver APIs. This has the disadvantage that the
predicate has semantics that are both complicated and highly
language-dependent, which is not a good fit for a solver.
The new implementation defines the meaning of signed left shift overflows in
goto-check, similar as it is already done for division and unary minus.
This is covered by an existing test:
regression/cbmc/Overflow_Leftshift1/test.desc
Some tests had previously been passing despite actually causing a crash, due
to the required output being too loosely specified. This ensures the bare minimum:
that every test has an expected EXIT code and SIGNAL result.
The codes suggested were taken from the test's current output, and only applied for
CORE tests, but hand inspection suggests these choices are reasonable.