reset error code in ast fuzzer

This commit is contained in:
Alexander Kuzmenkov 2020-10-16 17:26:59 +03:00
parent dc8e165ce4
commit 9116a00a12

View File

@ -1202,8 +1202,15 @@ private:
} }
catch (...) catch (...)
{ {
// Some functions (e.g. protocol parsers) don't throw, but
// set last_exception instead, so we'll also do it here for
// uniformity.
last_exception_received_from_server = std::make_unique<Exception>(getCurrentExceptionMessage(true), getCurrentExceptionCode()); last_exception_received_from_server = std::make_unique<Exception>(getCurrentExceptionMessage(true), getCurrentExceptionCode());
received_exception_from_server = true; received_exception_from_server = true;
}
if (received_exception_from_server)
{
fmt::print(stderr, "Error on processing query '{}': {}\n", fmt::print(stderr, "Error on processing query '{}': {}\n",
ast_to_process->formatForErrorMessage(), ast_to_process->formatForErrorMessage(),
last_exception_received_from_server->message()); last_exception_received_from_server->message());
@ -1213,29 +1220,30 @@ private:
{ {
// Probably the server is dead because we found an assertion // Probably the server is dead because we found an assertion
// failure. Fail fast. // failure. Fail fast.
fmt::print(stderr, "Lost connection to the server\n");
return begin; return begin;
} }
// The server is still alive so we're going to continue fuzzing.
// Determine what we're going to use as the starting AST.
if (received_exception_from_server) if (received_exception_from_server)
{ {
// Query completed with error, ignore it and fuzz again. // Query completed with error, keep the previous starting AST.
fprintf(stderr, "Got error, will fuzz again\n"); // Also discard the exception that we now know to be non-fatal,
// so that it doesn't influence the exit code.
last_exception_received_from_server.reset(nullptr);
received_exception_from_server = false; received_exception_from_server = false;
last_exception_received_from_server.reset();
continue;
} }
else if (ast_to_process->formatForErrorMessage().size() > 500) else if (ast_to_process->formatForErrorMessage().size() > 500)
{ {
// ast too long, start from original ast // ast too long, start from original ast
fprintf(stderr, "current ast too long, won't elaborate\n"); fprintf(stderr, "Current AST is too long, discarding it and using the original AST as a start\n");
fuzz_base = orig_ast; fuzz_base = orig_ast;
} }
else else
{ {
// fuzz starting from this successful query // fuzz starting from this successful query
fprintf(stderr, "using this ast as etalon\n"); fprintf(stderr, "Query succeeded, using this AST as a start\n");
fuzz_base = ast_to_process; fuzz_base = ast_to_process;
} }
} }