{ "cells": [ { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" }, "tags": [], "toc-hr-collapsed": false }, "source": [ "# Probabilistic Grammar Fuzzing\n", "\n", "Let us give grammars even more power by assigning _probabilities_ to individual expansions. This allows us to control how many of each element should be produced, and thus allows us to _target_ our generated tests towards specific functionality. We also show how to learn such probabilities from given sample inputs, and specifically direct our tests towards input features that are uncommon in these samples." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.104519Z", "iopub.status.busy": "2022-05-18T10:54:22.104358Z", "iopub.status.idle": "2022-05-18T10:54:22.161156Z", "shell.execute_reply": "2022-05-18T10:54:22.160700Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from bookutils import YouTubeVideo\n", "YouTubeVideo('9htOliNwopc')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "**Prerequisites**\n", "\n", "* You should have read the [chapter on grammars](Grammars.ipynb).\n", "* Our implementation hooks into the grammar-based fuzzer introduced in [\"Efficient Grammar Fuzzing\"](GrammarFuzzer.ipynb)\n", "* For learning probabilities from samples, we make use of [parsers](Parser.ipynb)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## Synopsis\n", "\n", "\n", "To [use the code provided in this chapter](Importing.ipynb), write\n", "\n", "python\n", ">>> from fuzzingbook.ProbabilisticGrammarFuzzer import \n", "\n", "\n", "and then make use of the following features.\n", "\n", "\n", "A _probabilistic_ grammar allows to attach individual _probabilities_ to production rules. To set the probability of an individual expansion S to the value X (between 0 and 1), replace it with a pair\n", "\n", "python\n", "(S, opts(prob=X))\n", "\n", "\n", "If we want to ensure that 90% of phone numbers generated have an area code starting with 9, we can write:\n", "\n", "python\n", ">>> from Grammars import US_PHONE_GRAMMAR, extend_grammar, opts\n", ">>> PROBABILISTIC_US_PHONE_GRAMMAR: Grammar = extend_grammar(US_PHONE_GRAMMAR,\n", ">>> {\n", ">>> \"\": [\n", ">>> \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n", ">>> (\"9\", opts(prob=0.9))\n", ">>> ],\n", ">>> })\n", "\n", "A ProbabilisticGrammarFuzzer will extract and interpret these options. Here is an example:\n", "\n", "python\n", ">>> probabilistic_us_phone_fuzzer = ProbabilisticGrammarFuzzer(PROBABILISTIC_US_PHONE_GRAMMAR)\n", ">>> [probabilistic_us_phone_fuzzer.fuzz() for i in range(5)]\n", "['(918)925-2501',\n", " '(981)925-0792',\n", " '(934)995-5029',\n", " '(955)999-7801',\n", " '(964)927-0877']\n", "\n", "As you can see, the large majority of area codes now starts with 9.\n", "\n", "![](PICS/ProbabilisticGrammarFuzzer-synopsis-1.svg)\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The Law of Leading Digits" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "In all our examples so far, you may have noted that inputs generated by a program differ quite a bit from \"natural\" inputs as they occur in real life. This is true even for innocuous elements such as numbers – yes, the numbers we have generated so far actually _differ_ from numbers in the real world. This is because in real-life sets of numerical data, the _leading significant digit_ is likely to be small: Actually, on average, the leading digit 1 occurs more than _six times_ as often as the leading digit 8 or 9. It has been shown that this result applies to a wide variety of data sets, including electricity bills, street addresses, stock prices, house prices, population numbers, death rates, lengths of rivers, physical and mathematical constants (Wikipedia)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This law of leading digits was first observed by Newcomb \\cite{Newcomb1881} and later formalized by Benford in \\cite{Benford1938}. Let us take a look at the conditions that determine the first digit of a number. We can easily compute the first digit by converting the number into a string and take the first character:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.174599Z", "iopub.status.busy": "2022-05-18T10:54:22.174431Z", "iopub.status.idle": "2022-05-18T10:54:22.176363Z", "shell.execute_reply": "2022-05-18T10:54:22.176121Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def first_digit_via_string(x: int) -> int:\n", " return ord(repr(x)[0]) - ord('0')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.177774Z", "iopub.status.busy": "2022-05-18T10:54:22.177671Z", "iopub.status.idle": "2022-05-18T10:54:22.179744Z", "shell.execute_reply": "2022-05-18T10:54:22.179478Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_digit_via_string(2001)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To do this mathematically, though, we have to take the fractional part of their logarithm, or formally\n", "\n", "$$\n", "d = 10^{\\{\\log_{10}(x)\\}}\n", "$$\n", "\n", "where $\\{x\\}$ is the fractional part of $x$ (i.e. $\\{1.234\\} = 0.234$)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.181254Z", "iopub.status.busy": "2022-05-18T10:54:22.181141Z", "iopub.status.idle": "2022-05-18T10:54:22.182733Z", "shell.execute_reply": "2022-05-18T10:54:22.182507Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import math" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.184137Z", "iopub.status.busy": "2022-05-18T10:54:22.184053Z", "iopub.status.idle": "2022-05-18T10:54:22.185877Z", "shell.execute_reply": "2022-05-18T10:54:22.185647Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def first_digit_via_log(x: int) -> int:\n", " frac, whole = math.modf(math.log10(x))\n", " return int(10 ** frac)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.187179Z", "iopub.status.busy": "2022-05-18T10:54:22.187096Z", "iopub.status.idle": "2022-05-18T10:54:22.189215Z", "shell.execute_reply": "2022-05-18T10:54:22.188936Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_digit_via_log(2001)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Most sets of \"naturally\" occurring numbers should not have any bias in the fractional parts of their logarithms, and hence, the fractional part $\\{\\log_{10}(x)\\}$ is typically uniformly distributed. However, the fractional parts for the individual digits are _not_ evenly distributed. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "For a number to start with a digit $d$, the condition $d < 10^{\\{\\log_{10}(x)\\}} < d + 1$ must hold. To start with the digit 1, the fractional part $\\{\\log_{10}(x)\\}$ must thus be in the range" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.190620Z", "iopub.status.busy": "2022-05-18T10:54:22.190538Z", "iopub.status.idle": "2022-05-18T10:54:22.192688Z", "shell.execute_reply": "2022-05-18T10:54:22.192457Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(0.0, 0.3010299956639812)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(math.log10(1), math.log10(2))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "To start with the digit 2, though, it must be in the range" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.194158Z", "iopub.status.busy": "2022-05-18T10:54:22.194076Z", "iopub.status.idle": "2022-05-18T10:54:22.196173Z", "shell.execute_reply": "2022-05-18T10:54:22.195972Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(0.3010299956639812, 0.47712125471966244)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(math.log10(2), math.log10(3))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "which is much smaller. Formally, the probability $P(d)$ for a leading digit $d$ (again, assuming uniformly distributed fractional parts) is known as Benford's law:\n", "$$\n", "P(d) = \\log_{10}(d + 1) - \\log_{10}(d)\n", "$$\n", "which gives us:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.197606Z", "iopub.status.busy": "2022-05-18T10:54:22.197515Z", "iopub.status.idle": "2022-05-18T10:54:22.199210Z", "shell.execute_reply": "2022-05-18T10:54:22.198993Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def prob_leading_digit(d: int) -> float:\n", " return math.log10(d + 1) - math.log10(d)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let us compute these probabilities for all digits:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.200682Z", "iopub.status.busy": "2022-05-18T10:54:22.200588Z", "iopub.status.idle": "2022-05-18T10:54:22.203222Z", "shell.execute_reply": "2022-05-18T10:54:22.202998Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[(1, '0.30'),\n", " (2, '0.18'),\n", " (3, '0.12'),\n", " (4, '0.10'),\n", " (5, '0.08'),\n", " (6, '0.07'),\n", " (7, '0.06'),\n", " (8, '0.05'),\n", " (9, '0.05')]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "digit_probs = [prob_leading_digit(d) for d in range(1, 10)]\n", "[(d, \"%.2f\" % digit_probs[d - 1]) for d in range(1, 10)]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.204582Z", "iopub.status.busy": "2022-05-18T10:54:22.204495Z", "iopub.status.idle": "2022-05-18T10:54:22.632661Z", "shell.execute_reply": "2022-05-18T10:54:22.632381Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# ignore\n", "import matplotlib.pyplot as plt # type: ignore" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-05-18T10:54:22.634445Z", "iopub.status.busy": "2022-05-18T10:54:22.634311Z", "iopub.status.idle": "2022-05-18T10:54:22.725048Z", "shell.execute_reply": "2022-05-18T10:54:22.724613Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "