// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include #include #include // Force .lib-file creation on Windows, make ninja happy with zero-build. #if defined(_WIN32) extern "C" __declspec(dllexport) void dummy() {} #endif #if defined(__has_feature) #if __has_feature(undefined_behavior_sanitizer) __attribute__((no_sanitize("undefined"))) #endif #endif void Crash() { int* segfault = nullptr; *segfault = 1; } /* * Run ./process_test * : 0 = stdout, 1 = stderr, 2 = stdout and stderr * : program terminates after replies * : program terminates with exit code * : 0 = program terminates regularly, 1 = program segfaults */ int main(int argc, char* argv[]) { if (argc != 5) { fprintf(stderr, "./process_test \n"); exit(1); } int outstream = atoi(argv[1]); if (outstream < 0 || outstream > 2) { fprintf(stderr, "unknown outstream"); exit(1); } int echo_counter = 0; int echo_count = atoi(argv[2]); int exit_code = atoi(argv[3]); int crash = atoi(argv[4]); if (crash == 1) { Crash(); } const int kLineSize = 128; char line[kLineSize]; while ((echo_count != echo_counter) && (fgets(line, kLineSize, stdin) != nullptr)) { if (outstream == 0) { fprintf(stdout, "%s", line); fflush(stdout); } else if (outstream == 1) { fprintf(stderr, "%s", line); fflush(stderr); } else if (outstream == 2) { fprintf(stdout, "%s", line); fprintf(stderr, "%s", line); fflush(stdout); fflush(stderr); } echo_counter++; } return exit_code; }