Generate function-jit corpus in generate_all.php

For use by oss-fuzz.
This commit is contained in:
Nikita Popov 2021-09-22 11:05:17 +02:00
parent 9d0c018668
commit b3d37e9c91
3 changed files with 40 additions and 24 deletions

View file

@ -2,4 +2,15 @@
require __DIR__ . '/generate_unserialize_dict.php'; require __DIR__ . '/generate_unserialize_dict.php';
require __DIR__ . '/generate_unserializehash_corpus.php'; require __DIR__ . '/generate_unserializehash_corpus.php';
require __DIR__ . '/generate_parser_corpus.php'; require __DIR__ . '/generate_parser_corpus.php';
require __DIR__ . '/generate_execute_corpus.php';
require __DIR__ . '/generate_corpus_util.php';
$baseDir = __DIR__ . '/../..';
generate_corpus_from_phpt(
__DIR__ . '/corpus/execute',
["$baseDir/Zend/tests", "$baseDir/ext/reflection"]
);
generate_corpus_from_phpt(
__DIR__ . '/corpus/function-jit',
["$baseDir/Zend/tests", "$baseDir/ext/opcache/tests/jit"]
);

View file

@ -0,0 +1,25 @@
<?php
function generate_corpus_from_phpt(string $corpusDir, array $testDirs, int $maxLen = 8 * 1024) {
@mkdir($corpusDir);
foreach ($testDirs as $testDir) {
$it = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($testDir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($it as $file) {
if (!preg_match('/\.phpt$/', $file)) continue;
$fullCode = file_get_contents($file);
if (!preg_match('/--FILE--\R(.*?)\R--([_A-Z]+)--/s', $fullCode, $matches)) continue;
$code = $matches[1];
if (strlen($code) > $maxLen) continue;
$outFile = str_replace($testDir, '', $file);
$outFile = str_replace('/', '_', $outFile);
if (!preg_match('/SKIP_SLOW_TESTS|SKIP_PERF_SENSITIVE|USE_ZEND_ALLOC/', $fullCode)) {
file_put_contents($corpusDir . '/' . $outFile, $code);
}
}
}
}

View file

@ -1,5 +1,7 @@
<?php <?php
require __DIR__ . '/generate_corpus_util.php';
if ($argc >= 2) { if ($argc >= 2) {
$corpusDir = $argv[1]; $corpusDir = $argv[1];
} else { } else {
@ -12,26 +14,4 @@ if ($argc >= 3) {
$testDirs = ["$baseDir/Zend/tests", "$baseDir/ext/reflection"]; $testDirs = ["$baseDir/Zend/tests", "$baseDir/ext/reflection"];
} }
$maxLen = 8 * 1024; generate_corpus_from_phpt($corpusDir, $testDirs);
@mkdir($corpusDir);
foreach ($testDirs as $testDir) {
$it = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($testDir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($it as $file) {
if (!preg_match('/\.phpt$/', $file)) continue;
$fullCode = file_get_contents($file);
if (!preg_match('/--FILE--\R(.*?)\R--([_A-Z]+)--/s', $fullCode, $matches)) continue;
$code = $matches[1];
if (strlen($code) > $maxLen) continue;
$outFile = str_replace($testDir, '', $file);
$outFile = str_replace('/', '_', $outFile);
if (!preg_match('/SKIP_SLOW_TESTS|SKIP_PERF_SENSITIVE|USE_ZEND_ALLOC/', $fullCode)) {
file_put_contents($corpusDir . '/' . $outFile, $code);
}
}
}