VirtualBox

Ignore:
Timestamp:
Jun 22, 2018 7:40:23 AM (7 years ago)
Author:
vboxsync
Message:

Runtime/fuzzing: Add some simple statistics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/fuzz/fuzz-observer.cpp

    r72571 r72649  
    125125    /** Pointer to the array of observer thread states. */
    126126    PRTFUZZOBSTHRD              paObsThreads;
     127    /** Timestamp of the last stats query. */
     128    uint64_t                    tsLastStats;
     129    /** Last number of fuzzed inputs per second if we didn't gather enough data in between
     130     * statistic queries. */
     131    uint32_t                    cFuzzedInputsPerSecLast;
     132    /** Fuzzing statistics. */
     133    RTFUZZOBSSTATS              Stats;
    127134} RTFUZZOBSINT;
    128135
     
    754761            RTPROCSTATUS ProcSts;
    755762            rc = rtFuzzObsExecCtxClientRun(pThis, pExecCtx, &ProcSts);
     763            ASMAtomicIncU32(&pThis->Stats.cFuzzedInputs);
     764            ASMAtomicIncU32(&pThis->Stats.cFuzzedInputsPerSec);
     765
    756766            if (RT_SUCCESS(rc))
    757767            {
    758768                if (ProcSts.enmReason != RTPROCEXITREASON_NORMAL)
     769                {
     770                    ASMAtomicIncU32(&pThis->Stats.cFuzzedInputsCrash);
    759771                    rc = rtFuzzObsAddInputToResults(pThis, pObsThrd->hFuzzInput, pExecCtx);
     772                }
    760773            }
    761774            else if (rc == VERR_TIMEOUT)
     775            {
     776                ASMAtomicIncU32(&pThis->Stats.cFuzzedInputsHang);
    762777                rc = rtFuzzObsAddInputToResults(pThis, pObsThrd->hFuzzInput, pExecCtx);
     778            }
    763779            else
    764780                AssertFailed();
     
    939955        pThis->cThreads      = 0;
    940956        pThis->paObsThreads  = NULL;
     957        pThis->tsLastStats   = RTTimeMilliTS();
     958        pThis->Stats.cFuzzedInputsPerSec = 0;
     959        pThis->Stats.cFuzzedInputs       = 0;
     960        pThis->Stats.cFuzzedInputsHang   = 0;
     961        pThis->Stats.cFuzzedInputsCrash  = 0;
    941962        rc = RTFuzzCtxCreate(&pThis->hFuzzCtx);
    942963        if (RT_SUCCESS(rc))
     
    9951016
    9961017
     1018RTDECL(int) RTFuzzObsQueryStats(RTFUZZOBS hFuzzObs, PRTFUZZOBSSTATS pStats)
     1019{
     1020    PRTFUZZOBSINT pThis = hFuzzObs;
     1021    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     1022    AssertPtrReturn(pStats, VERR_INVALID_POINTER);
     1023
     1024    uint64_t tsStatsQuery = RTTimeMilliTS();
     1025    uint32_t cFuzzedInputsPerSec = ASMAtomicXchgU32(&pThis->Stats.cFuzzedInputsPerSec, 0);
     1026
     1027    pStats->cFuzzedInputsCrash  = ASMAtomicReadU32(&pThis->Stats.cFuzzedInputsCrash);
     1028    pStats->cFuzzedInputsHang   = ASMAtomicReadU32(&pThis->Stats.cFuzzedInputsHang);
     1029    pStats->cFuzzedInputs       = ASMAtomicReadU32(&pThis->Stats.cFuzzedInputs);
     1030    uint64_t cPeriodSec = (tsStatsQuery - pThis->tsLastStats) / 1000;
     1031    if (cPeriodSec)
     1032    {
     1033        pStats->cFuzzedInputsPerSec    = cFuzzedInputsPerSec / cPeriodSec;
     1034        pThis->cFuzzedInputsPerSecLast = pStats->cFuzzedInputsPerSec;
     1035        pThis->tsLastStats             = tsStatsQuery;
     1036    }
     1037    else
     1038        pStats->cFuzzedInputsPerSec = pThis->cFuzzedInputsPerSecLast;
     1039    return VINF_SUCCESS;
     1040}
     1041
     1042
    9971043RTDECL(int) RTFuzzObsSetTmpDirectory(RTFUZZOBS hFuzzObs, const char *pszTmp)
    9981044{
     
    10521098            char **ppszOwn = pThis->papszArgs;
    10531099            const char * const *ppsz = papszArgs;
    1054             while (   *ppsz != NULL
    1055                    && RT_SUCCESS(rc))
     1100            for (unsigned i = 0; i < cArgs; i++)
    10561101            {
    1057                 *ppszOwn = RTStrDup(*ppsz);
    1058                 if (RT_UNLIKELY(!*ppszOwn))
     1102                pThis->papszArgs[i] = RTStrDup(papszArgs[i]);
     1103                if (RT_UNLIKELY(!pThis->papszArgs[i]))
    10591104                {
    1060                     while (ppszOwn > pThis->papszArgs)
     1105                    while (i > 0)
    10611106                    {
    1062                         ppszOwn--;
    1063                         RTStrFree(*ppszOwn);
     1107                        i--;
     1108                        RTStrFree(pThis->papszArgs[i]);
    10641109                    }
    10651110                    break;
    10661111                }
    1067 
    1068                 ppszOwn++;
    1069                 ppsz++;
    10701112            }
    10711113
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette