diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87ac4a0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,87 @@ +# VIM +*.swp + +# vscode +.*.code-workspace + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Zip +*.zip + +# Mac +.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE index d645695..afdfe50 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2017 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 2b3e8a1..4a54a84 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,23 @@ limitations under the License. #### Usage +To see the usage information run the following command: + +`python3 generator.py --help` + To generate a single .html sample run: -`python generator.py ` +`python generator.py --file ` + +To generate a single .html sample run using a template you wrote: + +`python generator.py --file --template ` To generate multiple samples with a single call run: `python generator.py --output_dir --no_of_files ` -The generated samples will be placed in the specified directory and will be named as fuzz-<number>.html, e.g. fuzz-1.html, fuzz-2.html etc. Generating multiple samples is faster because the input grammar files need to be loaded and parsed only once. +The generated samples will be placed in the specified directory and will be named as fuzz-<number>.html, e.g. fuzz-00001.html, fuzz-00002.html etc. Generating multiple samples is faster because the input grammar files need to be loaded and parsed only once. #### Code organization @@ -200,7 +208,7 @@ Sometimes you might want to call custom Python code in your grammar. For example = ``` -The python functions are defined between ‘!begin function ’ and ‘!end function’ commands. The functions can be called in two ways: using ‘beforeoutput’ attribute and using symbol. +The python functions are defined between ‘!begin function ’ and ‘!end function’ commands. The functions can be called in two ways: using ‘beforeoutput’ attribute and using `` symbol. By specifying the ‘beforeoutput’ attribute in some symbol, the corresponding function will be called when this symbol is expanded, just before the result of the expansion is output to the sample. The expansion result will be passed to the function in the ret_val variable. The function is then free to modify ret_val, store it for later use or perform any other operations. @@ -209,8 +217,8 @@ When using a special `` symbol, the function (specified in a ‘function Your python code has access to the following variables: - `context` - a dictionary that is passed through the whole sample generation. You can use it to store values (such as storing the size in an example above) and retrieve them in the rules that fire subsequently. -- `attributes` - a dictionary corresponding to the symbol currently being processed. You can use it to pass parameters to your functions. For example if you used something like to call your function attributes\[‘foo’\] will be set to ‘bar’. -- `ret_val` - The value that will be output as a result of the function call. It is initialized to an empty value when using symbol to call a function, otherwise it will be initialized to the value generated by the symbol. +- `attributes` - a dictionary corresponding to the symbol currently being processed. You can use it to pass parameters to your functions. For example if you used something like `` to call your function attributes\[‘foo’\] will be set to ‘bar’. +- `ret_val` - The value that will be output as a result of the function call. It is initialized to an empty value when using `` symbol to call a function, otherwise it will be initialized to the value generated by the symbol. ##### Built-in symbols @@ -256,10 +264,12 @@ The following attributes are supported: Some of the bugs that have been found with Domato: - - Apple Safari: CVE-2017-2369, CVE-2017-2373, CVE-2017-2362, CVE-2017-2454, CVE-2017-2455, CVE-2017-2459, CVE-2017-2460, CVE-2017-2466, CVE-2017-2471, CVE-2017-2476, CVE-2017-7039, CVE-2017-7040, CVE-2017-7041, CVE-2017-7042, CVE-2017-7043, CVE-2017-7046, CVE-2017-7048, CVE-2017-7049 + - Apple Safari: CVE-2017-2369, CVE-2017-2373, CVE-2017-2362, CVE-2017-2454, CVE-2017-2455, CVE-2017-2459, CVE-2017-2460, CVE-2017-2466, CVE-2017-2471, CVE-2017-2476, CVE-2017-7039, CVE-2017-7040, CVE-2017-7041, CVE-2017-7042, CVE-2017-7043, CVE-2017-7046, CVE-2017-7048, CVE-2017-7049, CVE-2017-13796, CVE-2017-13792, CVE-2017-13797, CVE-2017-13795, CVE-2017-13785, CVE-2017-13784, CVE-2017-13783, CVE-2017-13802, CVE-2017-13794, CVE-2017-13798, CVE-2017-13791, CVE-2018-4089, CVE-2018-4200, CVE-2018-4197, CVE-2018-4318, CVE-2018-4317, CVE-2018-4314, CVE-2018-4306, CVE-2018-4312, CVE-2018-4315, CVE-2018-4323, CVE-2018-4328 - Google Chrome: Issues 666246 and 671328 - - Microsoft Internet Explorer 11: CVE-2017-0037, CVE-2017-0059, CVE-2017-0202, CVE-2017-8594 + - Microsoft Internet Explorer 11: CVE-2017-0037, CVE-2017-0059, CVE-2017-0202, CVE-2017-8594, CVE-2018-0866 - Microsoft Edge: CVE-2017-0037, CVE-2017-8496, CVE-2017-8652, CVE-2017-8644 + - Microsoft JScript: CVE-2017-11903, CVE-2017-11855, CVE-2017-11793, CVE-2017-11906, CVE-2017-11907, CVE-2018-0935, CVE-2018-8353, CVE-2018-8631 + - Microsoft VBScript: CVE-2018-8544, CVE-2018-8552, CVE-2018-8625 - Mozilla Firefox: CVE-2017-5404, CVE-2017-5447, CVE-2017-5465 #### Disclaimer diff --git a/canvas/canvas.txt b/canvas/canvas.txt index 17db36a..05f77ed 100644 --- a/canvas/canvas.txt +++ b/canvas/canvas.txt @@ -107,8 +107,8 @@ = -!include common.txt -!include cssproperties.txt +!include ../rules/common.txt +!include ../rules/cssproperties.txt !lineguard try { } catch(e) { console.log(e.message) } !varformat fuzzvar%05d diff --git a/canvas/generator.py b/canvas/generator.py index 43e7d5c..d3b89fb 100644 --- a/canvas/generator.py +++ b/canvas/generator.py @@ -129,7 +129,7 @@ def main(): outfiles = [] for i in range(nsamples): - outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i) + '.html')) + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) generate_samples(fuzzer_dir, outfiles) diff --git a/common.txt b/common.txt deleted file mode 100644 index 327324b..0000000 --- a/common.txt +++ /dev/null @@ -1,291 +0,0 @@ -# Copyright 2017 Google Inc. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - - = - - = 32768 - = 65535 - = 65536 - = 1073741824 - = 536870912 - = 268435456 - = 4294967295 - = 2147483648 - = 2147483647 - = -2147483648 - = -1073741824 - = -32769 - - = 0 - = 0 - = 0 - = 1 - = 1 - = -1 - = - = - = - - = true - = false - - = - - = htmlvar0000 - = svgvar0000 - = class - - = red - = green - = white - = black - = # - = rgb(,,) - - = a - = abbr - = acronym - = address - = applet - = area - = article - = aside - = audio - = b - = base - = basefont - = bdi - = bdo - = bgsound - = big - = blink - = blockquote - = body - = br - = button - = canvas - = caption - = center - = cite - = code - = col - = colgroup - = command - = content - = data - = datalist - = dd - = del - = details - = dfn - = dialog - = dir - = div - = dl - = dt - = element - = em - = embed - = fieldset - = figcaption - = figure - = font - = footer - = form - = frame - = frameset - = h1 - = h2 - = h3 - = h4 - = h5 - = h6 - = head - = header - = hgroup - = hr - = html - = i - = iframe - = image - = img - = input - = ins - = isindex - = kbd - = keygen - = label - = layer - = legend - = li - = link - = listing - = main - = map - = mark - = marquee - = menu - = menuitem - = meta - = meter - = multicol - = nav - = nobr - = noembed - = noframes - = nolayer - = noscript - = object - = ol - = optgroup - = option - = output - = p - = param - = picture - = plaintext - = pre - = progress - = q - = rp - = rt - = rtc - = ruby - = s - = samp - = script - = section - = select - = shadow - = small - = source - = spacer - = span - = strike - = strong - = style - = sub - = summary - = sup - = table - = tbody - = td - = template - = textarea - = tfoot - = th - = thead - = time - = title - = tr - = track - = tt - = u - = ul - = var - = video - = wbr - = xmp - - = a - = altGlyph - = altGlyphDef - = altGlyphItem - = animate - = animateColor - = animateMotion - = animateTransform - = circle - = clipPath - = cursor - = defs - = desc - = ellipse - = feBlend - = feColorMatrix - = feComponentTransfer - = feComposite - = feConvolveMatrix - = feDiffuseLighting - = feDisplacementMap - = feDistantLight - = feDropShadow - = feFlood - = feFuncA - = feFuncB - = feFuncG - = feFuncR - = feGaussianBlur - = feImage - = feMerge - = feMergeNode - = feMorphology - = feOffset - = fePointLight - = feSpecularLighting - = feSpotLight - = feTile - = feTurbulence - = filter - = font - = font_face - = font_face_format - = font_face_name - = font_face_src - = font_face_uri - = foreignObject - = g - = glyph - = glyphRef - = hkern - = image - = line - = linearGradient - = marker - = mask - = metadata - = missing_glyph - = mpath - = path - = pattern - = polygon - = polyline - = radialGradient - = rect - = script - = set - = stop - = style - = svg - = switch - = symbol - = text - = textPath - = title - = tref - = tspan - = use - = view - = vkern - - = x - = data:image/gif;base64,R0lGODlhIAAgAPIBAGbMzP///wAAADOZZpn/zAAAAAAAAAAAACH5BAAAAAAALAAAAAAgACAAAAOLGLrc/k7ISau9S5DNu/8fICgaYJ5oqqbDGJRrLAMtScw468J5Xr+3nm8XFM5+PGMMWYwxcMyZ40iULQaDhSzqDGBNisGyuhUDrmNb72pWcaXhtpsM/27pVi8UX96rcQpDf3V+QD12d4NKK2+Lc4qOKI2RJ5OUNHyXSDRYnZ6foKAuLxelphMQqaoPCQA7 - - = x - = data:video/mp4;base64,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 - - = x - = data:audio/mp3;base64,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 - - diff --git a/generator.py b/generator.py index 6c80a93..489721c 100755 --- a/generator.py +++ b/generator.py @@ -1,5 +1,5 @@ # Domato - main generator script -# ------------------------------- +# -------------------------------------- # # Written and maintained by Ivan Fratric # @@ -21,247 +21,19 @@ import os import re import random -import sys +import argparse +from pathlib import Path from grammar import Grammar +from svg_tags import _SVG_TYPES +from html_tags import _HTML_TYPES +from mathml_tags import _MATHML_TYPES _N_MAIN_LINES = 1000 _N_EVENTHANDLER_LINES = 500 _N_ADDITIONAL_HTMLVARS = 5 -# A map from tag name to corresponding type for HTML tags -_HTML_TYPES = { - 'a': 'HTMLAnchorElement', - 'abbr': 'HTMLUnknownElement', - 'acronym': 'HTMLUnknownElement', - 'address': 'HTMLUnknownElement', - 'applet': 'HTMLUnknownElement', - 'area': 'HTMLAreaElement', - 'article': 'HTMLUnknownElement', - 'aside': 'HTMLUnknownElement', - 'audio': 'HTMLAudioElement', - 'b': 'HTMLUnknownElement', - 'base': 'HTMLBaseElement', - 'basefont': 'HTMLUnknownElement', - 'bdi': 'HTMLUnknownElement', - 'bdo': 'HTMLUnknownElement', - 'bgsound': 'HTMLUnknownElement', - 'big': 'HTMLUnknownElement', - 'blockquote': 'HTMLUnknownElement', - 'br': 'HTMLBRElement', - 'button': 'HTMLButtonElement', - 'canvas': 'HTMLCanvasElement', - 'caption': 'HTMLTableCaptionElement', - 'center': 'HTMLUnknownElement', - 'cite': 'HTMLUnknownElement', - 'code': 'HTMLUnknownElement', - 'col': 'HTMLTableColElement', - 'colgroup': 'HTMLUnknownElement', - 'command': 'HTMLUnknownElement', - 'content': 'HTMLContentElement', - 'data': 'HTMLDataElement', - 'datalist': 'HTMLDataListElement', - 'dd': 'HTMLUnknownElement', - 'del': 'HTMLModElement', - 'details': 'HTMLDetailsElement', - 'dfn': 'HTMLUnknownElement', - 'dialog': 'HTMLDialogElement', - 'dir': 'HTMLDirectoryElement', - 'div': 'HTMLDivElement', - 'dl': 'HTMLDListElement', - 'dt': 'HTMLUnknownElement', - 'em': 'HTMLUnknownElement', - 'embed': 'HTMLEmbedElement', - 'fieldset': 'HTMLFieldSetElement', - 'figcaption': 'HTMLUnknownElement', - 'figure': 'HTMLUnknownElement', - 'font': 'HTMLFontElement', - 'footer': 'HTMLUnknownElement', - 'form': 'HTMLFormElement', - 'frame': 'HTMLFrameElement', - 'frameset': 'HTMLFrameSetElement', - 'h1': 'HTMLHeadingElement', - 'h2': 'HTMLHeadingElement', - 'h3': 'HTMLHeadingElement', - 'h4': 'HTMLHeadingElement', - 'h5': 'HTMLHeadingElement', - 'h6': 'HTMLHeadingElement', - 'header': 'HTMLUnknownElement', - 'hgroup': 'HTMLUnknownElement', - 'hr': 'HTMLHRElement', - 'i': 'HTMLUnknownElement', - 'iframe': 'HTMLIFrameElement', - 'image': 'HTMLImageElement', - 'img': 'HTMLImageElement', - 'input': 'HTMLInputElement', - 'ins': 'HTMLModElement', - 'isindex': 'HTMLUnknownElement', - 'kbd': 'HTMLUnknownElement', - 'keygen': 'HTMLKeygenElement', - 'label': 'HTMLLabelElement', - 'layer': 'HTMLUnknownElement', - 'legend': 'HTMLLegendElement', - 'li': 'HTMLLIElement', - 'link': 'HTMLLinkElement', - 'listing': 'HTMLUnknownElement', - 'main': 'HTMLUnknownElement', - 'map': 'HTMLMapElement', - 'mark': 'HTMLUnknownElement', - 'marquee': 'HTMLMarqueeElement', - 'menu': 'HTMLMenuElement', - 'menuitem': 'HTMLMenuItemElement', - 'meta': 'HTMLMetaElement', - 'meter': 'HTMLMeterElement', - 'nav': 'HTMLUnknownElement', - 'nobr': 'HTMLUnknownElement', - 'noembed': 'HTMLUnknownElement', - 'noframes': 'HTMLUnknownElement', - 'nolayer': 'HTMLUnknownElement', - 'noscript': 'HTMLUnknownElement', - 'object': 'HTMLObjectElement', - 'ol': 'HTMLOListElement', - 'optgroup': 'HTMLOptGroupElement', - 'option': 'HTMLOptionElement', - 'output': 'HTMLOutputElement', - 'p': 'HTMLParagraphElement', - 'param': 'HTMLParamElement', - 'picture': 'HTMLPictureElement', - 'plaintext': 'HTMLUnknownElement', - 'pre': 'HTMLPreElement', - 'progress': 'HTMLProgressElement', - 'q': 'HTMLQuoteElement', - 'rp': 'HTMLUnknownElement', - 'rt': 'HTMLUnknownElement', - 'ruby': 'HTMLUnknownElement', - 's': 'HTMLUnknownElement', - 'samp': 'HTMLUnknownElement', - 'section': 'HTMLUnknownElement', - 'select': 'HTMLSelectElement', - 'shadow': 'HTMLShadowElement', - 'small': 'HTMLUnknownElement', - 'source': 'HTMLSourceElement', - 'span': 'HTMLSpanElement', - 'strike': 'HTMLUnknownElement', - 'strong': 'HTMLUnknownElement', - 'style': 'HTMLStyleElement', - 'sub': 'HTMLUnknownElement', - 'summary': 'HTMLUnknownElement', - 'sup': 'HTMLUnknownElement', - 'table': 'HTMLTableElement', - 'tbody': 'HTMLTableSectionElement', - 'td': 'HTMLUnknownElement', - 'template': 'HTMLTemplateElement', - 'textarea': 'HTMLTextAreaElement', - 'tfoot': 'HTMLTableSectionElement', - 'th': 'HTMLTableCellElement', - 'thead': 'HTMLTableSectionElement', - 'time': 'HTMLTimeElement', - 'title': 'HTMLTitleElement', - 'tr': 'HTMLTableRowElement', - 'track': 'HTMLTrackElement', - 'tt': 'HTMLUnknownElement', - 'u': 'HTMLUnknownElement', - 'ul': 'HTMLUListElement', - 'var': 'HTMLUnknownElement', - 'video': 'HTMLVideoElement', - 'wbr': 'HTMLUnknownElement', - 'xmp': 'HTMLUnknownElement' -} - -# A map from tag name to corresponding type for SVG tags -_SVG_TYPES = { - 'a': 'SVGAElement', - 'altGlyph': 'SVGElement', - 'altGlyphDef': 'SVGElement', - 'altGlyphItem': 'SVGElement', - 'animate': 'SVGAnimateElement', - 'animateColor': 'SVGElement', - 'animateMotion': 'SVGAnimateMotionElement', - 'animateTransform': 'SVGAnimateTransformElement', - 'circle': 'SVGCircleElement', - 'clipPath': 'SVGClipPathElement', - 'color-profile': 'SVGElement', - 'cursor': 'SVGCursorElement', - 'defs': 'SVGDefsElement', - 'desc': 'SVGDescElement', - 'discard': 'SVGDiscardElement', - 'ellipse': 'SVGEllipseElement', - 'feBlend': 'SVGFEBlendElement', - 'feColorMatrix': 'SVGFEColorMatrixElement', - 'feComponentTransfer': 'SVGFEComponentTransferElement', - 'feComposite': 'SVGFECompositeElement', - 'feConvolveMatrix': 'SVGFEConvolveMatrixElement', - 'feDiffuseLighting': 'SVGFEDiffuseLightingElement', - 'feDisplacementMap': 'SVGFEDisplacementMapElement', - 'feDistantLight': 'SVGFEDistantLightElement', - 'feDropShadow': 'SVGFEDropShadowElement', - 'feFlood': 'SVGFEFloodElement', - 'feFuncA': 'SVGFEFuncAElement', - 'feFuncB': 'SVGFEFuncBElement', - 'feFuncG': 'SVGFEFuncGElement', - 'feFuncR': 'SVGFEFuncRElement', - 'feGaussianBlur': 'SVGFEGaussianBlurElement', - 'feImage': 'SVGFEImageElement', - 'feMerge': 'SVGFEMergeElement', - 'feMergeNode': 'SVGFEMergeNodeElement', - 'feMorphology': 'SVGFEMorphologyElement', - 'feOffset': 'SVGFEOffsetElement', - 'fePointLight': 'SVGFEPointLightElement', - 'feSpecularLighting': 'SVGFESpecularLightingElement', - 'feSpotLight': 'SVGFESpotLightElement', - 'feTile': 'SVGFETileElement', - 'feTurbulence': 'SVGFETurbulenceElement', - 'filter': 'SVGFilterElement', - 'font': 'SVGElement', - 'font-face': 'SVGElement', - 'font-face-format': 'SVGElement', - 'font-face-name': 'SVGElement', - 'font-face-src': 'SVGElement', - 'font-face-uri': 'SVGElement', - 'foreignObject': 'SVGForeignObjectElement', - 'g': 'SVGGElement', - 'glyph': 'SVGElement', - 'glyphRef': 'SVGElement', - 'hatch': 'SVGElement', - 'hatchpath': 'SVGElement', - 'hkern': 'SVGElement', - 'image': 'SVGImageElement', - 'line': 'SVGLineElement', - 'linearGradient': 'SVGLinearGradientElement', - 'marker': 'SVGMarkerElement', - 'mask': 'SVGMaskElement', - 'mesh': 'SVGElement', - 'meshgradient': 'SVGElement', - 'meshpatch': 'SVGElement', - 'meshrow': 'SVGElement', - 'metadata': 'SVGMetadataElement', - 'missing-glyph': 'SVGElement', - 'mpath': 'SVGMPathElement', - 'path': 'SVGPathElement', - 'pattern': 'SVGPatternElement', - 'polygon': 'SVGPolygonElement', - 'polyline': 'SVGPolylineElement', - 'radialGradient': 'SVGRadialGradientElement', - 'rect': 'SVGRectElement', - 'set': 'SVGSetElement', - 'svg': 'SVGSVGElement', - 'solidcolor': 'SVGElement', - 'stop': 'SVGStopElement', - 'switch': 'SVGSwitchElement', - 'symbol': 'SVGSymbolElement', - 'text': 'SVGTextElement', - 'textPath': 'SVGTextPathElement', - 'title': 'SVGTitleElement', - 'tref': 'SVGElement', - 'tspan': 'SVGTSpanElement', - 'unknown': 'SVGElement', - 'use': 'SVGUseElement', - 'view': 'SVGViewElement', - 'vkern': 'SVGElement' -} - - def generate_html_elements(ctx, n): for i in range(n): tag = random.choice(list(_HTML_TYPES)) @@ -286,6 +58,12 @@ def add_html_ids(matchobj, ctx): ctx['htmlvars'].append({'name': varname, 'type': _SVG_TYPES[tagname]}) ctx['htmlvargen'] += '/* newvar{' + varname + ':' + _SVG_TYPES[tagname] + '} */ var ' + varname + ' = document.getElementById(\"' + varname + '\"); //' + _SVG_TYPES[tagname] + '\n' return matchobj.group(0) + 'id=\"' + varname + '\" ' + elif tagname in _MATHML_TYPES: + ctx['mathmlvarctr'] += 1 + varname = 'mathmlvar%05d' % ctx['mathmlvarctr'] + ctx['htmlvars'].append({'name': varname, 'type': _MATHML_TYPES[tagname]}) + ctx['htmlvargen'] += '/* newvar{' + varname + ':' + _MATHML_TYPES[tagname] + '} */ var ' + varname + ' = document.getElementById(\"' + varname + '\"); //' + _MATHML_TYPES[tagname] + '\n' + return matchobj.group(0) + 'id=\"' + varname + '\" ' else: return matchobj.group(0) @@ -304,7 +82,6 @@ def generate_function_body(jsgrammar, htmlctx, num_lines): def check_grammar(grammar): """Checks if grammar has errors and if so outputs them. - Args: grammar: The grammar to check. """ @@ -321,13 +98,11 @@ def check_grammar(grammar): def generate_new_sample(template, htmlgrammar, cssgrammar, jsgrammar): """Parses grammar rules from string. - Args: template: A template string. htmlgrammar: Grammar for generating HTML code. cssgrammar: Grammar for generating CSS code. jsgrammar: Grammar for generating JS code. - Returns: A string containing sample data. """ @@ -341,6 +116,7 @@ def generate_new_sample(template, htmlgrammar, cssgrammar, jsgrammar): 'htmlvars': [], 'htmlvarctr': 0, 'svgvarctr': 0, + 'mathmlvarctr': 0, 'htmlvargen': '' } html = re.sub( @@ -368,38 +144,34 @@ def generate_new_sample(template, htmlgrammar, cssgrammar, jsgrammar): return result - -def generate_samples(grammar_dir, outfiles): +def generate_samples(template, outfiles): """Generates a set of samples and writes them to the output files. - Args: grammar_dir: directory to load grammar files from. outfiles: A list of output filenames. """ - f = open(os.path.join(grammar_dir, 'template.html')) - template = f.read() - f.close() - + grammar_dir = os.path.join(os.path.dirname(__file__), 'rules') htmlgrammar = Grammar() + err = htmlgrammar.parse_from_file(os.path.join(grammar_dir, 'html.txt')) # CheckGrammar(htmlgrammar) if err > 0: - print('There were errors parsing grammar') + print('There were errors parsing html grammar') return cssgrammar = Grammar() - err = cssgrammar.parse_from_file(os.path.join(grammar_dir, 'css.txt')) + err = cssgrammar.parse_from_file(os.path.join(grammar_dir ,'css.txt')) # CheckGrammar(cssgrammar) if err > 0: - print('There were errors parsing grammar') + print('There were errors parsing css grammar') return jsgrammar = Grammar() - err = jsgrammar.parse_from_file(os.path.join(grammar_dir, 'js.txt')) + err = jsgrammar.parse_from_file(os.path.join(grammar_dir,'js.txt')) # CheckGrammar(jsgrammar) if err > 0: - print('There were errors parsing grammar') + print('There were errors parsing js grammar') return # JS and HTML grammar need access to CSS grammar. @@ -408,66 +180,68 @@ def generate_samples(grammar_dir, outfiles): jsgrammar.add_import('cssgrammar', cssgrammar) for outfile in outfiles: - result = generate_new_sample(template, htmlgrammar, cssgrammar, - jsgrammar) - + result = generate_new_sample(template, htmlgrammar, cssgrammar, jsgrammar) if result is not None: print('Writing a sample to ' + outfile) try: - f = open(outfile, 'w') - f.write(result) - f.close() + with open(outfile, 'w') as f: + f.write(result) except IOError: print('Error writing to output') +def get_argument_parser(): + + parser = argparse.ArgumentParser(description="DOMATO (A DOM FUZZER)") + + parser.add_argument("-f", "--file", + help="File name which is to be generated in the same directory") -def get_option(option_name): - for i in range(len(sys.argv)): - if (sys.argv[i] == option_name) and ((i + 1) < len(sys.argv)): - return sys.argv[i + 1] - elif sys.argv[i].startswith(option_name + '='): - return sys.argv[i][len(option_name) + 1:] - return None - - -def main(): - fuzzer_dir = os.path.dirname(__file__) - - multiple_samples = False + parser.add_argument('-o', '--output_dir', type=str, + help='The output directory to put the generated files in') - for a in sys.argv: - if a.startswith('--output_dir='): - multiple_samples = True + parser.add_argument('-n', '--no_of_files', type=int, + help='number of files to be generated') - if '--output_dir' in sys.argv: - multiple_samples = True + parser.add_argument('-t', '--template', type=Path, default=(Path(__file__).parent).joinpath('template.html'), + help='template file you want to use') + return parser - if multiple_samples: - print('Running on ClusterFuzz') - out_dir = get_option('--output_dir') - nsamples = int(get_option('--no_of_files')) - print('Output directory: ' + out_dir) - print('Number of samples: ' + str(nsamples)) +def main(): - if not os.path.exists(out_dir): - os.mkdir(out_dir) + parser = get_argument_parser() + + args = parser.parse_args() - outfiles = [] - for i in range(nsamples): - outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i) + '.html')) + with args.template.open("r") as f: + template = f.read() - generate_samples(fuzzer_dir, outfiles) + if args.file: + generate_samples(template, [args.file]) - elif len(sys.argv) > 1: - outfile = sys.argv[1] - generate_samples(fuzzer_dir, [outfile]) + elif args.output_dir: + if not args.no_of_files: + print("Please use switch -n to specify the number of files") + else: + print('Running on ClusterFuzz') + out_dir = args.output_dir + nsamples = args.no_of_files + print('Output directory: ' + out_dir) + print('Number of samples: ' + str(nsamples)) + + if not os.path.exists(out_dir): + os.mkdir(out_dir) + + outfiles = [] + for i in range(nsamples): + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) + + generate_samples(template, outfiles) + else: - print('Arguments missing') - print("Usage:") - print("\tpython generator.py ") - print("\tpython generator.py --output_dir --no_of_files ") + parser.print_help() if __name__ == '__main__': + main() diff --git a/grammar.py b/grammar.py index 07e3361..d0226a6 100755 --- a/grammar.py +++ b/grammar.py @@ -20,7 +20,10 @@ from __future__ import print_function import bisect -import cgi +try: + from html import escape as _escape +except ImportError: + from cgi import escape as _escape import os import random import re @@ -229,7 +232,7 @@ def _generate_string(self, tag): return ''.join(ret_list) def _generate_html_string(self, tag): - return cgi.escape(self._generate_string(tag), quote=True) + return _escape(self._generate_string(tag), quote=True) def _generate_hex(self, tag): """Generates a single hex digit.""" @@ -292,11 +295,6 @@ def _generate_code(self, num_lines, initial_variables=[], last_var=0): context = tmp_context except RecursionError as e: print('Warning: ' + str(e)) - for i in range(len(context['lines']) // 100): - context['lines'].insert( - random.randint(0, len(context['lines'])), - 'freememory();' - ) if not self._line_guard: guarded_lines = context['lines'] else: @@ -492,6 +490,8 @@ def _expand_rule(self, symbol, rule, context, context, '' ) + elif (part['tagname'] == 'any') and 'variables' in context: + expanded = self._get_any_var(context); else: try: expanded = self._generate( @@ -931,18 +931,23 @@ def _include_from_string(self, grammar_str): return num_errors def _include_from_file(self, filename): + filepath = os.path.join(self._definitions_dir, filename) try: - f = open(os.path.join( - os.path.dirname(os.path.abspath(__file__)), - filename - )) + f = open(filepath) content = f.read() f.close() except IOError: print('Error reading ' + filename) return 1 - self._definitions_dir = os.path.dirname(filename) - return self.parse_from_string(content) + + # we temporarily change the definitions dir to make it relative to the + # current file being parsed so that we can safely recursively + # include/import other files from it. + saved_definitions_dir = self._definitions_dir + self._definitions_dir = os.path.dirname(filepath) + errors = self.parse_from_string(content) + self._definitions_dir = saved_definitions_dir + return errors def parse_from_string(self, grammar_str): """Parses grammar rules from string. @@ -965,7 +970,7 @@ def parse_from_string(self, grammar_str): return 0 - def parse_from_file(self, filename): + def parse_from_file(self, filename, extra=None): """Parses grammar from file. Opens a text file, parses it and loads the grammar rules within. @@ -986,6 +991,10 @@ def parse_from_file(self, filename): print('Error reading ' + filename) return 1 self._definitions_dir = os.path.dirname(filename) + + if extra: + content = extra + content + return self.parse_from_string(content) def _compute_interesting_indices(self): @@ -1023,8 +1032,13 @@ def _add_variable(self, var_name, var_type, context): self._add_variable(var_name, parent_type, context) def _get_variable_setters(self, var_name, var_type): - ret = "SetVariable(" + var_name + ", '" + var_type + "'); " + ret = "SetVariable(fuzzervars, " + var_name + ", '" + var_type + "'); " if var_type in self._inheritance: for parent_type in self._inheritance[var_type]: ret += self._get_variable_setters(var_name, parent_type) return ret + + def _get_any_var(self, context): + var_type = random.choice(list(context['variables'].keys())) + return random.choice(context['variables'][var_type]) + diff --git a/html_tags.py b/html_tags.py new file mode 100644 index 0000000..37928ec --- /dev/null +++ b/html_tags.py @@ -0,0 +1,156 @@ +# Domato - HTML types +# -------------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# A map from tag name to corresponding type for HTML tags +_HTML_TYPES = { + 'a': 'HTMLAnchorElement', + 'abbr': 'HTMLUnknownElement', + 'acronym': 'HTMLUnknownElement', + 'address': 'HTMLUnknownElement', + 'applet': 'HTMLUnknownElement', + 'area': 'HTMLAreaElement', + 'article': 'HTMLUnknownElement', + 'aside': 'HTMLUnknownElement', + 'audio': 'HTMLAudioElement', + 'b': 'HTMLUnknownElement', + 'base': 'HTMLBaseElement', + 'basefont': 'HTMLUnknownElement', + 'bdi': 'HTMLUnknownElement', + 'bdo': 'HTMLUnknownElement', + 'bgsound': 'HTMLUnknownElement', + 'big': 'HTMLUnknownElement', + 'blockquote': 'HTMLUnknownElement', + 'br': 'HTMLBRElement', + 'button': 'HTMLButtonElement', + 'canvas': 'HTMLCanvasElement', + 'caption': 'HTMLTableCaptionElement', + 'center': 'HTMLUnknownElement', + 'cite': 'HTMLUnknownElement', + 'code': 'HTMLUnknownElement', + 'col': 'HTMLTableColElement', + 'colgroup': 'HTMLUnknownElement', + 'command': 'HTMLUnknownElement', + 'content': 'HTMLContentElement', + 'data': 'HTMLDataElement', + 'datalist': 'HTMLDataListElement', + 'dd': 'HTMLUnknownElement', + 'del': 'HTMLModElement', + 'details': 'HTMLDetailsElement', + 'dfn': 'HTMLUnknownElement', + 'dialog': 'HTMLDialogElement', + 'dir': 'HTMLDirectoryElement', + 'div': 'HTMLDivElement', + 'dl': 'HTMLDListElement', + 'dt': 'HTMLUnknownElement', + 'em': 'HTMLUnknownElement', + 'embed': 'HTMLEmbedElement', + 'fieldset': 'HTMLFieldSetElement', + 'figcaption': 'HTMLUnknownElement', + 'figure': 'HTMLUnknownElement', + 'font': 'HTMLFontElement', + 'footer': 'HTMLUnknownElement', + 'form': 'HTMLFormElement', + 'frame': 'HTMLFrameElement', + 'frameset': 'HTMLFrameSetElement', + 'h1': 'HTMLHeadingElement', + 'h2': 'HTMLHeadingElement', + 'h3': 'HTMLHeadingElement', + 'h4': 'HTMLHeadingElement', + 'h5': 'HTMLHeadingElement', + 'h6': 'HTMLHeadingElement', + 'header': 'HTMLUnknownElement', + 'hgroup': 'HTMLUnknownElement', + 'hr': 'HTMLHRElement', + 'i': 'HTMLUnknownElement', + 'iframe': 'HTMLIFrameElement', + 'image': 'HTMLImageElement', + 'img': 'HTMLImageElement', + 'input': 'HTMLInputElement', + 'ins': 'HTMLModElement', + 'isindex': 'HTMLUnknownElement', + 'kbd': 'HTMLUnknownElement', + 'keygen': 'HTMLKeygenElement', + 'label': 'HTMLLabelElement', + 'layer': 'HTMLUnknownElement', + 'legend': 'HTMLLegendElement', + 'li': 'HTMLLIElement', + 'link': 'HTMLLinkElement', + 'listing': 'HTMLUnknownElement', + 'main': 'HTMLUnknownElement', + 'map': 'HTMLMapElement', + 'mark': 'HTMLUnknownElement', + 'marquee': 'HTMLMarqueeElement', + 'menu': 'HTMLMenuElement', + 'menuitem': 'HTMLMenuItemElement', + 'meta': 'HTMLMetaElement', + 'meter': 'HTMLMeterElement', + 'nav': 'HTMLUnknownElement', + 'nobr': 'HTMLUnknownElement', + 'noembed': 'HTMLUnknownElement', + 'noframes': 'HTMLUnknownElement', + 'nolayer': 'HTMLUnknownElement', + 'noscript': 'HTMLUnknownElement', + 'object': 'HTMLObjectElement', + 'ol': 'HTMLOListElement', + 'optgroup': 'HTMLOptGroupElement', + 'option': 'HTMLOptionElement', + 'output': 'HTMLOutputElement', + 'p': 'HTMLParagraphElement', + 'param': 'HTMLParamElement', + 'picture': 'HTMLPictureElement', + 'plaintext': 'HTMLUnknownElement', + 'pre': 'HTMLPreElement', + 'progress': 'HTMLProgressElement', + 'q': 'HTMLQuoteElement', + 'rp': 'HTMLUnknownElement', + 'rt': 'HTMLUnknownElement', + 'ruby': 'HTMLUnknownElement', + 's': 'HTMLUnknownElement', + 'samp': 'HTMLUnknownElement', + 'section': 'HTMLUnknownElement', + 'select': 'HTMLSelectElement', + 'shadow': 'HTMLShadowElement', + 'small': 'HTMLUnknownElement', + 'source': 'HTMLSourceElement', + 'span': 'HTMLSpanElement', + 'strike': 'HTMLUnknownElement', + 'strong': 'HTMLUnknownElement', + 'style': 'HTMLStyleElement', + 'sub': 'HTMLUnknownElement', + 'summary': 'HTMLUnknownElement', + 'sup': 'HTMLUnknownElement', + 'table': 'HTMLTableElement', + 'tbody': 'HTMLTableSectionElement', + 'td': 'HTMLUnknownElement', + 'template': 'HTMLTemplateElement', + 'textarea': 'HTMLTextAreaElement', + 'tfoot': 'HTMLTableSectionElement', + 'th': 'HTMLTableCellElement', + 'thead': 'HTMLTableSectionElement', + 'time': 'HTMLTimeElement', + 'title': 'HTMLTitleElement', + 'tr': 'HTMLTableRowElement', + 'track': 'HTMLTrackElement', + 'tt': 'HTMLUnknownElement', + 'u': 'HTMLUnknownElement', + 'ul': 'HTMLUListElement', + 'var': 'HTMLUnknownElement', + 'video': 'HTMLVideoElement', + 'wbr': 'HTMLUnknownElement', + 'xmp': 'HTMLUnknownElement' +} diff --git a/jscript/generator.py b/jscript/generator.py index 58bbab5..b63487f 100755 --- a/jscript/generator.py +++ b/jscript/generator.py @@ -136,7 +136,7 @@ def main(): outfiles = [] for i in range(nsamples): - outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i) + '.html')) + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) generate_samples(fuzzer_dir, outfiles) diff --git a/mathml/mathattrvalues.txt b/mathml3_legacy/mathattrvalues.txt similarity index 100% rename from mathml/mathattrvalues.txt rename to mathml3_legacy/mathattrvalues.txt diff --git a/mathml/mathml.txt b/mathml3_legacy/mathml.txt similarity index 99% rename from mathml/mathml.txt rename to mathml3_legacy/mathml.txt index d0edbd3..1aaa32a 100644 --- a/mathml/mathml.txt +++ b/mathml3_legacy/mathml.txt @@ -11,7 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -!include common.txt +!include ../rules/common.txt !include mathattrvalues.txt !max_recursion 50 diff --git a/mathml/test.py b/mathml3_legacy/test.py similarity index 100% rename from mathml/test.py rename to mathml3_legacy/test.py diff --git a/mathml_tags.py b/mathml_tags.py new file mode 100644 index 0000000..be1910a --- /dev/null +++ b/mathml_tags.py @@ -0,0 +1,52 @@ +# Domato - MathML types +# -------------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# A map from tag name to corresponding type for MathML tags +_MATHML_TYPES = { + 'annotation': 'MathMLElement', + 'annotation-xml': 'MathMLElement', + 'maction': 'MathMLElement', + 'math': 'MathMLElement', + 'merror': 'MathMLElement', + 'mfrac': 'MathMLElement', + 'mi': 'MathMLElement', + 'mmultiscripts': 'MathMLElement', + 'mn': 'MathMLElement', + 'mo': 'MathMLElement', + 'mover': 'MathMLElement', + 'mpadded': 'MathMLElement', + 'mphantom': 'MathMLElement', + 'mprescripts': 'MathMLElement', + 'mroot': 'MathMLElement', + 'mrow': 'MathMLElement', + 'ms': 'MathMLElement', + 'mspace': 'MathMLElement', + 'msqrt': 'MathMLElement', + 'mstyle': 'MathMLElement', + 'msub': 'MathMLElement', + 'msubsup': 'MathMLElement', + 'msup': 'MathMLElement', + 'mtable': 'MathMLElement', + 'mtd': 'MathMLElement', + 'mtext': 'MathMLElement', + 'mtr': 'MathMLElement', + 'munder': 'MathMLElement', + 'munderover': 'MathMLElement', + 'none': 'MathMLElement', + 'semantics': 'MathMLelement' +} diff --git a/php/README.md b/php/README.md new file mode 100644 index 0000000..8119859 --- /dev/null +++ b/php/README.md @@ -0,0 +1,17 @@ +The `php_generated.txt` file was generated by running `parse_types.py` on the +source code of php. + +Possible improvements: +- Callbacks are currently unused (`` always point to `phpinfo`). + Generating callback code in a similar manner to the main function could + potentially expose additional bugs, especially if callbacks get access to the + same variables / can mess up stuff that the caller didn't expect. +- Currently, the return values from the function / method calls are ignored. + In cases where function / method calls return non-trivial types, it be better + to store these return values in variables and use them as function arguments + in later calls or potentially call methods on these "generated" objects. +- It would be great to be able to infer the expected classes of the objects + parameters taken by functions/methods. +- The `parse_type.py` code is ugly, and should be refactored a bit. +- Randomize the references (`$ref_` in template.php). + diff --git a/php/generator.py b/php/generator.py new file mode 100755 index 0000000..c6b159f --- /dev/null +++ b/php/generator.py @@ -0,0 +1,142 @@ +# Domato - main generator script +# ------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import print_function +import os +import re +import random +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) +sys.path.append(parent_dir) +from grammar import Grammar + +_N_MAIN_LINES = 1000 +_N_EVENTHANDLER_LINES = 500 + + +def generate_new_sample(template, phpgrammar): + """Parses grammar rules from string. + + Args: + template: A template string. + phpgrammar: Grammar for generating PHPcode. + + Returns: + A string containing sample data. + """ + + result = template + handlers = False + while '' in result: + numlines = _N_MAIN_LINES + if handlers: + numlines = _N_EVENTHANDLER_LINES + else: + handlers = True + result = result.replace( + '', + phpgrammar._generate_code(numlines), + 1 + ) + + return result + + +def generate_samples(grammar_dir, outfiles): + """Generates a set of samples and writes them to the output files. + + Args: + grammar_dir: directory to load grammar files from. + outfiles: A list of output filenames. + """ + + f = open(os.path.join(grammar_dir, 'template.php')) + template = f.read() + f.close() + + phpgrammar = Grammar() + err = phpgrammar.parse_from_file(os.path.join(grammar_dir, 'php.txt')) + if err > 0: + print('There were errors parsing grammar') + return + + for outfile in outfiles: + result = generate_new_sample(template, phpgrammar) + + if result is not None: + print('Writing a sample to ' + outfile) + try: + f = open(outfile, 'w') + f.write(result) + f.close() + except IOError: + print('Error writing to output') + + +def get_option(option_name): + for i in range(len(sys.argv)): + if (sys.argv[i] == option_name) and ((i + 1) < len(sys.argv)): + return sys.argv[i + 1] + elif sys.argv[i].startswith(option_name + '='): + return sys.argv[i][len(option_name) + 1:] + return None + + +def main(): + fuzzer_dir = os.path.dirname(__file__) + + multiple_samples = False + + for a in sys.argv: + if a.startswith('--output_dir='): + multiple_samples = True + + if '--output_dir' in sys.argv: + multiple_samples = True + + if multiple_samples: + print('Running on ClusterFuzz') + out_dir = get_option('--output_dir') + nsamples = int(get_option('--no_of_files')) + print('Output directory: ' + out_dir) + print('Number of samples: ' + str(nsamples)) + + if not os.path.exists(out_dir): + os.mkdir(out_dir) + + outfiles = [] + for i in range(nsamples): + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.php')) + + generate_samples(fuzzer_dir, outfiles) + + elif len(sys.argv) > 1: + outfile = sys.argv[1] + generate_samples(fuzzer_dir, [outfile]) + + else: + print('Arguments missing') + print("Usage:") + print("\tpython generator.py ") + print("\tpython generator.py --output_dir --no_of_files ") + + +if __name__ == '__main__': + main() diff --git a/php/parse_types.py b/php/parse_types.py new file mode 100644 index 0000000..574b15a --- /dev/null +++ b/php/parse_types.py @@ -0,0 +1,175 @@ +import glob +import re +import sys + +fun = re.compile(r"PHP_FUNCTION\((.+)\)") +met = re.compile(r"PHP_METHOD\(([^,]+), (.+)\)") +ftype = re.compile(r'zend_parse_parameters\([^,]+, "(.+)"') + +in_func = False +in_meth = False +func = meth = obj = None +objs = set() + + +if len(sys.argv) != 2: + print('Usage: %s /path/to/php/source/code' % sys.argv[0]) + sys.exit(1) + +def l2f(fun, params): + in_or = False + p = [] + for param in params: + if param in ['i', 'I']: + p.append('') + if param in ['l', 'L', 'n', 'd']: + p.append('') + elif param in ['z', 'Z']: + p.append('') + elif param in ['s', 'v', 'S']: + p.append('') + elif param in ['|']: + in_or = True + continue + elif param in ['p', 'P']: + p.append('') + elif param in ['!', '/']: + continue + elif param in ['a', 'A', 'h', 'H']: + p.append('') + elif param in ['b']: + p.append('') + elif param in ['C']: + p.append('') + elif param in ['f']: + p.append('') + elif param in ['o', 'O']: + p.append('') + elif param in ['r']: + p.append('') + if in_or is True: + if in_func: + print(" = %s(%s)" % (func, ', '.join(p))) + elif in_meth: + print(" = ->%s(%s)" % (obj, meth, ', '.join(p))) + if in_or is False: + if in_func: + print(" = %s(%s)" % (func, ', '.join(p))) + elif in_meth: + print(" = ->%s(%s)" % (obj, meth, ', '.join(p))) + +for fname in glob.glob(sys.argv[1] + '*/*/*.c'): + with open(fname) as f: + in_params = False + in_or = False + params = [] + + for line in f.readlines(): + if in_func is False and in_meth is False: + func = fun.search(line) + if func: + in_func = True + func = func.group(1) + continue + r = met.search(line) + if r: + in_meth = True + obj = r.group(1) + objs.add(obj) + meth = r.group(2) + continue + + if 'ZEND_PARSE_PARAMETERS_NONE' in line: + print(" = %s()" % (func if func else meth)) + elif 'ZEND_PARSE_PARAMETERS_END' in line: + if in_func: + print(" = %s(%s)" % (func, ', '.join(params))) + params = [] + in_params = False + in_or = False + elif in_meth: + print(" = ->%s(%s)" % (obj, meth, ', '.join(params))) + params = [] + in_params = False + in_or = False + continue + elif 'ZEND_PARSE_PARAMETERS_START' in line: + in_params = True + params = [] + continue + + if in_or is True: + if in_func: + print(" = %s(%s)" % (func, ', '.join(params))) + elif in_meth: + print(" = ->%s(%s)" % (obj, meth, ', '.join(params))) + + if in_params is True: + if 'Z_PARAM_OPTIONAL' in line: + in_or = True + elif 'Z_PARAM_OBJECT_OF_CLASS' in line: + params.append('') + elif 'Z_PARAM_STR_OR_OBJ' in line: + params.append('') + elif 'Z_PARAM_STR_OR_ARRAY' in line: + params.append('') + elif 'Z_PARAM_STR_OR_LONG' in line: + params.append('') + elif 'Z_PARAM_OPTIONAL' in line: + in_or = True + continue + elif 'Z_PARAM_LONG' in line or 'Z_PARAM_LONG_OR_NULL' in line: + params.append("") + elif 'Z_PARAM_ARRAY_OR_OBJECT' in line: + params.append("") + elif 'Z_PARAM_ARRAY' in line: + params.append("") + elif 'Z_PARAM_OBJ' in line: + params.append("") + elif 'Z_PARAM_ZVAL' in line: + params.append('') + elif 'Z_PARAM_BOOL' in line: + params.append('') + elif 'Z_PARAM_CLASS' in line: + params.append('') + elif 'Z_PARAM_CLASS_OR_OBJ' in line: + params.append('') + elif 'Z_PARAM_RESOURCE' in line: + params.append('') + elif 'Z_PARAM_PATH' in line: + params.append('') + elif 'Z_PARAM_NUMBER' in line: + params.append('') + elif 'Z_PARAM_FUNC' in line: + params.append('') + elif 'Z_PARAM_DOUBLE' in line: + params.append('') + elif 'Z_PARAM_PATH' in line: + params.append('') + elif 'Z_PARAM_VARIADIC' in line: + params.append('') + elif 'Z_PARAM_STR' in line: + params.append('') + elif '_OR_' in line: + params.append('') + else: + print('err:' + line) + + + p = ftype.search(line) + if p: + l2f(func, p.group(1)) + in_func = False + in_meth = False + in_params = False + in_or = False + elif line.startswith('}') or "/* }}} */" in line: + in_func = False + in_meth = False + in_params = False + in_or = False + +print("\n") +for obj in objs: + print(' = $vars["%s"]' % (obj, obj)) + diff --git a/php/php.txt b/php/php.txt new file mode 100644 index 0000000..c9ee691 --- /dev/null +++ b/php/php.txt @@ -0,0 +1,203 @@ + = + +!lineguard try { } catch (Throwable $e) { } + + = + + = true + = false + + = 32768 + = 65535 + = 65536 + = 1073741824 + = 536870912 + = 268435456 + = 4294967295 + = 2147483648 + = 2147483647 + = -2147483648 + = -1073741824 + = -32769 + + = 536870911 + = 536870912 + = 1073741823 + = 1073741824 + = 2147483647 + = 2147483648 + = 4294967295 + = 4294967296 + = 18446744073709551615 + = 18446744073709551616 + + + = 0 + = 1 + = -1 + = 2 + = 3 + = 4 + = 5 + = 10 + = 100 + = 1000 + = 1000000 + = + = + = - + = + + = + = + = + + = str_repeat("A", 0x100) + = implode(array_map(function($c) {return "\\x" . str_pad(dechex($c), 2, "0");}, range(0, 255))) + = str_repeat("%s%x%n", 0x100) + = + = . + = . . +# = "" + = str_repeat(chr(), ) + = 17 + = 65 + = 257 + = 1025 + = 4097 + = 65537 + + = + = "/dev/null" + = "/../../../../../../../../../etc/passwd" + + = range(0, 10) + = array("a" => 1, "b" => "2", "c" => 3.0) + + = phpinfo + + = $vars[array_rand($vars)] + + = + = + + = array_rand($vars) + + = + = () + + = + = + + = + = + + = + = + + = + = + = + = + + = + = , + = , , + = , , , + = , , , , + + = $ref_bool + = $ref_int + = $ref_string + = $ref_array + = $ref_object + = $ref_resource + = $ref_path + + = + = + = + = + = + = + = + + = + = + + = + = + + = new ArrayIterator(array(0)) + + = fopen("/dev/null", "r") + = fopen("/etc/passwd", "r") + = fopen("/tmp/doesntexist", "w") + + = new DateTime() + = new DateTimeZone("America/Chicago") + = new DateTimeImmutable() + = new DateInterval("P2Y4DT6H8M") + = new DateTime() + + = new DOMNode() + = new DOMAttr("attr") + = new DOMDocument() + = new DOMDocumentType() + = new DOMElement("root") + = new DOMNodeList() + = new DOMDocumentFragment() + = new DOMText() + = new DOMCDATASection("root value") + = new DOMProcessingInstruction("php", "phpinfo()") + = new DOMEntityReference("nbsp") + = new DOMComment() + + = new RecursiveIterator() + + = new SplObjectStorage() + = new SplFixedArray() + + = new ReflectionClass("ZipArchive") + = new ReflectionClass($vars[array_rand($vars)]) + = new ReflectionClassConstant("ZipArchive", "ZIP_ER_OK") + = new ReflectionType() + = new ReflectionFunctionAbstract() + = new ReflectionExtension("Reflection") + = new ReflectionProperty("ZipArchive", "filename") + = new ReflectionMethod("ZipArchive", "getStatusString") + + = new ArrayIterator(array(0)) + + = new Exception() + + = hash_init("md5") + + = new SimpleXMLElement("aa/a") + = new SimpleXMLIterator("aa/a") + + = new Phar("/tmp/fuzz.phar") + = new PharData("/tmp/fuzz.tar")) + + = new RecursiveFilterIterator(new RecursiveIterator()) + + = dir("/tmp") + + = function () { return 0; } + + = (function () { yield 0; })() + +!include ./php_generated.txt + +### OTHER + + = ; + = ; + +### LINES + +!begin lines + + + +!end lines diff --git a/php/php_generated.txt b/php/php_generated.txt new file mode 100644 index 0000000..2344ccf --- /dev/null +++ b/php/php_generated.txt @@ -0,0 +1,2438 @@ + = phpdbg_exec() + = phpdbg_break_file(, ) + = phpdbg_break_method(, ) + = phpdbg_break_function() + = phpdbg_color(, ) + = phpdbg_prompt() + = phpdbg_get_executable() + = phpdbg_end_oplog() + = virtual() + = apache_lookup_uri() + = apache_note(, ) + = apache_setenv(, , ) + = apache_getenv(, ) + = cli_set_process_title() + = stream_wrapper_register(, , ) + = stream_wrapper_unregister() + = stream_wrapper_restore() + = curl_share_init() + = curl_share_close() + = curl_share_setopt(, , ) + = curl_share_errno() + = curl_share_strerror() + = curl_multi_init() + = curl_multi_add_handle(, ) + = curl_multi_remove_handle(, ) + = curl_multi_select() + = curl_multi_select(, ) + = curl_multi_exec(, ) + = curl_multi_getcontent() + = curl_multi_info_read() + = curl_multi_info_read(, ) + = curl_multi_close() + = curl_multi_errno() + = curl_multi_strerror() + = curl_multi_setopt(, , ) + = curl_version() + = curl_init() + = curl_init() + = curl_copy_handle() + = curl_setopt(, , ) + = curl_setopt_array(, ) + = curl_exec() + = curl_getinfo() + = curl_getinfo(, ) + = curl_error() + = curl_errno() + = curl_close() + = curl_strerror() + = curl_reset() + = curl_escape(, ) + = curl_unescape(, ) + = curl_pause(, ) + = ->__construct(, ) + = ->__construct(, ) + = ->registerNamespace(, ) + = ->registerPhpFunctions() + = ->registerPhpFunctions() + = dom_import_simplexml() + = ->getNamedItem() + = ->item() + = ->getNamedItemNS(, ) + = ->item() + = ->insertBefore(, ) + = ->replaceChild(, ) + = ->removeChild() + = ->appendChild() + = ->cloneNode() + = ->isSupported(, ) + = ->isSameNode() + = ->lookupPrefix() + = ->isDefaultNamespace() + = ->lookupNamespaceURI() + = ->appendXML() + = ->append() + = ->prepend() + = ->__construct() + = ->splitText() + = ->hasFeature(, ) + = ->createDocumentType(, ) + = ->createDocumentType(, , ) + = ->createDocument() + = ->createDocument(, ) + = ->createDocument(, , ) + = ->getFeature(, ) + = ->__construct(, ) + = ->__construct() + = ->__construct(, ) + = ->__construct(, , ) + = ->getAttribute() + = ->setAttribute(, ) + = ->removeAttribute() + = ->getAttributeNode() + = ->setAttributeNode() + = ->removeAttributeNode() + = ->getElementsByTagName() + = ->getAttributeNS(, ) + = ->setAttributeNS(, , ) + = ->removeAttributeNS(, ) + = ->getAttributeNodeNS(, ) + = ->setAttributeNodeNS() + = ->getElementsByTagNameNS(, ) + = ->hasAttribute() + = ->hasAttributeNS(, ) + = ->setIdAttribute(, ) + = ->setIdAttributeNS(, , ) + = ->setIdAttributeNode(, ) + = ->after() + = ->before() + = ->append() + = ->prepend() + = ->replaceWith() + = ->substringData(, ) + = ->appendData() + = ->insertData(, ) + = ->deleteData(, ) + = ->replaceData(, , ) + = ->after() + = ->before() + = ->replaceWith() + = ->__construct() + = ->__construct() + = ->createElement(, ) + = ->createTextNode() + = ->createComment() + = ->createCDATASection() + = ->createProcessingInstruction(, ) + = ->createAttribute() + = ->createEntityReference() + = ->getElementsByTagName() + = ->importNode(, ) + = ->createElementNS(, , ) + = ->createAttributeNS(, ) + = ->getElementsByTagNameNS(, ) + = ->getElementById() + = ->adoptNode() + = ->__construct() + = ->__construct(, ) + = ->save(, ) + = ->saveXML() + = ->saveXML(, ) + = ->xinclude() + = ->saveHTMLFile() + = ->registerNodeClass(, ) + = ->append() + = ->prepend() + = sem_get(, ) + = sem_get(, , ) + = sem_get(, , , ) + = sem_remove() + = finfo_open() + = finfo_open(, ) + = finfo_close() + = finfo_set_flags() + = hrtime() + = hrtime() + = get_browser() + = get_browser() + = get_browser(, ) + = getrusage() + = getrusage() + = chroot() + = chdir() + = getcwd() + = glob() + = glob(, ) + = scandir() + = scandir(, ) + = scandir(, , ) + = image_type_to_mime_type() + = image_type_to_extension() + = image_type_to_extension(, ) + = soundex() + = bin2hex() + = hex2bin() + = nl_langinfo() + = strcoll(, ) + = wordwrap() + = wordwrap(, ) + = wordwrap(, , ) + = wordwrap(, , , ) + = explode(, ) + = explode(, , ) + = implode() + = implode(, ) + = strtok() + = strtok(, ) + = strtoupper() + = strtolower() + = basename() + = basename(, ) + = dirname() + = dirname(, ) + = pathinfo() + = pathinfo(, ) + = stristr(, ) + = stristr(, , ) + = strstr(, ) + = strstr(, , ) + = str_contains(, ) + = str_starts_with(, ) + = str_ends_with(, ) + = strpos(, ) + = strpos(, , ) + = stripos(, ) + = stripos(, , ) + = strrpos(, ) + = strrpos(, , ) + = strripos(, ) + = strripos(, , ) + = strrchr(, ) + = chunk_split() + = chunk_split(, ) + = chunk_split(, , ) + = substr(, ) + = substr(, , ) + = substr_replace(, , ) + = substr_replace(, , , ) + = quotemeta() + = ord() + = chr() + = ucfirst() + = lcfirst() + = ucwords() + = ucwords(, ) + = strtr(, ) + = strtr(, , ) + = strrev() + = similar_text(, ) + = similar_text(, , ) + = addcslashes(, ) + = addslashes() + = stripcslashes() + = stripslashes() + = hebrev() + = hebrev(, ) + = nl2br() + = nl2br(, ) + = strip_tags() + = strip_tags(, ) + = setlocale(, ) + = parse_str(, ) + = str_getcsv() + = str_getcsv(, ) + = str_getcsv(, , ) + = str_getcsv(, , , ) + = str_repeat(, ) + = count_chars() + = count_chars(, ) + = localeconv() + = substr_count(, ) + = substr_count(, , ) + = substr_count(, , , ) + = str_pad(, ) + = str_pad(, , ) + = str_pad(, , , ) + = sscanf(, , ) + = str_rot13() + = str_shuffle() + = str_word_count() + = str_word_count(, ) + = str_word_count(, , ) + = str_split() + = str_split(, ) + = strpbrk(, ) + = substr_compare(, , ) + = substr_compare(, , , ) + = substr_compare(, , , , ) + = utf8_encode() + = utf8_decode() + = quoted_printable_decode() + = quoted_printable_encode() + = dns_get_mx(, , ) + = dns_check_record(, ) + = dns_get_record(, ) + = dns_get_record(, , ) + = dns_get_record(, , , ) + = dns_get_record(, , , , ) + = disk_total_space() + = disk_free_space() + = chmod(, ) + = touch() + = touch(, ) + = touch(, , ) + = clearstatcache() + = clearstatcache() + = clearstatcache(, ) + = realpath_cache_size() + = realpath_cache_get() + = krsort() + = krsort(, ) + = ksort() + = ksort(, ) + = count() + = count(, ) + = asort() + = asort(, ) + = arsort() + = arsort(, ) + = sort() + = sort(, ) + = rsort() + = rsort(, ) + = end() + = prev() + = next() + = reset() + = current() + = key() + = min() + = max() + = array_walk(, ) + = array_walk(, , ) + = array_walk_recursive(, ) + = array_walk_recursive(, , ) + = extract() + = extract(, ) + = extract(, , ) + = compact() + = array_fill(, , ) + = array_fill_keys(, ) + = range(, ) + = range(, , ) + = shuffle() + = array_push(, ) + = array_pop() + = array_shift() + = array_unshift(, ) + = array_splice(, ) + = array_splice(, , ) + = array_splice(, , , ) + = array_slice(, ) + = array_slice(, , ) + = array_slice(, , , ) + = array_keys() + = array_keys(, ) + = array_keys(, , ) + = array_key_first() + = array_key_last() + = array_values() + = array_count_values() + = array_column(, ) + = array_column(, , ) + = array_reverse() + = array_reverse(, ) + = array_pad(, , ) + = array_flip() + = array_change_key_case() + = array_change_key_case(, ) + = array_unique() + = array_unique(, ) + = array_diff() + = array_multisort() + = array_rand() + = array_rand(, ) + = array_sum() + = array_product() + = array_reduce(, ) + = array_reduce(, , ) + = array_filter() + = array_filter(, ) + = array_filter(, , ) + = array_map(, ) + = array_key_exists(, ) + = array_chunk(, ) + = array_chunk(, , ) + = array_combine(, ) + = proc_terminate() + = proc_terminate(, ) + = proc_close() + = proc_get_status() + = proc_open(, , ) + = proc_open(, , , ) + = proc_open(, , , , ) + = proc_open(, , , , , ) + = uniqid() + = uniqid() + = uniqid(, ) + = strptime(, ) + = stream_socket_pair(, , ) + = stream_socket_client() + = stream_socket_client(, ) + = stream_socket_client(, , ) + = stream_socket_client(, , , ) + = stream_socket_client(, , , , ) + = stream_socket_client(, , , , , ) + = stream_socket_server() + = stream_socket_server(, ) + = stream_socket_server(, , ) + = stream_socket_server(, , , ) + = stream_socket_server(, , , , ) + = stream_socket_accept() + = stream_socket_accept(, ) + = stream_socket_accept(, , ) + = stream_socket_get_name(, ) + = stream_socket_sendto(, ) + = stream_socket_sendto(, , ) + = stream_socket_sendto(, , , ) + = stream_socket_recvfrom(, ) + = stream_socket_recvfrom(, , ) + = stream_socket_recvfrom(, , , ) + = stream_get_contents() + = stream_get_contents(, ) + = stream_get_contents(, , ) + = stream_copy_to_stream(, ) + = stream_copy_to_stream(, , ) + = stream_copy_to_stream(, , , ) + = stream_get_meta_data() + = stream_get_transports() + = stream_get_wrappers() + = stream_select(, , , ) + = stream_select(, , , , ) + = stream_context_get_options() + = stream_context_set_option(, ) + = stream_context_set_option(, , , ) + = stream_context_set_params(, ) + = stream_context_get_params() + = stream_context_get_default() + = stream_context_get_default() + = stream_context_set_default() + = stream_context_create() + = stream_context_create() + = stream_context_create(, ) + = stream_filter_remove() + = stream_get_line(, ) + = stream_get_line(, , ) + = stream_set_blocking(, ) + = stream_set_timeout(, ) + = stream_set_timeout(, , ) + = stream_set_write_buffer(, ) + = stream_set_chunk_size(, ) + = stream_set_read_buffer(, ) + = stream_socket_enable_crypto(, ) + = stream_socket_enable_crypto(, , ) + = stream_socket_enable_crypto(, , , ) + = stream_resolve_include_path() + = stream_is_local() + = stream_supports_lock() + = stream_isatty() + = sapi_windows_vt100_support() + = sapi_windows_vt100_support(, ) + = stream_socket_shutdown(, ) + = sprintf(, ) + = vsprintf(, ) + = printf(, ) + = vprintf(, ) + = fprintf(, , ) + = vfprintf(, , ) + = ->filter(, , , ) + = onCreate() + = onClose() + = stream_bucket_make_writeable() + = stream_bucket_new(, ) + = stream_get_filters() + = stream_filter_register(, ) + = http_build_query() + = http_build_query(, ) + = http_build_query(, , ) + = http_build_query(, , , ) + = escapeshellcmd() + = escapeshellarg() + = shell_exec() + = proc_nice() + = header() + = header(, ) + = header(, , ) + = header_remove() + = header_remove() + = setcookie() + = setcookie(, ) + = setcookie(, , ) + = setcookie(, , , ) + = setcookie(, , , , ) + = setcookie(, , , , , ) + = setcookie(, , , , , , ) + = setrawcookie() + = setrawcookie(, ) + = setrawcookie(, , ) + = setrawcookie(, , , ) + = setrawcookie(, , , , ) + = setrawcookie(, , , , , ) + = setrawcookie(, , , , , , ) + = headers_sent() + = headers_sent() + = headers_sent(, ) + = headers_list() + = http_response_code() + = http_response_code() + = constant() + = inet_ntop() + = inet_pton() + = ip2long() + = long2ip() + = getenv() + = getenv() + = getenv(, ) + = putenv() + = getopt() + = getopt(, ) + = getopt(, , ) + = flush() + = sleep() + = usleep() + = time_nanosleep(, ) + = time_sleep_until() + = get_current_user() + = get_cfg_var() + = error_log() + = error_log(, ) + = error_log(, , ) + = error_log(, , , ) + = error_get_last() + = error_clear_last() + = call_user_func(, ) + = call_user_func_array(, ) + = forward_static_call(, ) + = forward_static_call_array(, ) + = highlight_file() + = highlight_file(, ) + = php_strip_whitespace() + = highlight_string() + = highlight_string(, ) + = ini_get() + = ini_get_all() + = ini_get_all() + = ini_get_all(, ) + = ini_set(, ) + = ini_restore() + = set_include_path() + = get_include_path() + = print_r() + = print_r(, ) + = connection_aborted() + = connection_status() + = ignore_user_abort() + = ignore_user_abort() + = getservbyname(, ) + = getservbyport(, ) + = getprotobyname() + = getprotobynumber() + = unregister_tick_function() + = is_uploaded_file() + = move_uploaded_file(, ) + = parse_ini_file() + = parse_ini_file(, ) + = parse_ini_file(, , ) + = parse_ini_string() + = parse_ini_string(, ) + = parse_ini_string(, , ) + = config_get_hash() + = sys_getloadavg() + = pack(, ) + = unpack(, ) + = unpack(, , ) + = mail(, , ) + = mail(, , , ) + = mail(, , , , ) + = crc32() + = md5() + = md5(, ) + = md5_file() + = md5_file(, ) + = dl() + = htmlspecialchars_decode() + = htmlspecialchars_decode(, ) + = html_entity_decode() + = html_entity_decode(, ) + = html_entity_decode(, , ) + = get_html_translation_table() + = get_html_translation_table() + = get_html_translation_table(, ) + = get_html_translation_table(, , ) + = crypt() + = crypt(, ) + = gettype() + = get_debug_type() + = settype(, ) + = intval() + = intval(, ) + = floatval() + = boolval() + = strval() + = is_bool() + = is_numeric() + = is_scalar() + = is_callable() + = is_callable(, ) + = is_callable(, , ) + = is_iterable() + = is_countable() + = net_get_interfaces() + = net_get_interfaces() + = sha1() + = sha1(, ) + = sha1_file() + = sha1_file(, ) + = levenshtein(, , ) + = levenshtein(, , , ) + = levenshtein(, , , , ) + = abs() + = ceil() + = floor() + = round() + = round(, ) + = round(, , ) + = sin() + = cos() + = tan() + = asin() + = acos() + = atan() + = atan2(, ) + = sinh() + = cosh() + = tanh() + = asinh() + = acosh() + = atanh() + = pi() + = is_finite() + = is_infinite() + = is_nan() + = pow(, ) + = exp() + = expm1() + = log1p() + = log() + = log(, ) + = log10() + = sqrt() + = hypot(, ) + = deg2rad() + = rad2deg() + = bindec() + = hexdec() + = octdec() + = decbin() + = decoct() + = dechex() + = base_convert(, , ) + = number_format() + = number_format(, ) + = number_format(, , ) + = number_format(, , , ) + = fmod(, ) + = fdiv(, ) + = intdiv(, ) + = password_get_info() + = password_needs_rehash(, ) + = password_needs_rehash(, , ) + = password_verify(, ) + = password_hash(, ) + = password_hash(, , ) + = password_algos() + = assert() + = assert(, ) + = assert_options() + = assert_options(, ) + = gethostname() + = gethostbyaddr() + = gethostbyname() + = gethostbynamel() + = dns_check_record() + = dns_check_record(, ) + = dns_get_record() + = dns_get_record(, ) + = dns_get_record(, , ) + = dns_get_record(, , , ) + = dns_get_record(, , , , ) + = dns_get_mx(, ) + = dns_get_mx(, , ) + = mt_srand() + = mt_srand() + = mt_srand(, ) + = mt_rand(, ) + = mt_getrandmax() + = flock(, ) + = flock(, , ) + = get_meta_tags() + = get_meta_tags(, ) + = file_get_contents() + = file_get_contents(, ) + = file_get_contents(, , ) + = file_get_contents(, , , ) + = file_get_contents(, , , , ) + = file_put_contents(, ) + = file_put_contents(, , ) + = file_put_contents(, , , ) + = file() + = file(, ) + = file(, , ) + = tempnam(, ) + = tmpfile() + = fopen(, ) + = fopen(, , ) + = fopen(, , , ) + = fclose() + = popen(, ) + = pclose() + = feof() + = fgets() + = fgets(, ) + = fgetc() + = fscanf(, , ) + = fwrite(, ) + = fwrite(, , ) + = fflush() + = rewind() + = ftell() + = fseek(, ) + = fseek(, , ) + = mkdir() + = mkdir(, ) + = mkdir(, , ) + = mkdir(, , , ) + = rmdir() + = rmdir(, ) + = readfile() + = readfile(, ) + = readfile(, , ) + = umask() + = umask() + = fpassthru() + = rename(, ) + = rename(, , ) + = unlink() + = unlink(, ) + = ftruncate(, ) + = fstat() + = copy(, ) + = copy(, , ) + = fread(, ) + = fputcsv(, ) + = fputcsv(, , ) + = fputcsv(, , , ) + = fputcsv(, , , , ) + = fgetcsv() + = fgetcsv(, ) + = fgetcsv(, , ) + = fgetcsv(, , , ) + = fgetcsv(, , , , ) + = realpath() + = fnmatch(, ) + = fnmatch(, , ) + = sys_get_temp_dir() + = var_dump() + = debug_zval_dump() + = var_export() + = var_export(, ) + = serialize() + = unserialize() + = unserialize(, ) + = memory_get_usage() + = memory_get_usage() + = memory_get_peak_usage() + = memory_get_peak_usage() + = convert_uuencode() + = convert_uudecode() + = openlog(, , ) + = closelog() + = syslog(, ) + = readlink() + = linkinfo() + = symlink(, ) + = link(, ) + = parse_url() + = parse_url(, ) + = urlencode() + = urldecode() + = rawurlencode() + = rawurldecode() + = get_headers() + = get_headers(, ) + = get_headers(, , ) + = ftok(, ) + = iptcembed(, ) + = iptcembed(, , ) + = iptcparse() + = getmyuid() + = getmygid() + = getmypid() + = getmyinode() + = getlastmod() + = rand(, ) + = version_compare(, ) + = version_compare(, , ) + = base64_encode() + = base64_decode() + = base64_decode(, ) + = random_bytes() + = random_int(, ) + = phpinfo() + = phpinfo() + = phpversion() + = phpversion() + = phpcredits() + = phpcredits() + = php_sapi_name() + = php_uname() + = php_uname() + = php_ini_scanned_files() + = php_ini_loaded_file() + = metaphone() + = metaphone(, ) + = lcg_value() + = readline() + = readline_info() + = readline_info(, ) + = readline_add_history() + = readline_read_history() + = readline_write_history() + = readline_completion_function() + = readline_callback_handler_install(, ) + = ->open(, ) + = ->open(, , ) + = ->exec() + = ->enableExtendedResultCodes() + = ->busyTimeout() + = ->loadExtension() + = ->escapeString() + = ->prepare() + = ->query() + = ->querySingle(, ) + = ->createFunction(, , ) + = ->createFunction(, , , ) + = ->createAggregate(, , , ) + = ->createCollation(, ) + = ->openBlob(, , , ) + = ->openBlob(, , , , ) + = ->enableExceptions() + = ->setAuthorizer() + = ->backup(, ) + = ->backup(, , ) + = ->getSQL() + = ->__construct(, ) + = ->columnName() + = ->columnType() + = ->fetchArray() + = odbc_prepare(, ) + = odbc_execute(, ) + = odbc_cursor() + = odbc_data_source(, ) + = odbc_exec(, , ) + = odbc_fetch_into(, , ) + = solid_fetch_prev() + = odbc_fetch_row(, ) + = odbc_result(, ) + = odbc_result_all(, ) + = odbc_free_result() + = odbc_close() + = odbc_num_rows() + = odbc_next_result() + = odbc_num_fields() + = odbc_field_name(, ) + = odbc_field_type(, ) + = odbc_field_num(, ) + = odbc_autocommit(, ) + = odbc_setoption(, , , ) + = odbc_tables(, ) + = odbc_tables(, , ) + = odbc_tables(, , , ) + = odbc_tables(, , , , ) + = odbc_columns(, ) + = odbc_columns(, , ) + = odbc_columns(, , , ) + = odbc_columns(, , , , ) + = odbc_columnprivileges(, , , , ) + = odbc_foreignkeys(, , , , , , ) + = odbc_gettypeinfo(, ) + = odbc_primarykeys(, , , ) + = odbc_procedurecolumns(, ) + = odbc_procedurecolumns(, , ) + = odbc_procedurecolumns(, , , ) + = odbc_procedurecolumns(, , , , ) + = odbc_procedures(, ) + = odbc_procedures(, , ) + = odbc_procedures(, , , ) + = odbc_specialcolumns(, , , , , ) + = odbc_statistics(, , , , , ) + = odbc_tableprivileges(, , , ) + = posix_kill(, ) + = posix_getgroups() + = posix_getlogin() + = posix_setpgid(, ) + = posix_getpgid() + = posix_getsid() + = posix_uname() + = posix_times() + = posix_ctermid() + = posix_ttyname() + = posix_isatty() + = posix_getcwd() + = posix_mkfifo(, ) + = posix_mknod(, ) + = posix_mknod(, , ) + = posix_mknod(, , , ) + = posix_access() + = posix_access(, ) + = posix_getgrnam() + = posix_getgrgid() + = posix_getpwnam() + = posix_getpwuid() + = posix_getrlimit() + = posix_setrlimit(, , ) + = posix_get_last_error() + = posix_strerror() + = posix_initgroups(, ) + = ->running() + = ->mount(, ) + = ->webPhar() + = ->webPhar(, ) + = ->webPhar(, , ) + = ->webPhar(, , , ) + = ->webPhar(, , , , ) + = ->mungServer() + = ->createDefaultStub() + = ->createDefaultStub(, ) + = ->mapPhar() + = ->mapPhar(, ) + = ->loadPhar(, ) + = ->canCompress() + = ->isValidPharFilename(, ) + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->unlinkArchive() + = ->buildFromDirectory(, ) + = ->buildFromIterator(, ) + = ->count() + = ->isFileFormat() + = ->convertToExecutable() + = ->convertToExecutable(, ) + = ->convertToExecutable(, , ) + = ->convertToData() + = ->convertToData(, ) + = ->convertToData(, , ) + = ->delete() + = ->setAlias() + = ->setStub() + = ->setDefaultStub() + = ->setDefaultStub(, ) + = ->setSignatureAlgorithm(, ) + = ->compress(, ) + = ->decompress() + = ->compressFiles() + = ->copy(, ) + = ->offsetExists() + = ->offsetGet() + = ->offsetSet(, ) + = ->offsetUnset() + = ->addEmptyDir() + = ->addFile(, ) + = ->addFromString(, ) + = ->getMetadata() + = ->getMetadata() + = ->setMetadata() + = ->extractTo() + = ->extractTo(, ) + = ->extractTo(, , ) + = ->__construct() + = ->isCompressed() + = ->chmod() + = ->getMetadata() + = ->getMetadata() + = ->setMetadata() + = ->compress() + = pcntl_alarm() + = pcntl_waitpid(, , ) + = pcntl_waitpid(, , , ) + = pcntl_wait(, ) + = pcntl_wait(, , ) + = pcntl_wifexited() + = pcntl_wifstopped() + = pcntl_wifsignaled() + = pcntl_wifcontinued() + = pcntl_wexitstatus() + = pcntl_wtermsig() + = pcntl_wstopsig() + = pcntl_exec(, ) + = pcntl_exec(, , ) + = pcntl_signal(, , ) + = pcntl_signal_get_handler() + = pcntl_sigprocmask(, , ) + = pcntl_getpriority() + = pcntl_getpriority(, ) + = pcntl_setpriority(, ) + = pcntl_setpriority(, , ) + = pcntl_strerror() + = pcntl_async_signals() + = pcntl_unshare() + = ->insert() + = ->insert(, ) + = ->setExtractFlags() + = ->compare(, ) + = ->compare(, ) + = ->compare(, ) + = ->getSubIterator() + = ->setMaxDepth() + = ->setPrefixPart(, ) + = ->setPostfix() + = ->setMode() + = ->setFlags() + = ->setPregFlags() + = ->seek() + = ->offsetSet(, ) + = ->offsetGet() + = ->offsetUnset() + = ->offsetExists() + = ->setFlags() + = ->append() + = iterator_to_array(, ) + = iterator_count() + = iterator_apply(, , ) + = ->attach(, ) + = ->detach() + = ->getHash() + = ->offsetGet() + = ->addAll() + = ->removeAll() + = ->removeAllExcept() + = ->contains() + = ->count() + = ->setInfo() + = ->unserialize() + = ->__unserialize() + = ->__construct() + = ->setFlags() + = ->attachIterator(, ) + = ->detachIterator() + = ->containsIterator() + = ->__construct() + = ->fromArray(, ) + = ->setSize() + = ->offsetExists() + = ->offsetGet() + = ->offsetSet(, ) + = ->offsetUnset() + = ->seek() + = ->getBasename() + = ->getBasename() + = ->__construct() + = ->setFileClass() + = ->setInfoClass() + = ->getFileInfo() + = ->getPathInfo() + = ->setFlags() + = ->hasChildren() + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->__construct() + = ->setFlags() + = ->setMaxLineLen() + = ->fgetcsv() + = ->fgetcsv(, ) + = ->fgetcsv(, , ) + = ->fputcsv(, ) + = ->fputcsv(, , ) + = ->fputcsv(, , , ) + = ->setCsvControl() + = ->setCsvControl(, ) + = ->setCsvControl(, , ) + = ->fseek(, ) + = ->fwrite(, ) + = ->fread() + = ->ftruncate() + = ->seek() + = class_parents(, ) + = class_implements(, ) + = class_uses(, ) + = spl_autoload(, ) + = spl_autoload_extensions() + = spl_autoload_call() + = spl_autoload_register() + = spl_autoload_register() + = spl_autoload_register(, ) + = spl_autoload_register(, , ) + = spl_autoload_unregister() + = spl_object_hash() + = spl_object_id() + = ->offsetExists() + = ->offsetGet() + = ->offsetSet(, ) + = ->append() + = ->offsetUnset() + = ->__construct() + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct() + = ->__construct(, ) + = ->setIteratorClass() + = ->setFlags() + = ->exchangeArray() + = ->seek() + = ->unserialize() + = ->__unserialize() + = ->push() + = ->unshift() + = ->setIteratorMode() + = ->offsetExists() + = ->offsetGet() + = ->offsetSet(, ) + = ->offsetUnset() + = ->unserialize() + = ->__unserialize() + = ->add(, ) + = enchant_broker_free() + = enchant_broker_get_error() + = enchant_broker_set_dict_path(, , ) + = enchant_broker_get_dict_path(, ) + = enchant_broker_list_dicts() + = enchant_broker_request_dict(, ) + = enchant_broker_request_pwl_dict(, ) + = enchant_broker_free_dict() + = enchant_broker_dict_exists(, ) + = enchant_broker_set_ordering(, , ) + = enchant_broker_describe() + = enchant_dict_quick_check(, , ) + = enchant_dict_check(, ) + = enchant_dict_suggest(, ) + = enchant_dict_add(, ) + = enchant_dict_add_to_session(, ) + = enchant_dict_is_added(, ) + = enchant_dict_store_replacement(, , ) + = enchant_dict_get_error() + = enchant_dict_describe() + = filter_has_var(, ) + = filter_input(, , ) + = filter_input(, , , ) + = filter_var(, ) + = filter_var(, , ) + = filter_input_array(, ) + = filter_input_array(, , ) + = filter_var_array(, ) + = filter_var_array(, , ) + = filter_id() + = bcadd(, ) + = bcadd(, , ) + = bcsub(, ) + = bcsub(, , ) + = bcmul(, ) + = bcmul(, , ) + = bcdiv(, ) + = bcdiv(, , ) + = bcmod(, ) + = bcmod(, , ) + = bcpowmod(, , ) + = bcpowmod(, , , ) + = bcpow(, ) + = bcpow(, , ) + = bcsqrt() + = bcsqrt(, ) + = bccomp(, ) + = bccomp(, , ) + = bcscale() + = bcscale() + = ->open(, ) + = ->read() + = ->write(, ) + = ->destroy() + = ->gc() + = session_set_cookie_params() + = session_set_cookie_params(, ) + = session_set_cookie_params(, , ) + = session_set_cookie_params(, , , ) + = session_set_cookie_params(, , , , ) + = session_name() + = session_module_name() + = session_set_save_handler(, ) + = session_save_path() + = session_id() + = session_regenerate_id() + = session_create_id() + = session_cache_limiter() + = session_cache_expire() + = session_decode() + = session_start() + = session_register_shutdown() + = imap_reopen(, , ) + = imap_reopen(, , , ) + = imap_append(, , , ) + = imap_append(, , , , ) + = imap_num_msg() + = imap_ping() + = imap_num_recent() + = imap_get_quota(, ) + = imap_get_quotaroot(, ) + = imap_set_quota(, , ) + = imap_setacl(, , , ) + = imap_getacl(, ) + = imap_expunge() + = imap_gc(, ) + = imap_close(, ) + = imap_headers() + = imap_body(, , ) + = imap_mail_copy(, , , ) + = imap_mail_move(, , , ) + = imap_createmailbox(, ) + = imap_renamemailbox(, , ) + = imap_deletemailbox(, ) + = imap_list(, , ) + = imap_getmailboxes(, , ) + = imap_listscan(, , , ) + = imap_check() + = imap_delete(, , ) + = imap_undelete(, , ) + = imap_headerinfo(, , ) + = imap_headerinfo(, , , ) + = imap_headerinfo(, , , , ) + = imap_rfc822_parse_headers(, ) + = imap_lsub(, , ) + = imap_getsubscribed(, , ) + = imap_subscribe(, ) + = imap_unsubscribe(, ) + = imap_fetchstructure(, , ) + = imap_fetchbody(, , , ) + = imap_fetchmime(, , , ) + = imap_savebody(, , , ) + = imap_savebody(, , , , ) + = imap_base64() + = imap_qprint() + = imap_8bit() + = imap_binary() + = imap_mailboxmsginfo() + = imap_rfc822_write_address(, , ) + = imap_rfc822_parse_adrlist(, ) + = imap_utf8() + = imap_utf7_decode() + = imap_utf7_encode() + = imap_setflag_full(, , , ) + = imap_clearflag_full(, , , ) + = imap_sort(, , , ) + = imap_sort(, , , , ) + = imap_sort(, , , , , ) + = imap_fetchheader(, , ) + = imap_uid(, ) + = imap_msgno(, ) + = imap_status(, , ) + = imap_bodystruct(, , ) + = imap_fetch_overview(, , ) + = imap_mail_compose(, ) + = imap_mail(, , , ) + = imap_mail(, , , , ) + = imap_mail(, , , , , ) + = imap_mail(, , , , , , ) + = imap_search(, , ) + = imap_search(, , , ) + = imap_mime_header_decode() + = imap_thread(, ) + = imap_timeout(, ) + = simplexml_load_file(, ) + = simplexml_load_file(, , ) + = simplexml_load_file(, , , ) + = simplexml_load_file(, , , , ) + = simplexml_load_string(, ) + = simplexml_load_string(, , ) + = simplexml_load_string(, , , ) + = simplexml_load_string(, , , , ) + = simplexml_import_dom(, ) + = ftp_connect(, ) + = ftp_connect(, , ) + = ftp_ssl_connect(, ) + = ftp_ssl_connect(, , ) + = ftp_login(, , ) + = ftp_pwd() + = ftp_cdup() + = ftp_chdir(, ) + = ftp_exec(, ) + = ftp_raw(, ) + = ftp_mkdir(, ) + = ftp_rmdir(, ) + = ftp_chmod(, , ) + = ftp_alloc(, , ) + = ftp_nlist(, ) + = ftp_rawlist(, , ) + = ftp_mlsd(, ) + = ftp_systype() + = ftp_fget(, , , ) + = ftp_fget(, , , , ) + = ftp_nb_fget(, , , ) + = ftp_nb_fget(, , , , ) + = ftp_pasv(, ) + = ftp_get(, , , ) + = ftp_get(, , , , ) + = ftp_nb_get(, , , ) + = ftp_nb_get(, , , , ) + = ftp_nb_continue() + = ftp_fput(, , , ) + = ftp_fput(, , , , ) + = ftp_nb_fput(, , , ) + = ftp_nb_fput(, , , , ) + = ftp_put(, , , ) + = ftp_put(, , , , ) + = ftp_append(, , , ) + = ftp_nb_put(, , , ) + = ftp_nb_put(, , , , ) + = ftp_size(, ) + = ftp_mdtm(, ) + = ftp_rename(, , ) + = ftp_delete(, ) + = ftp_site(, ) + = ftp_close() + = ftp_set_option(, , ) + = ftp_get_option(, ) + = zip_open() + = zip_close() + = zip_read() + = zip_entry_open(, , ) + = zip_entry_close() + = zip_entry_read(, ) + = ->open(, ) + = ->setPassword() + = ->addEmptyDir(, ) + = ->addFile(, ) + = ->addFile(, , ) + = ->addFile(, , , ) + = ->addFile(, , , , ) + = ->replaceFile(, , ) + = ->replaceFile(, , , ) + = ->replaceFile(, , , , ) + = ->addFromString(, , ) + = ->statName(, ) + = ->statIndex(, ) + = ->locateName(, ) + = ->getNameIndex(, ) + = ->setArchiveComment() + = ->getArchiveComment() + = ->setCommentName(, ) + = ->setCommentIndex(, ) + = ->setExternalAttributesName(, , , ) + = ->setExternalAttributesIndex(, , , ) + = ->getExternalAttributesName(, , , ) + = ->getExternalAttributesIndex(, , , ) + = ->setEncryptionName(, , ) + = ->setEncryptionIndex(, , ) + = ->getCommentName(, ) + = ->getCommentIndex(, ) + = ->setCompressionName(, , ) + = ->setCompressionIndex(, , ) + = ->setMtimeName(, , ) + = ->setMtimeIndex(, , ) + = ->deleteIndex() + = ->deleteName() + = ->renameIndex(, ) + = ->renameName(, ) + = ->unchangeIndex() + = ->unchangeName() + = ->extractTo(, ) + = ->getStream() + = ->registerProgressCallback(, ) + = ->registerCancelCallback() + = ->isCompressionMethodSupported(, ) + = ->isEncryptionMethodSupported(, ) + = bzread(, ) + = bzopen(, ) + = bzcompress(, ) + = bzcompress(, , ) + = bzdecompress(, ) + = snmp_set_quick_print() + = snmp_set_enum_print() + = snmp_set_oid_output_format() + = snmp_set_valueretrieval() + = snmp_read_mib() + = ->__construct(, , , ) + = ->__construct(, , , , ) + = ->setSecurity(, ) + = ->setSecurity(, , ) + = ->setSecurity(, , , ) + = ->setSecurity(, , , , ) + = ->setSecurity(, , , , , ) + = ->setSecurity(, , , , , , ) + = sodium_memcmp(, ) + = sodium_crypto_shorthash(, ) + = sodium_crypto_secretbox(, , ) + = sodium_crypto_secretbox_open(, , ) + = sodium_crypto_generichash(, ) + = sodium_crypto_generichash(, , ) + = sodium_crypto_generichash_init() + = sodium_crypto_generichash_init(, ) + = sodium_crypto_generichash_update(, ) + = sodium_crypto_generichash_final(, ) + = sodium_crypto_box_seed_keypair() + = sodium_crypto_box_keypair_from_secretkey_and_publickey(, ) + = sodium_crypto_box_secretkey() + = sodium_crypto_box_publickey() + = sodium_crypto_box_publickey_from_secretkey() + = sodium_crypto_box(, , ) + = sodium_crypto_box_open(, , ) + = sodium_crypto_box_seal(, ) + = sodium_crypto_box_seal_open(, ) + = sodium_crypto_sign_seed_keypair() + = sodium_crypto_sign_keypair_from_secretkey_and_publickey(, ) + = sodium_crypto_sign_publickey_from_secretkey() + = sodium_crypto_sign_secretkey() + = sodium_crypto_sign_publickey() + = sodium_crypto_sign(, ) + = sodium_crypto_sign_open(, ) + = sodium_crypto_sign_detached(, ) + = sodium_crypto_sign_verify_detached(, , ) + = sodium_crypto_stream(, , ) + = sodium_crypto_stream_xor(, , ) + = sodium_crypto_pwhash(, , , , , ) + = sodium_crypto_pwhash_str(, , ) + = sodium_crypto_pwhash_str_needs_rehash(, , ) + = sodium_crypto_pwhash_str_verify(, ) + = sodium_crypto_pwhash_scryptsalsa208sha256(, , , , ) + = sodium_crypto_pwhash_scryptsalsa208sha256_str(, , ) + = sodium_crypto_pwhash_scryptsalsa208sha256_str_verify(, ) + = sodium_crypto_aead_aes256gcm_encrypt(, , , ) + = sodium_crypto_aead_aes256gcm_decrypt(, , , ) + = sodium_crypto_aead_chacha20poly1305_encrypt(, , , ) + = sodium_crypto_aead_chacha20poly1305_decrypt(, , , ) + = sodium_crypto_aead_chacha20poly1305_ietf_encrypt(, , , ) + = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(, , , ) + = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(, , , ) + = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(, , , ) + = sodium_bin2hex() + = sodium_hex2bin(, ) + = sodium_bin2base64(, ) + = sodium_base642bin(, , ) + = sodium_crypto_scalarmult(, ) + = sodium_crypto_kx_seed_keypair() + = sodium_crypto_kx_secretkey() + = sodium_crypto_kx_publickey() + = sodium_crypto_kx_client_session_keys(, ) + = sodium_crypto_kx_server_session_keys(, ) + = sodium_crypto_auth(, ) + = sodium_crypto_auth_verify(, , ) + = sodium_crypto_sign_ed25519_sk_to_curve25519() + = sodium_crypto_sign_ed25519_pk_to_curve25519() + = sodium_compare(, ) + = sodium_crypto_kdf_derive_from_key(, , , ) + = sodium_pad(, ) + = sodium_unpad(, ) + = sodium_crypto_secretstream_xchacha20poly1305_init_push() + = sodium_crypto_secretstream_xchacha20poly1305_push(, , ) + = sodium_crypto_secretstream_xchacha20poly1305_push(, , , ) + = sodium_crypto_secretstream_xchacha20poly1305_init_pull(, ) + = sodium_crypto_secretstream_xchacha20poly1305_pull(, , ) + = sodium_crypto_secretstream_xchacha20poly1305_rekey() + = exif_tagname() + = exif_read_data() + = exif_read_data(, ) + = exif_read_data(, , ) + = exif_read_data(, , , ) + = exif_thumbnail() + = exif_thumbnail(, ) + = exif_thumbnail(, , ) + = exif_thumbnail(, , , ) + = exif_imagetype() + = pspell_new(, ) + = pspell_new(, , ) + = pspell_new(, , , ) + = pspell_new(, , , , ) + = pspell_new_personal(, , ) + = pspell_new_personal(, , , ) + = pspell_new_personal(, , , , ) + = pspell_new_personal(, , , , , ) + = pspell_new_config() + = pspell_check(, ) + = pspell_suggest(, ) + = pspell_store_replacement(, , ) + = pspell_add_to_personal(, ) + = pspell_add_to_session(, ) + = pspell_clear_session() + = pspell_save_wordlist() + = pspell_config_create(, ) + = pspell_config_create(, , ) + = pspell_config_create(, , , ) + = pspell_config_runtogether(, ) + = pspell_config_mode(, ) + = pspell_config_ignore(, ) + = pspell_config_repl(, ) + = pspell_config_save_repl(, ) + = ->importStylesheet() + = ->transformToDoc(, ) + = ->transformToUri(, ) + = ->transformToXml() + = ->getParameter(, ) + = ->removeParameter(, ) + = ->registerPHPFunctions() + = ->registerPHPFunctions() + = ->setProfiling() + = ->setSecurityPrefs() + = oci_register_taf_callback(, ) + = oci_unregister_taf_callback() + = oci_define_by_name(, , ) + = oci_define_by_name(, , , ) + = oci_bind_by_name(, , ) + = oci_bind_by_name(, , , ) + = oci_bind_by_name(, , , , ) + = oci_bind_array_by_name(, , , ) + = oci_bind_array_by_name(, , , , ) + = oci_bind_array_by_name(, , , , , ) + = oci_lob_copy(, , ) + = oci_lob_is_equal(, ) + = oci_new_descriptor(, ) + = oci_rollback() + = oci_commit() + = oci_execute() + = oci_execute(, ) + = oci_cancel() + = oci_fetch() + = oci_fetch_all(, ) + = oci_fetch_all(, , ) + = oci_fetch_all(, , , ) + = oci_fetch_all(, , , , ) + = oci_free_statement() + = oci_close() + = oci_error() + = oci_error() + = oci_num_fields() + = oci_parse(, ) + = oci_set_prefetch(, ) + = oci_set_client_identifier(, ) + = oci_set_edition() + = oci_set_module_name(, ) + = oci_set_action(, ) + = oci_set_client_info(, ) + = oci_set_db_operation(, ) + = oci_set_call_timeout(, ) + = oci_new_cursor() + = oci_client_version() + = oci_server_version() + = oci_statement_type() + = oci_num_rows() + = oci_new_collection(, , ) + = oci_get_implicit_resultset() + = variant_date_from_timestamp() + = com_get_active_object(, ) + = com_event_sink(, , ) + = com_print_typeinfo(, ) + = com_print_typeinfo(, , ) + = com_message_pump() + = com_load_typelib(, ) + = ->__construct(, , ) + = mb_language() + = mb_internal_encoding() + = mb_http_input() + = mb_http_output() + = mb_detect_order() + = mb_detect_order() + = mb_substitute_character() + = mb_substitute_character() + = mb_preferred_mime_name() + = mb_parse_str(, ) + = mb_output_handler(, ) + = mb_str_split() + = mb_str_split(, ) + = mb_str_split(, , ) + = mb_strlen() + = mb_strlen(, ) + = mb_strpos(, , ) + = mb_strpos(, , , ) + = mb_strrpos(, , ) + = mb_strrpos(, , , ) + = mb_stripos(, , ) + = mb_stripos(, , , ) + = mb_strripos(, , ) + = mb_strripos(, , , ) + = mb_substr_count(, , ) + = mb_substr(, , ) + = mb_substr(, , , ) + = mb_strcut(, , ) + = mb_strcut(, , , ) + = mb_strwidth(, ) + = mb_strimwidth(, , , ) + = mb_strimwidth(, , , , ) + = mb_convert_encoding(, ) + = mb_convert_encoding(, , ) + = mb_convert_case(, , ) + = mb_strtoupper(, ) + = mb_strtolower(, ) + = mb_detect_encoding() + = mb_detect_encoding(, ) + = mb_detect_encoding(, , ) + = mb_encoding_aliases() + = mb_encode_mimeheader(, ) + = mb_encode_mimeheader(, , ) + = mb_encode_mimeheader(, , , ) + = mb_encode_mimeheader(, , , , ) + = mb_decode_mimeheader() + = mb_convert_kana(, ) + = mb_convert_kana(, , ) + = mb_convert_variables(, , ) + = mb_send_mail(, , , ) + = mb_send_mail(, , , , ) + = mb_get_info() + = mb_check_encoding() + = mb_check_encoding() + = mb_check_encoding(, ) + = mb_ord() + = mb_ord(, ) + = mb_chr() + = mb_chr(, ) + = mb_scrub() + = mb_scrub(, ) + = mb_regex_encoding() + = mb_split(, , ) + = mb_ereg_match(, , ) + = mb_ereg_search_init(, ) + = mb_ereg_search_init(, , ) + = mb_ereg_search_setpos() + = mb_regex_set_options() + = tidy_parse_string(, ) + = tidy_parse_string(, , ) + = tidy_parse_file(, ) + = tidy_parse_file(, , ) + = tidy_parse_file(, , , ) + = ->__construct() + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->parseFile(, ) + = ->parseFile(, , ) + = ->parseFile(, , , ) + = ->parseString(, ) + = ->parseString(, , ) + = ->__construct() + = mysqli_poll(, , , , ) + = mysqli_report() + = ->__construct(, ) + = ->__construct(, ) + = mysqli_debug() + = mysqli_get_client_info() + = ->getAll() + = ->getAll(, ) + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->is() + = isIgnorable() + = getTokenName() + = __toString() + = token_get_all() + = token_get_all(, ) + = token_name() + = pdo_drivers() + = ->__construct() + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->prepare() + = ->prepare(, ) + = beginTransaction() + = commit() + = rollBack() + = inTransaction() + = ->setAttribute(, ) + = ->getAttribute() + = ->exec() + = ->lastInsertId() + = ->lastInsertId() + = errorCode() + = errorInfo() + = ->query(, ) + = ->query(, ) + = ->quote() + = ->quote(, ) + = getAvailableDrivers() + = ->execute() + = ->execute() + = ->fetch() + = ->fetch() + = ->fetch(, ) + = ->fetch(, , ) + = ->fetchObject() + = ->fetchObject() + = ->fetchObject(, ) + = ->fetchColumn() + = ->fetchColumn() + = ->fetchAll() + = ->fetchAll() + = ->fetchAll(, ) + = ->fetchAll(, , ) + = ->bindValue(, ) + = ->bindValue(, , ) + = rowCount() + = errorCode() + = errorInfo() + = ->setAttribute(, ) + = ->getAttribute() + = columnCount() + = ->getColumnMeta() + = ->setFetchMode() + = nextRowset() + = closeCursor() + = debugDumpParams() + = debugDumpParams() + = shmop_open(, , , ) + = shmop_read(, , ) + = shmop_close() + = shmop_size() + = shmop_write(, , ) + = shmop_delete() + = hash(, ) + = hash(, , ) + = hash_file(, ) + = hash_file(, , ) + = hash_hmac(, , , ) + = hash_hmac_file(, , , ) + = hash_init(, ) + = hash_init(, , ) + = hash_update(, ) + = hash_update_stream(, , ) + = hash_update_file(, , ) + = hash_final(, ) + = hash_copy() + = hash_hkdf(, , ) + = hash_hkdf(, , , ) + = hash_hkdf(, , , , ) + = hash_pbkdf2(, , , , ) + = hash_pbkdf2(, , , , , ) + = hash_equals(, ) + = mhash(, , ) + = mhash_get_hash_name() + = mhash_get_block_size() + = mhash_keygen_s2k(, , , ) + = ->__unserialize() + = ldap_connect() + = ldap_connect(, ) + = ldap_connect(, , ) + = ldap_connect(, , , ) + = ldap_connect(, , , , ) + = ldap_bind(, ) + = ldap_bind(, , ) + = ldap_bind_ext(, ) + = ldap_bind_ext(, , ) + = ldap_bind_ext(, , , ) + = ldap_sasl_bind(, ) + = ldap_sasl_bind(, , ) + = ldap_sasl_bind(, , , ) + = ldap_sasl_bind(, , , , ) + = ldap_sasl_bind(, , , , , ) + = ldap_sasl_bind(, , , , , , ) + = ldap_sasl_bind(, , , , , , , ) + = ldap_unbind() + = ldap_free_result() + = ldap_count_entries(, ) + = ldap_first_entry(, ) + = ldap_next_entry(, ) + = ldap_get_entries(, ) + = ldap_first_attribute(, , ) + = ldap_next_attribute(, , ) + = ldap_get_attributes(, ) + = ldap_get_values_len(, , ) + = ldap_get_dn(, ) + = ldap_explode_dn(, ) + = ldap_dn2ufn() + = ldap_modify_batch(, , , ) + = ldap_errno() + = ldap_err2str() + = ldap_error() + = ldap_compare(, , , , ) + = ldap_get_option(, , ) + = ldap_set_option(, , ) + = ldap_parse_result(, , , ) + = ldap_parse_result(, , , , ) + = ldap_parse_result(, , , , , ) + = ldap_parse_result(, , , , , , ) + = ldap_parse_exop(, , ) + = ldap_parse_exop(, , , ) + = ldap_count_references(, ) + = ldap_first_reference(, ) + = ldap_next_reference(, ) + = ldap_parse_reference(, , ) + = ldap_start_tls() + = ldap_set_rebind_proc(, ) + = ldap_escape(, ) + = ldap_escape(, , ) + = ldap_control_paged_result(, , ) + = ldap_control_paged_result(, , , ) + = ldap_control_paged_result_response(, , ) + = ldap_control_paged_result_response(, , , ) + = ldap_exop(, , ) + = ldap_exop(, , , ) + = ldap_exop(, , , , ) + = ldap_exop(, , , , , ) + = ldap_exop_passwd(, ) + = ldap_exop_passwd(, , ) + = ldap_exop_passwd(, , , ) + = ldap_exop_passwd(, , , , ) + = ldap_exop_whoami() + = ldap_exop_refresh(, , ) + = preg_replace_callback(, , ) + = preg_replace_callback(, , , ) + = preg_replace_callback(, , , , ) + = preg_replace_callback(, , , , , ) + = preg_replace_callback_array(, ) + = preg_replace_callback_array(, , ) + = preg_replace_callback_array(, , , ) + = preg_replace_callback_array(, , , , ) + = preg_split(, ) + = preg_split(, , ) + = preg_split(, , , ) + = preg_quote() + = preg_quote(, ) + = preg_grep(, ) + = preg_grep(, , ) + = preg_last_error() + = preg_last_error_msg() + = cal_info() + = cal_days_in_month(, , ) + = cal_to_jd(, , , ) + = cal_from_jd(, ) + = jdtogregorian() + = gregoriantojd(, , ) + = jdtojulian() + = juliantojd(, , ) + = jdtojewish(, ) + = jdtojewish(, , ) + = jewishtojd(, , ) + = jdtofrench() + = frenchtojd(, , ) + = jddayofweek(, ) + = jdmonthname(, ) + = unixtojd() + = jdtounix() + = idate() + = idate(, ) + = strtotime() + = strtotime(, ) + = checkdate(, , ) + = time() + = localtime() + = localtime() + = localtime(, ) + = getdate() + = getdate() + = date_create() + = date_create() + = date_create(, ) + = date_create_immutable() + = date_create_immutable() + = date_create_immutable(, ) + = date_create_from_format(, ) + = date_create_from_format(, , ) + = date_create_immutable_from_format(, ) + = date_create_immutable_from_format(, , ) + = ->__construct() + = ->__construct() + = ->__construct(, ) + = ->__construct() + = ->__construct() + = ->__construct(, ) + = ->createFromImmutable() + = ->createFromInterface() + = ->createFromMutable() + = ->createFromInterface() + = ->__set_state() + = ->__set_state() + = __wakeup() + = __wakeup() + = date_get_last_errors() + = date_parse() + = date_parse_from_format(, ) + = ->modify() + = ->add() + = ->sub() + = ->setTimezone() + = ->setTime(, , ) + = ->setTime(, , , ) + = ->setDate(, , ) + = ->setISODate(, , ) + = ->setTimestamp() + = timezone_open() + = ->__construct() + = ->__set_state() + = __wakeup() + = timezone_name_from_abbr() + = timezone_name_from_abbr(, ) + = timezone_name_from_abbr(, , ) + = ->__construct() + = ->__set_state() + = __wakeup() + = date_interval_create_from_date_string() + = getStartDate() + = getEndDate() + = getDateInterval() + = getRecurrences() + = getIterator() + = timezone_identifiers_list() + = timezone_identifiers_list() + = timezone_identifiers_list(, ) + = timezone_version_get() + = timezone_abbreviations_list() + = date_default_timezone_set() + = date_default_timezone_get() + = date_sun_info(, , ) + = ->__set_state() + = __wakeup() + = imageloadfont() + = imagesetstyle(, ) + = imagecreatetruecolor(, ) + = imageistruecolor() + = imagetruecolortopalette(, , ) + = imagepalettetotruecolor() + = imagecolormatch(, ) + = imagesetthickness(, ) + = imagefilledellipse(, , , , , ) + = imagefilledarc(, , , , , , , , ) + = imagealphablending(, ) + = imagesavealpha(, ) + = imagelayereffect(, ) + = imagecolorallocatealpha(, , , , ) + = imagecolorresolvealpha(, , , , ) + = imagecolorclosestalpha(, , , , ) + = imagecolorexactalpha(, , , , ) + = imagecopyresampled(, , , , , , , , , ) + = imagegrabwindow(, ) + = imagerotate(, , , ) + = imagesettile(, ) + = imagesetbrush(, ) + = imagecreate(, ) + = imagecreatefromstring() + = imagexbm(, , ) + = imagewbmp(, ) + = imagewbmp(, , ) + = imagebmp(, ) + = imagebmp(, , ) + = imagedestroy() + = imagecolorallocate(, , , ) + = imagepalettecopy(, ) + = imagecolorat(, , ) + = imagecolorclosest(, , , ) + = imagecolorclosesthwb(, , , ) + = imagecolordeallocate(, ) + = imagecolorresolve(, , , ) + = imagecolorexact(, , , ) + = imagecolorset(, , , , , ) + = imagecolorsforindex(, ) + = imagegammacorrect(, , ) + = imagesetpixel(, , , ) + = imageline(, , , , , ) + = imagedashedline(, , , , , ) + = imagerectangle(, , , , , ) + = imagefilledrectangle(, , , , , ) + = imagearc(, , , , , , , ) + = imageellipse(, , , , , ) + = imagefilltoborder(, , , , ) + = imagefill(, , , ) + = imagecolorstotal() + = imagecolortransparent(, ) + = imageinterlace(, ) + = imagecopy(, , , , , , , ) + = imagecopymerge(, , , , , , , , ) + = imagecopymergegray(, , , , , , , , ) + = imagecopyresized(, , , , , , , , , ) + = imagesx() + = imagesy() + = imagesetclip(, , , , ) + = imagegetclip() + = imagefilter(, ) + = imageconvolution(, , , ) + = imageflip(, ) + = imageantialias(, ) + = imagecrop(, ) + = imagecropauto(, ) + = imagecropauto(, , ) + = imagecropauto(, , , ) + = imagescale(, , ) + = imagescale(, , , ) + = imageaffine(, , ) + = imageaffinematrixget(, ) + = imageaffinematrixconcat(, ) + = imagegetinterpolation() + = imagesetinterpolation(, ) + = imageresolution(, ) + = imageresolution(, , ) + = ->sqliteCreateFunction(, ) + = ->sqliteCreateFunction(, , ) + = ->sqliteCreateFunction(, , , ) + = ->sqliteCreateAggregate(, , ) + = ->sqliteCreateAggregate(, , , ) + = ->sqliteCreateCollation(, ) + = xmlwriter_open_uri() + = pg_connect_poll() + = pg_close() + = pg_parameter_status() + = pg_ping() + = pg_query() + = pg_query_params(, ) + = pg_prepare(, ) + = pg_execute(, ) + = pg_last_notice(, ) + = pg_field_table(, , ) + = pg_field_num(, ) + = pg_fetch_result(, ) + = pg_fetch_all(, ) + = pg_fetch_all_columns(, ) + = pg_result_seek(, ) + = pg_free_result() + = pg_last_oid() + = pg_trace(, ) + = pg_trace(, , ) + = pg_untrace() + = pg_lo_create() + = pg_lo_create(, ) + = pg_lo_close() + = pg_lo_read(, ) + = pg_lo_write(, , ) + = pg_lo_read_all() + = pg_lo_seek(, , ) + = pg_lo_tell() + = pg_lo_truncate(, ) + = pg_set_error_verbosity() + = pg_set_client_encoding() + = pg_client_encoding() + = pg_end_copy() + = pg_put_line() + = pg_copy_to(, , ) + = pg_copy_to(, , , ) + = pg_copy_from(, , , ) + = pg_copy_from(, , , , ) + = pg_escape_string() + = pg_escape_bytea() + = pg_unescape_bytea() + = pg_result_error() + = pg_result_error_field(, ) + = pg_connection_status() + = pg_transaction_status() + = pg_connection_reset() + = pg_send_query(, ) + = pg_send_query_params(, , ) + = pg_send_prepare(, , ) + = pg_send_execute(, , ) + = pg_get_result() + = pg_result_status(, ) + = pg_get_notify(, ) + = pg_get_pid() + = pg_socket() + = pg_consume_input() + = pg_flush() + = pg_meta_data(, , ) + = pg_insert(, , , ) + = pg_update(, , , , ) + = pg_delete(, , , ) + = pg_select(, , , ) + = socket_select(, , , , ) + = socket_create_listen(, ) + = socket_accept() + = socket_set_nonblock() + = socket_set_block() + = socket_listen(, ) + = socket_close() + = socket_write(, , ) + = socket_read(, , ) + = socket_getsockname(, , ) + = socket_getpeername(, , ) + = socket_create(, , ) + = socket_connect(, , ) + = socket_strerror() + = socket_bind(, , ) + = socket_recv(, , , ) + = socket_send(, , , ) + = socket_recvfrom(, , , , , ) + = socket_sendto(, , , , , ) + = socket_get_option(, , ) + = socket_set_option(, , , ) + = socket_create_pair(, , , ) + = socket_shutdown(, ) + = socket_last_error() + = socket_clear_error() + = socket_import_stream() + = socket_export_stream() + = socket_addrinfo_lookup(, ) + = socket_addrinfo_lookup(, , ) + = socket_addrinfo_bind() + = socket_addrinfo_connect() + = socket_addrinfo_explain() + = socket_wsaprotocol_info_export(, ) + = socket_wsaprotocol_info_import() + = socket_wsaprotocol_info_release() + = socket_sendmsg(, , ) + = socket_recvmsg(, , ) + = socket_cmsg_space(, , ) + = json_encode() + = json_encode(, ) + = json_encode(, , ) + = json_decode() + = json_decode(, ) + = json_decode(, , ) + = json_decode(, , , ) + = json_last_error() + = json_last_error_msg() + = ->getAttributeNo() + = ->getAttributeNs(, ) + = ->getParserProperty() + = ->moveToAttribute() + = ->moveToAttributeNo() + = ->moveToAttributeNs(, ) + = ->next() + = ->open(, ) + = ->open(, , ) + = ->setSchema() + = ->setParserProperty(, ) + = ->XML(, ) + = ->XML(, , ) + = ->expand() + = test1() + = test2() + = test2() + = iconv_strlen(, ) + = iconv_substr(, , ) + = iconv_substr(, , , ) + = iconv_strpos(, , ) + = iconv_strpos(, , , ) + = iconv_strrpos(, , ) + = iconv_mime_encode(, , ) + = iconv_mime_decode(, ) + = iconv_mime_decode(, , ) + = iconv_mime_decode_headers(, ) + = iconv_mime_decode_headers(, , ) + = iconv(, , ) + = iconv_set_encoding(, ) + = iconv_get_encoding() + = ->__construct(, ) + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->__construct(, , , , ) + = ->__construct(, ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->__construct(, , , , ) + = ->__construct(, , , , , ) + = ->__construct(, , ) + = ->__construct(, , , ) + = ->__construct(, , , , ) + = ->__construct(, , , , , ) + = ->__construct(, ) + = ->setPersistence() + = ->setClass() + = ->setObject() + = ->addFunction() + = ->handle() + = ->fault(, , ) + = ->fault(, , , ) + = ->fault(, , , , ) + = ->addSoapHeader() + = use_soap_error_handler() + = is_soap_fault() + = ->__construct(, ) + = ->__doRequest(, , , , ) + = ->__setCookie(, ) + = ->__setSoapHeaders() + = ->__setLocation() + = ob_gzhandler(, ) + = gzfile(, ) + = gzopen(, , ) + = readgzfile(, ) + = name(, ) + = name(, , ) + = name(, ) + = inflate_init(, ) + = inflate_add(, , ) + = inflate_get_status() + = inflate_get_read_len() + = deflate_init(, ) + = deflate_add(, , ) + = textdomain() + = gettext() + = dgettext(, ) + = dcgettext(, , ) + = bindtextdomain(, ) + = ngettext(, , ) + = dngettext(, , , ) + = dcngettext(, , , , ) + = bind_textdomain_codeset(, ) + = dba_close() + = dba_key_split() + = dba_firstkey() + = dba_nextkey() + = dba_optimize() + = dba_sync() + = dba_handlers() + = shm_attach(, ) + = shm_attach(, , ) + = shm_detach() + = shm_remove() + = shm_put_var(, , ) + = shm_get_var(, ) + = shm_has_var(, ) + = shm_remove_var(, ) + = xml_set_object(, ) + = xml_set_element_handler(, , ) + = xml_set_character_data_handler(, ) + = xml_set_processing_instruction_handler(, ) + = xml_set_default_handler(, ) + = xml_set_unparsed_entity_decl_handler(, ) + = xml_set_notation_decl_handler(, ) + = xml_set_external_entity_ref_handler(, ) + = xml_set_start_namespace_decl_handler(, ) + = xml_set_end_namespace_decl_handler(, ) + = xml_parse(, , ) + = xml_parse_into_struct(, , , ) + = xml_get_error_code() + = xml_error_string() + = xml_get_current_line_number() + = xml_get_current_column_number() + = xml_get_current_byte_index() + = xml_parser_free() + = xml_parser_set_option(, , ) + = xml_parser_get_option(, ) + = ->pgsqlCopyFromArray(, , ) + = ->pgsqlCopyFromArray(, , , ) + = ->pgsqlCopyFromArray(, , , , ) + = ->pgsqlCopyFromFile(, , ) + = ->pgsqlCopyFromFile(, , , ) + = ->pgsqlCopyFromFile(, , , , ) + = ->pgsqlCopyToFile(, , ) + = ->pgsqlCopyToFile(, , , ) + = ->pgsqlCopyToFile(, , , , ) + = ->pgsqlCopyToArray(, ) + = ->pgsqlCopyToArray(, , ) + = ->pgsqlCopyToArray(, , , ) + = pgsqlLOBCreate() + = ->pgsqlLOBOpen(, ) + = ->pgsqlLOBUnlink() + = ->pgsqlGetNotify() + = ->pgsqlGetNotify(, ) + = pgsqlGetPid() + = libxml_set_streams_context() + = libxml_use_internal_errors() + = libxml_use_internal_errors() + = libxml_get_last_error() + = libxml_get_errors() + = libxml_clear_errors() + = libxml_disable_entity_loader() + = libxml_disable_entity_loader() + = libxml_set_external_entity_loader() + = openssl_x509_export_to_file(, ) + = openssl_x509_export_to_file(, , ) + = openssl_spki_new(, , ) + = openssl_spki_verify() + = openssl_spki_export() + = openssl_spki_export_challenge() + = openssl_x509_export(, ) + = openssl_x509_export(, , ) + = openssl_x509_fingerprint() + = openssl_x509_fingerprint(, ) + = openssl_x509_fingerprint(, , ) + = openssl_x509_check_private_key(, ) + = openssl_x509_verify(, ) + = openssl_x509_parse() + = openssl_x509_parse(, ) + = openssl_x509_checkpurpose(, ) + = openssl_x509_checkpurpose(, , ) + = openssl_x509_checkpurpose(, , , ) + = openssl_x509_read() + = openssl_x509_free() + = openssl_pkcs12_export_to_file(, , , ) + = openssl_pkcs12_export_to_file(, , , , ) + = openssl_pkcs12_export(, , , ) + = openssl_pkcs12_export(, , , , ) + = openssl_pkcs12_read(, , ) + = openssl_csr_export_to_file(, ) + = openssl_csr_export_to_file(, , ) + = openssl_csr_export(, ) + = openssl_csr_export(, , ) + = openssl_csr_sign(, , , ) + = openssl_csr_sign(, , , , ) + = openssl_csr_sign(, , , , , ) + = openssl_csr_new(, , ) + = openssl_csr_new(, , , ) + = openssl_csr_get_subject() + = openssl_csr_get_subject(, ) + = openssl_csr_get_public_key() + = openssl_csr_get_public_key(, ) + = openssl_pkey_new() + = openssl_pkey_export_to_file(, , ) + = openssl_pkey_export_to_file(, , , ) + = openssl_pkey_export(, , ) + = openssl_pkey_export(, , , ) + = openssl_pkey_get_public() + = openssl_pkey_free() + = openssl_pkey_get_private(, ) + = openssl_pkey_get_details() + = openssl_dh_compute_key(, ) + = openssl_pkey_derive(, , ) + = openssl_pbkdf2(, , , , ) + = openssl_pkcs7_verify(, , ) + = openssl_pkcs7_verify(, , , ) + = openssl_pkcs7_verify(, , , , ) + = openssl_pkcs7_verify(, , , , , ) + = openssl_pkcs7_verify(, , , , , , ) + = openssl_pkcs7_encrypt(, , , , ) + = openssl_pkcs7_encrypt(, , , , , ) + = openssl_pkcs7_read(, ) + = openssl_pkcs7_sign(, , , , ) + = openssl_pkcs7_sign(, , , , , ) + = openssl_pkcs7_sign(, , , , , , ) + = openssl_pkcs7_decrypt(, , ) + = openssl_pkcs7_decrypt(, , , ) + = openssl_cms_verify(, , ) + = openssl_cms_verify(, , , ) + = openssl_cms_verify(, , , , ) + = openssl_cms_verify(, , , , , ) + = openssl_cms_verify(, , , , , , ) + = openssl_cms_verify(, , , , , , , ) + = openssl_cms_verify(, , , , , , , , ) + = openssl_cms_encrypt(, , , , ) + = openssl_cms_encrypt(, , , , , ) + = openssl_cms_encrypt(, , , , , , ) + = openssl_cms_read(, ) + = openssl_cms_sign(, , , , ) + = openssl_cms_sign(, , , , , ) + = openssl_cms_sign(, , , , , , ) + = openssl_cms_sign(, , , , , , , ) + = openssl_cms_decrypt(, , ) + = openssl_cms_decrypt(, , , ) + = openssl_cms_decrypt(, , , , ) + = openssl_private_encrypt(, , , ) + = openssl_private_decrypt(, , , ) + = openssl_public_encrypt(, , , ) + = openssl_public_decrypt(, , , ) + = openssl_sign(, , , ) + = openssl_verify(, , , ) + = openssl_seal(, , , , ) + = openssl_seal(, , , , , ) + = openssl_open(, , , , ) + = openssl_open(, , , , , ) + = openssl_get_md_methods() + = openssl_get_cipher_methods() + = openssl_digest(, , ) + = openssl_encrypt(, , , ) + = openssl_encrypt(, , , , ) + = openssl_encrypt(, , , , , ) + = openssl_encrypt(, , , , , , ) + = openssl_encrypt(, , , , , , , ) + = openssl_decrypt(, , , ) + = openssl_decrypt(, , , , ) + = openssl_decrypt(, , , , , ) + = openssl_decrypt(, , , , , , ) + = openssl_cipher_iv_length() + = openssl_random_pseudo_bytes(, ) + = msg_set_queue(, ) + = msg_stat_queue() + = msg_queue_exists() + = msg_get_queue(, ) + = msg_remove_queue() + = msg_receive(, , , , , ) + = msg_receive(, , , , , , ) + = msg_receive(, , , , , , , ) + = msg_send(, , , ) + = msg_send(, , , , ) + = msg_send(, , , , , ) + + + = $vars["tidyNode"] + = $vars["com"] + = $vars["SQLite3Result"] + = $vars["InfiniteIterator"] + = $vars["DateTimeZone"] + = $vars["ArrayIterator"] + = $vars["tidy"] + = $vars["PDO"] + = $vars["SoapParam"] + = $vars["DOMElement"] + = $vars["SoapVar"] + = $vars["Phar"] + = $vars["dotnet"] + = $vars["RecursiveRegexIterator"] + = $vars["COMPersistHelper"] + = $vars["DOMAttr"] + = $vars["DOMCdataSection"] + = $vars["RecursiveDirectoryIterator"] + = $vars["PDO_SQLite_Ext"] + = $vars["MultipleIterator"] + = $vars["DOMDocumentFragment"] + = $vars["SplMaxHeap"] + = $vars["RegexIterator"] + = $vars["SplObjectStorage"] + = $vars["DateTimeImmutable"] + = $vars["DOMNamedNodeMap"] + = $vars["ArrayObject"] + = $vars["AppendIterator"] + = $vars["SplHeap"] + = $vars["DOMText"] + = $vars["FilterIterator"] + = $vars["SplFileInfo"] + = $vars["SplDoublyLinkedList"] + = $vars["DateInterval"] + = $vars["XSLTProcessor"] + = $vars["RecursiveCallbackFilterIterator"] + = $vars["SplMinHeap"] + = $vars["cname"] + = $vars["SessionHandler"] + = $vars["SplTempFileObject"] + = $vars["PhpToken"] + = $vars["ZipArchive"] + = $vars["DOMNodeList"] + = $vars["SplPriorityQueue"] + = $vars["RecursiveTreeIterator"] + = $vars["XMLReader"] + = $vars["SoapHeader"] + = $vars["DOMImplementation"] + = $vars["SQLite3"] + = $vars["DOMEntityReference"] + = $vars["SimpleXMLElement"] + = $vars["CallbackFilterIterator"] + = $vars["mysqli"] + = $vars["EmptyIterator"] + = $vars["SplFileObject"] + = $vars["mysqli_warning"] + = $vars["DOMXPath"] + = $vars["PDOStatement"] + = $vars["SoapFault"] + = $vars["SoapClient"] + = $vars["DOMCharacterData"] + = $vars["PharFileInfo"] + = $vars["RecursiveIteratorIterator"] + = $vars["RecursiveFilterIterator"] + = $vars["variant"] + = $vars["mysqli_result"] + = $vars["ParentIterator"] + = $vars["SNMP"] + = $vars["FilesystemIterator"] + = $vars["DOMDocument"] + = $vars["DOMProcessingInstruction"] + = $vars["LimitIterator"] + = $vars["NoRewindIterator"] + = $vars["IteratorIterator"] + = $vars["DOMNode"] + = $vars["DateTime"] + = $vars["SplFixedArray"] + = $vars["SQLite3Stmt"] + = $vars["GlobIterator"] + = $vars["mysqli_stmt"] + = $vars["DOMComment"] + = $vars["DirectoryIterator"] + = $vars["CachingIterator"] + = $vars["RecursiveArrayIterator"] + = $vars["DatePeriod"] + = $vars["PDO_PGSql_Ext"] + = $vars["SoapServer"] + = $vars["RecursiveCachingIterator"] + = $vars["php_user_filter"] + = $vars["HashContext"] diff --git a/php/template.php b/php/template.php new file mode 100644 index 0000000..6b066ff --- /dev/null +++ b/php/template.php @@ -0,0 +1,173 @@ + new stdClass(), + "Exception" => new Exception(), + "ErrorException" => new ErrorException(), + "Error" => new Error(), + "CompileError" => new CompileError(), + "ParseError" => new ParseError(), + "TypeError" => new TypeError(), + "ArgumentCountError" => new ArgumentCountError(), + "ArithmeticError" => new ArithmeticError(), + "DivisionByZeroError" => new DivisionByZeroError(), + "ClosedGeneratorException" => new ClosedGeneratorException(), + "DateTime" => new DateTime(), + "DateTimeImmutable" => new DateTimeImmutable(), + "DateTimeZone" => new DateTimeZone("America/Chicago"), + "DateInterval" => new DateInterval("P2Y4DT6H8M"), + "DatePeriod" => new DatePeriod("R4/2012-07-01T00:00:00Z/P7D"), + "LibXMLError" => new LibXMLError(), + "DOMException" => new DOMException(), + "DOMStringList" => new DOMStringList(), + "DOMNameList" => new DOMNameList(), + "DOMImplementationList" => new DOMImplementationList(), + "DOMImplementationSource" => new DOMImplementationSource(), + "DOMImplementation" => new DOMImplementation(), + "DOMNode" => new DOMNode(), + "DOMNameSpaceNode" => new DOMNameSpaceNode(), + "DOMDocumentFragment" => new DOMDocumentFragment(), + "DOMDocument" => new DOMDocument(), + "DOMNodeList" => new DOMNodeList(), + "DOMNamedNodeMap" => new DOMNamedNodeMap(), + "DOMCharacterData" => new DOMCharacterData(), + "DOMAttr" => new DOMAttr("artr"), + "DOMElement" => new DOMElement("root"), + "DOMText" => new DOMText(), + "DOMComment" => new DOMComment(), + "DOMTypeinfo" => new DOMTypeinfo(), + "DOMUserDataHandler" => new DOMUserDataHandler(), + "DOMDomError" => new DOMDomError(), + "DOMErrorHandler" => new DOMErrorHandler(), + "DOMLocator" => new DOMLocator(), + "DOMConfiguration" => new DOMConfiguration(), + "DOMCdataSection" => new DOMCdataSection("root value"), + "DOMDocumentType" => new DOMDocumentType(), + "DOMNotation" => new DOMNotation(), + "DOMEntity" => new DOMEntity(), + "DOMEntityReference" => new DOMEntityReference("nbsp"), + "DOMProcessingInstruction" => new DOMProcessingInstruction("php"), + "DOMStringExtend" => new DOMStringExtend(), + "DOMXPath" => new DOMXPath(new DOMDocument()), + "finfo" => new finfo(), + "JsonException" => new JsonException(), + "LogicException" => new LogicException(), + "BadFunctionCallException" => new BadFunctionCallException(), + "BadMethodCallException" => new BadMethodCallException(), + "DomainException" => new DomainException(), + "InvalidArgumentException" => new InvalidArgumentException(), + "LengthException" => new LengthException(), + "OutOfRangeException" => new OutOfRangeException(), + "RuntimeException" => new RuntimeException(), + "OutOfBoundsException" => new OutOfBoundsException(), + "OverflowException" => new OverflowException(), + "RangeException" => new RangeException(), + "UnderflowException" => new UnderflowException(), + "UnexpectedValueException" => new UnexpectedValueException(), + "SplFileObject" => new SplFileObject(__FILE__), + "SplTempFileObject" => new SplTempFileObject(), + "SplDoublyLinkedList" => new SplDoublyLinkedList(), + "SplQueue" => new SplQueue(), + "SplStack" => new SplStack(), + "SplMinHeap" => new SplMinHeap(), + "SplMaxHeap" => new SplMaxHeap(), + "SplPriorityQueue" => new SplPriorityQueue(), + "SplFixedArray" => new SplFixedArray(), + "SplObjectStorage" => new SplObjectStorage(), + "MultipleIterator" => new MultipleIterator(), + "SessionHandler" => new SessionHandler(), + "ReflectionException" => new ReflectionException(), + "Reflection" => new Reflection(), + "ReflectionFunction" => new ReflectionFunction("templateFunction"), + "ReflectionGenerator" => new ReflectionGenerator(templateGenerator()), + "ReflectionParameter" => new ReflectionParameter("templateFunction", "templateParameter"), + "ReflectionType" => (new ReflectionClass("ZipArchive"))->getMethod("getCommentName")->getReturnType(), + "ReflectionNamedType" => new ReflectionNamedType(), + "ReflectionMethod" => new ReflectionMethod("TemplateClass", "templateMethod"), + "ReflectionClass" => new ReflectionClass("TemplateClass"), + "ReflectionObject" => new ReflectionObject(new TemplateClass()), + "ReflectionProperty" => new ReflectionProperty("TemplateClass", "templateProperty"), + "ReflectionClassConstant" => new ReflectionClassConstant("TemplateClass", "TEMPLATE_CONSTANT"), + "ReflectionExtension" => new ReflectionExtension("Reflection"), + "__PHP_Incomplete_Class" => new __PHP_Incomplete_Class(), + "php_user_filter" => new php_user_filter(), + "Directory" => new Directory(), + "AssertionError" => new AssertionError(), + "SimpleXMLElement" => new SimpleXMLElement("a"), + "SimpleXMLIterator" => new SimpleXMLIterator("a"), + "PharException" => new PharException(), + "Phar" => new Phar("/tmp/fuzz.phar"), + "PharData" => new PharData("/tmp/fuzz.tar"), + "PharFileInfo" => new PharFileInfo("phar:///tmp/fuzz.phar/fuzz.txt"), + "XMLReader" => new XMLReader(), + "XMLWriter" => new XMLWriter(), + "CURLFile" => new CURLFile("/tmp/fuzz"), + "ZipArchive" => new ZipArchive(), + + /* - Instantiation not allowed - + "ReflectionZendExtension" => new ReflectionZendExtension(), + "ReflectionFunctionAbstract" => new ReflectionFunctionAbstract(), + "PDOException" => new PDOException(), + "PDO" => new PDO(), + "PDOStatement" => new PDOStatement(), + "SplHeap" => new SplHeap(), + "PDORow" => new PDORow(), + "RecursiveIteratorIterator" => new RecursiveIteratorIterator(), + "IteratorIterator" => new IteratorIterator(), + "FilterIterator" => new FilterIterator(), + "RecursiveFilterIterator" => new RecursiveFilterIterator(), + "CallbackFilterIterator" => new CallbackFilterIterator(), + "RecursiveCallbackFilterIterator" => new RecursiveCallbackFilterIterator(), + "ParentIterator" => new ParentIterator(), + "LimitIterator" => new LimitIterator(), + "CachingIterator" => new CachingIterator(), + "RecursiveCachingIterator" => new RecursiveCachingIterator(), + "NoRewindIterator" => new NoRewindIterator(), + "AppendIterator" => new AppendIterator(), + "InfiniteIterator" => new InfiniteIterator(), + "RegexIterator" => new RegexIterator(), + "RecursiveRegexIterator" => new RecursiveRegexIterator(), + "EmptyIterator" => new EmptyIterator(), + "RecursiveTreeIterator" => new RecursiveTreeIterator(), + "ArrayObject" => new ArrayObject(), + "ArrayIterator" => new ArrayIterator(), + "RecursiveArrayIterator" => new RecursiveArrayIterator(), + "SplFileInfo" => new SplFileInfo(), + "DirectoryIterator" => new DirectoryIterator(), + "FilesystemIterator" => new FilesystemIterator(), + "RecursiveDirectoryIterator" => new RecursiveDirectoryIterator(), + "GlobIterator" => new GlobIterator(), + "HashContext" => new HashContext(), + "Closure" => new Closure(), + "Generator" => new Generator(), + */ +); + +// TODO randomize those as well +$ref_bool = true; +$ref_int = 1337; +$ref_string= "bla"; +$ref_array = array(1.0, 2, -3e3); +$ref_object = new StdClass(); +$ref_resource = fopen("/dev/null", "r"); +$ref_path = "/dev/null"; + + + +?> diff --git a/attributevalues.txt b/rules/attributevalues.txt similarity index 100% rename from attributevalues.txt rename to rules/attributevalues.txt diff --git a/rules/common.txt b/rules/common.txt new file mode 100644 index 0000000..34e78e4 --- /dev/null +++ b/rules/common.txt @@ -0,0 +1,335 @@ +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + + = + + = 32768 + = 65535 + = 65536 + = 1073741824 + = 536870912 + = 268435456 + = 4294967295 + = 2147483648 + = 2147483647 + = -2147483648 + = -1073741824 + = -32769 + + = 0 + = 0 + = 0 + = 1 + = 1 + = -1 + = + = + = + + = true + = false + + = + + = htmlvar0000 + = svgvar0000 + = mathmlvar0000 + = class + + = red + = green + = white + = black + = # + = rgb(,,) + + = a + = abbr + = acronym + = address + = applet + = area + = article + = aside + = audio + = b + = base + = basefont + = bdi + = bdo + = bgsound + = big + = blink + = blockquote + = body + = br + = button + = canvas + = caption + = center + = cite + = code + = col + = colgroup + = command + = content + = data + = datalist + = dd + = del + = details + = dfn + = dialog + = dir + = div + = dl + = dt + = element + = em + = embed + = fieldset + = figcaption + = figure + = font + = footer + = form + = frame + = frameset + = h1 + = h2 + = h3 + = h4 + = h5 + = h6 + = head + = header + = hgroup + = hr + = html + = i + = iframe + = image + = img + = input + = ins + = isindex + = kbd + = keygen + = label + = layer + = legend + = li + = link + = listing + = main + = map + = mark + = marquee + = menu + = menuitem + = meta + = meter + = multicol + = nav + = nobr + = noembed + = noframes + = nolayer + = noscript + = object + = ol + = optgroup + = option + = output + = p + = param + = picture + = plaintext + = pre + = progress + = q + = rp + = rt + = rtc + = ruby + = s + = samp + = script + = section + = select + = shadow + = small + = source + = spacer + = span + = strike + = strong + = style + = sub + = summary + = sup + = table + = tbody + = td + = template + = textarea + = tfoot + = th + = thead + = time + = title + = tr + = track + = tt + = u + = ul + = var + = video + = wbr + = xmp + + = a + = altGlyph + = altGlyphDef + = altGlyphItem + = animate + = animateColor + = animateMotion + = animateTransform + = circle + = clipPath + = cursor + = defs + = desc + = ellipse + = feBlend + = feColorMatrix + = feComponentTransfer + = feComposite + = feConvolveMatrix + = feDiffuseLighting + = feDisplacementMap + = feDistantLight + = feDropShadow + = feFlood + = feFuncA + = feFuncB + = feFuncG + = feFuncR + = feGaussianBlur + = feImage + = feMerge + = feMergeNode + = feMorphology + = feOffset + = fePointLight + = feSpecularLighting + = feSpotLight + = feTile + = feTurbulence + = filter + = font + = font_face + = font_face_format + = font_face_name + = font_face_src + = font_face_uri + = foreignObject + = g + = glyph + = glyphRef + = hkern + = image + = line + = linearGradient + = marker + = mask + = metadata + = missing_glyph + = mpath + = path + = pattern + = polygon + = polyline + = radialGradient + = rect + = script + = set + = stop + = style + = svg + = switch + = symbol + = text + = textPath + = title + = tref + = tspan + = use + = view + = vkern + + = annotation + = annotation-xml + = maction + = math + = merror + = mfrac + = mi + = mmultiscripts + = mn + = mo + = mover + = mpadded + = mphantom + = mprescripts + = mroot + = mrow + = ms + = mspace + = msqrt + = mstyle + = msub + = msubsup + = msup + = mtable + = mtd + = mtext + = mtr + = munder + = munderover + = none + = semantics + + + = + = + = + = data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7 + + = x + = data:image/gif;base64,R0lGODlhIAAgAPIBAGbMzP///wAAADOZZpn/zAAAAAAAAAAAACH5BAAAAAAALAAAAAAgACAAAAOLGLrc/k7ISau9S5DNu/8fICgaYJ5oqqbDGJRrLAMtScw468J5Xr+3nm8XFM5+PGMMWYwxcMyZ40iULQaDhSzqDGBNisGyuhUDrmNb72pWcaXhtpsM/27pVi8UX96rcQpDf3V+QD12d4NKK2+Lc4qOKI2RJ5OUNHyXSDRYnZ6foKAuLxelphMQqaoPCQA7 + + = x + = data:video/mp4;base64,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 + + = x + = data:audio/mp3;base64,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 + + = url('https://fonts.gstatic.com/s/roboto/v29/KFOmCnqEu92Fr1Mu72xKOzY.woff2')format('woff2') + = url('') + = local(Arial) + = local('') + = + = url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff') \ No newline at end of file diff --git a/css.txt b/rules/css.txt similarity index 96% rename from css.txt rename to rules/css.txt index bdc8570..f444b6c 100644 --- a/css.txt +++ b/rules/css.txt @@ -14,12 +14,9 @@ !include common.txt - = - = - = data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7 - = - = + = + = = :first-child = ::first-letter @@ -74,8 +71,29 @@ = :root = :empty +#at rules + = @font-face + #todo all rules - = { } + = { } + = { } + + = ; + = ; ; ; + = ; ; ; ; ; ; + + = ascent-override: + = descent-override: + = font-display: + = font-family: + = font-stretch: + = font-style: + = font-weight: + = line-gap-override: + = size-adjust: + = src: + = unicode-range: + = font-variant: = = @@ -387,7 +405,7 @@ = font-variant-ligatures = font-vendor = font-weight - = fonty-family + = gap = grid = grid-area = grid-auto-columns @@ -493,7 +511,6 @@ = overflow-wrap = overflow-x = overflow-y - = oxverflow = padding = padding-bottom = padding-left @@ -507,7 +524,6 @@ = perspective-origin = pointer-events = position - = postion = prince-hyphens = quotes = resize @@ -885,7 +901,7 @@ = = = - = + = = = = @@ -906,6 +922,7 @@ = = = + = = = = @@ -991,7 +1008,6 @@ = = = - = = = = @@ -1005,7 +1021,6 @@ = = = - = = = = @@ -1383,7 +1398,7 @@ = font-variant-ligatures: = font-vendor: = font-weight: - = fonty-family: + = gap: = grid: = grid-area: = grid-auto-columns: @@ -1489,7 +1504,6 @@ = overflow-wrap: = overflow-x: = overflow-y: - = oxverflow: = padding: = padding-bottom: = padding-left: @@ -1503,7 +1517,6 @@ = perspective-origin: = pointer-events: = position: - = postion: = prince-hyphens: = quotes: = resize: @@ -1589,5 +1602,5 @@ = z-index: = zoom: -!include cssproperties.txt +!include cssproperties.txt diff --git a/cssproperties.txt b/rules/cssproperties.txt similarity index 93% rename from cssproperties.txt rename to rules/cssproperties.txt index 142da4a..cf19dfc 100644 --- a/cssproperties.txt +++ b/rules/cssproperties.txt @@ -12,6 +12,69 @@ # limitations under the License. + = + = + = + = + = + + = url() + = linear-gradient() + = linear-gradient(to right top, ) + = radial-gradient() + = radial-gradient(farthest-side at px px, ) + = repeating-linear-gradient() + = repeating-linear-gradient(to bottom, ) + = repeating-linear-gradient(to top right, px) + = repeating-radial-gradient() + = repeating-radial-gradient(circle at center, ) + = repeating-radial-gradient(circle at center, px) + = conic-gradient() + = conic-gradient(from deg, ) + = conic-gradient(from .turn, ) + + = , + = deg, , + = , , , , + = , , , %, + = , , %, %, + = .turn, , %, + = % %, % % + + = image( ) + = image() + = image('') + = image(ltr ) + = image(rtl '' ) + = image() + = image(ltr ) + + = + = xywh=,,, + = xywh=pixel:,,, + = xywh=percent:,,, + + = cross-fade + = -webkit-cross-fade + + = (, ) + = (, , %) + = ( %, ) + = ( %, %) + = ( %, %, %) + + = -webkit-image-set + = image-set + + = () + = ( x type(\"\")) + = ( dpcm) + = ( dpi type(\"image/jpeg\")) + = ( x, x type(\"\")) + = ( x type(\"image/avif\"), dpi type(\"image/jpeg\")) + = ( x type(\"image/jpeg\"), dpcm type(\"\"), dpi) + = ( x, x, x, x) + = center = 'frac' 1, 'dlig' 1 @@ -339,6 +402,7 @@ = flow1 = = + = = 'dlig' = 'dlig' 0 @@ -387,6 +451,7 @@ = normal = after-white-space + = inherit = @@ -450,6 +515,7 @@ = copy = url() + = = none = border-box @@ -514,6 +580,7 @@ = url() = inset(px px px px) + = = @@ -850,6 +917,7 @@ = = url() + = = border-box = content-box @@ -998,9 +1066,19 @@ = url() stretch = url() fill = url() round + = + = + = + = + = + = = = px + = % + = rem + = px + = % % % = inherit = @@ -1015,18 +1093,31 @@ = inherit = repeat repeat = initial + = space + = space round + = repeat space = fill + = + = = % = + = fill + = % % % = fill = url() + = = = px = inherit = + = auto + = % + = rem + = em + = % em em % = px solid = px dashed @@ -1802,6 +1893,7 @@ = HiraMinProN-W = 'hiragino mincho pron' = 'times' + = '' = 'smcp' = 'frac' , 'dlig' @@ -1809,6 +1901,7 @@ = 'smcp' = 'liga' = 'liga' + = '' = normal = none @@ -1847,27 +1940,40 @@ = % = none + = ex-height + = cap-height + = ch-width + = ic-width + = ic-height + = - = ultra-condensed - = extra-condensed - = condensed - = semi-condensed - = normal - = semi-expanded - = expanded - = extra-expanded - = ultra-expanded + = ultra-condensed + = extra-condensed + = condensed + = semi-condensed + = normal + = semi-expanded + = expanded + = extra-expanded + = ultra-expanded + = % + = + = = normal = italic = oblique = none = inherit + = oblique deg + = oblique deg deg +#TODO - more font-variant values to add = small-caps = normal = all + = none = small-caps garbage = small-caps auto @@ -1883,17 +1989,28 @@ = any - = bolder - = lighter - = - = bold - = normal - = inherit - = - = unset - = px + = bolder + = lighter + = + = bold + = normal + = inherit + = + = unset + = px + = + = + + + = px px + = % % + = px + = % + = px px px + = none + = normal + = - = Times = px/px px = px px/px @@ -2210,6 +2327,7 @@ = none = from-image + = none = pixelated = -webkit-optimize-contrast @@ -2343,6 +2461,11 @@ = before-white-space = after-white-space + = auto + = loose + = normal + = strict + = anywhere = px = @@ -2361,7 +2484,8 @@ = inside = inherit - = url() + = url + = = none = inside @@ -2813,8 +2937,6 @@ = -webkit-paged-x = overlay - = hidden - = = em = px @@ -2906,8 +3028,6 @@ = sticky = px - = relative - = auto = '{' '}' @@ -3113,6 +3233,7 @@ = polygon( , px px, px ) = polygon( px, px, px px) content-box = polygon(nonzero, px px) + = = px = px @@ -3669,3 +3790,41 @@ = auto = reset +# @font-face specific descriptor properties + = normal + = % + + = normal + = % + + = auto + = block + = swap + = fallback + = optional + + = normal + = % + + = % + + = + = , + + = + = + + = format('woff') + = format('woff2') + = format('truetype') + = format('opentype') + = format('') + + = + = + + = U+ + = U+ + = U+?? + = U+00125-001FF + diff --git a/html.txt b/rules/html.txt similarity index 97% rename from html.txt rename to rules/html.txt index bd5ecf7..6e49cf1 100644 --- a/html.txt +++ b/rules/html.txt @@ -234,6 +234,7 @@ # = = + = = = @@ -971,7 +972,7 @@ = bdo /bdo = bgsound /bgsound = big /big - = blink /big + = blink /blink = blockquote /blockquote = br /br = button /button @@ -984,7 +985,7 @@ = colgroup /colgroup = command /command = content /content - = data /command + = data /data = datalist /datalist = dd /dd = del /del @@ -1034,7 +1035,7 @@ = mark /mark = marquee /marquee = menu /menu - = menuitem /menu + = menuitem /menuitem = meta /meta = meter /meter = nav /nav @@ -1065,7 +1066,7 @@ = shadow /shadow = small /small = source /source - = spacer /strike + = spacer /spacer = span /span = strike /strike = strong /strong @@ -1081,7 +1082,7 @@ = tfoot /tfoot = th /th = thead /thead - = time /tt + = time /time = title /title = tr /tr = track /track @@ -1095,4 +1096,6 @@ !include svg.txt !include svgattrvalues.txt +!include mathml.txt +!include mathmlattrvalues.txt diff --git a/js.txt b/rules/js.txt similarity index 94% rename from js.txt rename to rules/js.txt index e6f5081..719d410 100644 --- a/js.txt +++ b/rules/js.txt @@ -1097,6 +1097,8 @@ #HTMLAreaElement !extends HTMLAreaElement Element = ; + = .accessKey; +.accessKey = ""; = .alt; .alt = ""; = .coords; @@ -2222,12 +2224,21 @@ .onloadingdone = ; = .onloadingerror; .onloadingerror = ; - = .load(); - = .load(,); - = .check(); - = .check(,); = .ready; = .status; +.add(); +#TODO: check + = .check(); + = .check(,); +.clear(); +.delete(); +#TODO: entries, forEach, has, keys, load, values + = .load(); + = .load(,); + = new FontFaceSet(); + = new FontFaceSet(); + = new FontFaceSet([, , ]); + = new FontFaceSet(); #CSS .registerProperty(); @@ -2254,13 +2265,16 @@ #FontFace = .family; -.family = ; +.family = ""; = .style; .style = ""; +.style = ; = .weight; .weight = ; = .stretch; .stretch = ; + = .display; +.display = ; = .unicodeRange; .unicodeRange = ; = .variant; @@ -2270,6 +2284,13 @@ = .status; = .load(); = .loaded; + = new Array(); + + = .src; +.src = ""; + = new FontFace("", "", {}); + = new FontFace("", "", {}); + = new FontFace("", "", {, , }); #CSSViewportRule !extends CSSViewportRule CSSRule @@ -2427,7 +2448,6 @@ = ; = .fontfaces; - #Attr = .namespaceURI; = .prefix; @@ -4254,7 +4274,6 @@ .setProperty("font-variant-ligatures", ""); .setProperty("font-vendor", ""); .setProperty("font-weight", ""); -.setProperty("fonty-family", ""); .setProperty("grid", ""); .setProperty("grid-area", ""); .setProperty("grid-auto-columns", ""); @@ -4360,7 +4379,6 @@ .setProperty("overflow-wrap", ""); .setProperty("overflow-x", ""); .setProperty("overflow-y", ""); -.setProperty("oxverflow", ""); .setProperty("padding", ""); .setProperty("padding-bottom", ""); .setProperty("padding-left", ""); @@ -4374,7 +4392,6 @@ .setProperty("perspective-origin", ""); .setProperty("pointer-events", ""); .setProperty("position", ""); -.setProperty("postion", ""); .setProperty("prince-hyphens", ""); .setProperty("quotes", ""); .setProperty("resize", ""); @@ -5834,6 +5851,431 @@ document.all[%document.all.length].appendChild(); = .style; = .style; +################################################ +#MathML +################################################ + +!extends MathMLElement GlobalEventHandlers + = ; + +!extends MathMLElement EventTarget +#NodeList + = .item(%.length); + = .length; + +#Node + = .nodeType; + = .nodeName; + = .baseURI; + = .isConnected; + = .ownerDocument; + = .parentNode; + = .parentElement; + = .hasChildNodes(); + = .childNodes; + = .firstChild; + = .lastChild; + = .previousSibling; + = .nextSibling; + = .getRootNode(); + = .getRootNode(); + = .nodeValue; +.nodeValue = ; + = .textContent; +.textContent = ; +.normalize(); + = .cloneNode(); + = .cloneNode(); + = .isEqualNode(); + = .isSameNode(); + = .compareDocumentPosition(); + = .contains(); + = .lookupPrefix(); + = .lookupNamespaceURI(); + = .isDefaultNamespace(); + = .insertBefore(,.childNodes[%.childNodes.length]); + = .appendChild(); + = .replaceChild(,.childNodes[%.childNodes.length]); + = .removeChild(.childNodes[%.childNodes.length]); + +#ChildNode +.before(); +.before(); +.after(); +.after(); +.replaceWith(); +.replaceWith(); +.remove(); + +#ParentNode + = .children; + = .firstElementChild; + = .lastElementChild; + = .childElementCount; +.prepend(); +.prepend(); +.append(); +.append(); + = .querySelector(""); + = .querySelectorAll(""); + +#NonDocumentTypeChildNode + = .previousElementSibling; + = .nextElementSibling; + +#Element + = .namespaceURI; + = .prefix; + = .localName; + = .tagName; + = .id; +.id = ; + = .className; +.className = ; + = .classList; +.setPointerCapture(); +.releasePointerCapture(); + = .ongotpointercapture; +.ongotpointercapture = ; + = .onlostpointercapture; +.onlostpointercapture = ; + = .hasPointerCapture(); + = .hasAttributes(); + = .attributes; + = .getAttribute(); + = .getAttributeNS("http://www.w3.org/2000/svg",); +#.setAttribute(,); +#.setAttributeNS(,,); +.removeAttribute(.attributes[%.attributes.length].name); +.removeAttributeNS("http://www.w3.org/2000/svg",.attributes[%.attributes.length].name); + = .hasAttribute(); + = .hasAttributeNS("http://www.w3.org/2000/svg",); + = .getAttributeNode(); + = .getAttributeNodeNS("http://www.w3.org/2000/svg",); + = .setAttributeNode(); + = .setAttributeNodeNS(); + = .removeAttributeNode(.attributes[%.attributes.length].name); + = .closest(); + = .matches(); + = .webkitMatchesSelector(); + = .getElementsByTagName(); + = .getElementsByTagNameNS("http://www.w3.org/2000/svg",); + = .getElementsByClassName(""); + = .insertAdjacentElement(,); +.insertAdjacentText(,); + = .innerHTML; +.innerHTML = ; + = .outerHTML; +.outerHTML = ; +.insertAdjacentHTML(,); + = .createShadowRoot(); + = .attachShadow(); + = .getDestinationInsertionPoints(); + = .shadowRoot; + = .slot; +.slot = ; + = .assignedSlot; +.requestPointerLock(); + = .getClientRects(); + = .getBoundingClientRect(); +.scrollIntoView(); +.scrollIntoView(); +.scroll(); +.scroll(); +.scroll(,); +.scrollTo(); +.scrollTo(); +.scrollTo(,); +.scrollBy(); +.scrollBy(); +.scrollBy(,); + = .scrollTop; +.scrollTop = ; + = .scrollLeft; +.scrollLeft = ; + = .scrollWidth; + = .scrollHeight; + = .clientTop; + = .clientLeft; + = .clientWidth; + = .clientHeight; +.setApplyScroll(,); +.setDistributeScroll(,); +.scrollIntoViewIfNeeded(); +.scrollIntoViewIfNeeded(); + = .computedRole; + = .computedName; + = .onbeforecopy; +.onbeforecopy = ; + = .onbeforecut; +.onbeforecut = ; + = .onbeforepaste; +.onbeforepaste = ; + = .oncopy; +.oncopy = ; + = .oncut; +.oncut = ; + = .onpaste; +.onpaste = ; + = .onsearch; +.onsearch = ; + = .onselectstart; +.onselectstart = ; + = .onwheel; +.onwheel = ; + +.setAttribute("display", ""); +.setAttribute("form", ""); +.setAttribute("fence", ""); +.setAttribute("separator", ""); +.setAttribute("lspace", ""); +.setAttribute("rspace", ""); +.setAttribute("stretchy", ""); +.setAttribute("symmetric", ""); +.setAttribute("maxsize", ""); +.setAttribute("minsize", ""); +.setAttribute("largeop", ""); +.setAttribute("movablelimits", ""); +.setAttribute("mfrac_linethickness", ""); +.setAttribute("width", ""); +.setAttribute("height", ""); +.setAttribute("depth", ""); +.setAttribute("lspace", ""); +.setAttribute("voffset", ""); +.setAttribute("accent", ""); +.setAttribute("accentunder", ""); +.setAttribute("columnspan", ""); +.setAttribute("rowspan", ""); +.setAttribute("actiontype", ""); +.setAttribute("selection", ""); +.setAttribute("encoding", ""); +.setAttribute("class", ""); +.setAttribute("dir", ""); +.setAttribute("displaystyle", ""); +.setAttribute("mathbackground", ""); +.setAttribute("mathcolor", ""); +.setAttribute("mathsize", ""); +.setAttribute("mathvariant", ""); +.setAttribute("nonce", ""); +.setAttribute("scriptlevel", ""); +.setAttribute("style", ""); +.setAttribute("tabindex", ""); + + = .style; + = .style; + = .style; + = .style; + = .style; + = .style; + = .style; + = .style; + = .style; + +.prop = { toString: }; +.toString = ; + +setTimeout(, ); + +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); +freememory(); !end lines diff --git a/jshelpers.txt b/rules/jshelpers.txt similarity index 93% rename from jshelpers.txt rename to rules/jshelpers.txt index 0b96c8c..af4413e 100644 --- a/jshelpers.txt +++ b/rules/jshelpers.txt @@ -12,6 +12,9 @@ # limitations under the License. + = 0 + = 100 + = "x" = "foo" = "data:text/html,foo" @@ -23,6 +26,7 @@ = "" = "" + = "" = "abbr" = "accept" @@ -909,6 +913,43 @@ = "z" = "zoomAndPan" + = "class" + = "dir" + = "displaystyle" + = "mathbackground" + = "mathcolor" + = "mathsize" + = "mathvariant" + = "nonce" + = "scriptlevel" + = "style" + = "tabindex" + = "display" + = "form" + = "fence" + = "separator" + = "lspace" + = "rspace" + = "stretchy" + = "symmetric" + = "maxsize" + = "minsize" + = "largeop" + = "movablelimits" + = "linethickness" + = "width" + = "height" + = "depth" + = "lspace" + = "voffset" + = "accent" + = "accentunder" + = "columnspan" + = "rowspan" + = "actiontype" + = "selection" + = "encoding" + = "-ms-flex-align" = "-ms-font-feature-settings" = "-ms-text-combine-horizontal" @@ -1201,7 +1242,6 @@ = "font-variant-ligatures" = "font-vendor" = "font-weight" - = "fonty-family" = "grid" = "grid-area" = "grid-auto-columns" @@ -1307,7 +1347,6 @@ = "overflow-wrap" = "overflow-x" = "overflow-y" - = "oxverflow" = "padding" = "padding-bottom" = "padding-left" @@ -1321,7 +1360,6 @@ = "perspective-origin" = "pointer-events" = "position" - = "postion" = "prince-hyphens" = "quotes" = "resize" @@ -1699,7 +1737,6 @@ = "" = "" = "" - = "" = "" = "" = "" @@ -1805,7 +1842,6 @@ = "" = "" = "" - = "" = "" = "" = "" @@ -1819,7 +1855,6 @@ = "" = "" = "" - = "" = "" = "" = "" @@ -2188,10 +2223,18 @@ !include attributevalues.txt !include svgattrvalues.txt - - = - = - = data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7 +!include mathmlattrvalues.txt + + = "ascent-override": "" + = "descent-override": "" + = "font-display": "" + = "font-family": "" + = "font-stretch": "" + = "font-style": "" + = "font-weight": "" + = "line-gap-override": "" + = "size-adjust": "" + = "unicode-range": "" !include cssproperties.txt @@ -2215,9 +2258,11 @@ = { : [, ] }; = { : [, ] }; = { : [, ] }; + = { : [, ] }; = { : [, ] }; = { : [, ] }; = { : [, ] }; + = { : [, ] }; = sequence_StaticRange[0]; = new Array(); = sequence_FontFace_[0]; @@ -2328,8 +2373,10 @@ = {prototype: .prototype}; = {prototype: .prototype, extends: }; = {prototype: .prototype, extends: }; + = {prototype: .prototype, extends: }; = {extends: }; = {extends: }; + = {extends: }; = new Int8Array(); = new Int16Array(); @@ -2612,6 +2659,39 @@ = document.createElementNS("http://www.w3.org/2000/svg", "switch"); = document.createElementNS("http://www.w3.org/2000/svg", "clipPath"); +#MathMLElement constructors + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "annotation"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "annotation-xml"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "maction"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "math"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "merror"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mfrac"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mi"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mmultiscripts"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mn"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mo"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mover"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mpadded"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mphantom"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mprescripts"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mroot"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mrow"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "ms"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "msqrt"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mstyle"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "msub"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "msubsup"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "msup"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mtable"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mtd"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mtext"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mtr"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "munder"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "munderover"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "none"); + = document.createElementNS("http://www.w3.org/1998/Math/MathML", "semantics"); + #events = document.createEvent("InputEvent"); = document.createEvent("PointerEvent"); diff --git a/rules/mathml.txt b/rules/mathml.txt new file mode 100644 index 0000000..0840aad --- /dev/null +++ b/rules/mathml.txt @@ -0,0 +1,217 @@ +# Copyright 2022 Igalia S.L. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# https://w3c.github.io/mathml-core/#the-top-level-math-element + = math /math + = + = display="" + + = + = + +# A valid MathML child for most MathML elements. + = + = + = + = + = + = + = + = + = + = + = + = + = + = + = + = + +# A valid list of MathML children for most MathML elements. + = + = + +# https://w3c.github.io/mathml-core/#token-elements + = + = + = + = + = + = + +# Interesting content for token elements is generally a single letter or symbol. + = + = + +# Elements behaving more or less like an . + = + = + = + = + = + +# https://w3c.github.io/mathml-core/#text-mtext + = mtext /mtext + +# https://w3c.github.io/mathml-core/#identifier-mi + = mi /mi + +# https://w3c.github.io/mathml-core/#number-mn + = mn /mn + +# https://w3c.github.io/mathml-core/#operator-fence-separator-or-accent-mo + = mo /mo + = + = form="" + = fence="" + = separator="" + = lspace="" + = rspace="" + = stretchy="" + = symmetric="" + = maxsize="" + = minsize="" + = largeop="" + = movablelimits="" + +# Interesting content for mo are large and stretchy operators. + = + = ∫ + = ∑ + = { + = | + = → + = _ + +# https://w3c.github.io/mathml-core/#space-mspace + = mspace / + = + = width="" + = height="" + = depth="" + +# https://w3c.github.io/mathml-core/#string-literal-ms + = ms /ms + +# https://w3c.github.io/mathml-core/#horizontally-group-sub-expressions-mrow + = mrow /mrow + +# https://w3c.github.io/mathml-core/#fractions-mfrac + = mfrac /mfrac + = + = linethickness="" + +# https://w3c.github.io/mathml-core/#radicals-msqrt-mroot + = msqrt /msqrt + = mroot /mroot + +# https://w3c.github.io/mathml-core/#style-change-mstyle + = mstyle /mstyle + +# https://w3c.github.io/mathml-core/#error-message-merror + = merror /merror + +# https://w3c.github.io/mathml-core/#adjust-space-around-content-mpadded + = mpadded /mpadded + = + = width="" + = height="" + = depth="" + = lspace="" + = voffset="" + +# https://w3c.github.io/mathml-core/#making-sub-expressions-invisible-mphantom + = mphantom /mphantom + +# https://w3c.github.io/mathml-core/#subscripts-and-superscripts-msub-msup-msubsup + = msub /msub + = msup /msup + = msubsup /msubsup + +# https://w3c.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover + = munder /munder + = mover /mover + = munderover /munderover + + = + = + = + + = accent="" + = accentunder="" + +# https://w3c.github.io/mathml-core/#prescripts-and-tensor-indices-mmultiscripts + = mmultiscripts /mmultiscripts + = + = mprescripts / + = none / + + = + = + + = + = + +# https://w3c.github.io/mathml-core/#table-or-matrix-mtable + = mtable /mtable + = + = + +# https://w3c.github.io/mathml-core/#row-in-table-or-matrix-mtr + = mtr /mtr + = + = + +# https://w3c.github.io/mathml-core/#entry-in-table-or-matrix-mtd + = mtd /mtd + = + = columnspan="" + = rowspan="" + +# https://w3c.github.io/mathml-core/#enlivening-expressions + = maction /maction + = + = actiontype="" + = selection="" + +# https://w3c.github.io/mathml-core/#semantics-and-presentation + = semantics /semantics + = + + = + = + + = + = + + = annotation /annotation + = annotation-xml /annotation-xml + + = encoding="" + +# https://w3c.github.io/mathml-core/#global-attributes + = + = class="" + = dir="" + = displaystyle="" +# = id="" + = mathbackground="" + = mathcolor="" + = mathsize="" + = mathvariant="" + = nonce="" + = scriptlevel="" + = style="" + = tabindex="" + = + = diff --git a/rules/mathmlattrvalues.txt b/rules/mathmlattrvalues.txt new file mode 100644 index 0000000..de8d891 --- /dev/null +++ b/rules/mathmlattrvalues.txt @@ -0,0 +1,60 @@ +# Copyright 2022 Igalia S.L. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# https://w3c.github.io/mathml-core/#dfn-length-percentage + = px + = % + +# https://w3c.github.io/mathml-core/#the-top-level-math-element + = inline + = block + +# https://w3c.github.io/mathml-core/#dfn-mathvariant + = normal + = bold + = italic + = bold-italic + = double-struck + = bold-fraktur + = script + = bold-script + = fraktur + = sans-serif + = bold-sans-serif + = sans-serif-italic + = sans-serif-bold-italic + = monospace + = initial + = tailed + = looped + = stretched + +# https://w3c.github.io/mathml-core/#dfn-scriptlevel + = + +# https://w3c.github.io/mathml-core/#dfn-form + = infix + = prefix + = postfix + +# https://w3c.github.io/mathml-core/#fractions-mfrac +# An interesting value for linethickness is 0px. + = + = 0px + +# https://www.w3.org/TR/MathML3/chapter3.html#presm.maction + = toggle + = statusline + = tooltip + = input + = diff --git a/svg.txt b/rules/svg.txt similarity index 100% rename from svg.txt rename to rules/svg.txt diff --git a/svgattrvalues.txt b/rules/svgattrvalues.txt similarity index 100% rename from svgattrvalues.txt rename to rules/svgattrvalues.txt diff --git a/tagattributes.txt b/rules/tagattributes.txt similarity index 100% rename from tagattributes.txt rename to rules/tagattributes.txt diff --git a/svg_tags.py b/svg_tags.py new file mode 100644 index 0000000..b96589f --- /dev/null +++ b/svg_tags.py @@ -0,0 +1,109 @@ +# Domato - SVG types +# -------------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# A map from tag name to corresponding type for SVG tags +_SVG_TYPES = { + 'a': 'SVGAElement', + 'altGlyph': 'SVGElement', + 'altGlyphDef': 'SVGElement', + 'altGlyphItem': 'SVGElement', + 'animate': 'SVGAnimateElement', + 'animateColor': 'SVGElement', + 'animateMotion': 'SVGAnimateMotionElement', + 'animateTransform': 'SVGAnimateTransformElement', + 'circle': 'SVGCircleElement', + 'clipPath': 'SVGClipPathElement', + 'color-profile': 'SVGElement', + 'cursor': 'SVGCursorElement', + 'defs': 'SVGDefsElement', + 'desc': 'SVGDescElement', + 'discard': 'SVGDiscardElement', + 'ellipse': 'SVGEllipseElement', + 'feBlend': 'SVGFEBlendElement', + 'feColorMatrix': 'SVGFEColorMatrixElement', + 'feComponentTransfer': 'SVGFEComponentTransferElement', + 'feComposite': 'SVGFECompositeElement', + 'feConvolveMatrix': 'SVGFEConvolveMatrixElement', + 'feDiffuseLighting': 'SVGFEDiffuseLightingElement', + 'feDisplacementMap': 'SVGFEDisplacementMapElement', + 'feDistantLight': 'SVGFEDistantLightElement', + 'feDropShadow': 'SVGFEDropShadowElement', + 'feFlood': 'SVGFEFloodElement', + 'feFuncA': 'SVGFEFuncAElement', + 'feFuncB': 'SVGFEFuncBElement', + 'feFuncG': 'SVGFEFuncGElement', + 'feFuncR': 'SVGFEFuncRElement', + 'feGaussianBlur': 'SVGFEGaussianBlurElement', + 'feImage': 'SVGFEImageElement', + 'feMerge': 'SVGFEMergeElement', + 'feMergeNode': 'SVGFEMergeNodeElement', + 'feMorphology': 'SVGFEMorphologyElement', + 'feOffset': 'SVGFEOffsetElement', + 'fePointLight': 'SVGFEPointLightElement', + 'feSpecularLighting': 'SVGFESpecularLightingElement', + 'feSpotLight': 'SVGFESpotLightElement', + 'feTile': 'SVGFETileElement', + 'feTurbulence': 'SVGFETurbulenceElement', + 'filter': 'SVGFilterElement', + 'font': 'SVGElement', + 'font-face': 'SVGElement', + 'font-face-format': 'SVGElement', + 'font-face-name': 'SVGElement', + 'font-face-src': 'SVGElement', + 'font-face-uri': 'SVGElement', + 'foreignObject': 'SVGForeignObjectElement', + 'g': 'SVGGElement', + 'glyph': 'SVGElement', + 'glyphRef': 'SVGElement', + 'hatch': 'SVGElement', + 'hatchpath': 'SVGElement', + 'hkern': 'SVGElement', + 'image': 'SVGImageElement', + 'line': 'SVGLineElement', + 'linearGradient': 'SVGLinearGradientElement', + 'marker': 'SVGMarkerElement', + 'mask': 'SVGMaskElement', + 'mesh': 'SVGElement', + 'meshgradient': 'SVGElement', + 'meshpatch': 'SVGElement', + 'meshrow': 'SVGElement', + 'metadata': 'SVGMetadataElement', + 'missing-glyph': 'SVGElement', + 'mpath': 'SVGMPathElement', + 'path': 'SVGPathElement', + 'pattern': 'SVGPatternElement', + 'polygon': 'SVGPolygonElement', + 'polyline': 'SVGPolylineElement', + 'radialGradient': 'SVGRadialGradientElement', + 'rect': 'SVGRectElement', + 'set': 'SVGSetElement', + 'svg': 'SVGSVGElement', + 'solidcolor': 'SVGElement', + 'stop': 'SVGStopElement', + 'switch': 'SVGSwitchElement', + 'symbol': 'SVGSymbolElement', + 'text': 'SVGTextElement', + 'textPath': 'SVGTextPathElement', + 'title': 'SVGTitleElement', + 'tref': 'SVGElement', + 'tspan': 'SVGTSpanElement', + 'unknown': 'SVGElement', + 'use': 'SVGUseElement', + 'view': 'SVGViewElement', + 'vkern': 'SVGElement' +} diff --git a/template.html b/template.html index f686596..51f06e4 100755 --- a/template.html +++ b/template.html @@ -10,6 +10,8 @@ function freememory() { try { CollectGarbage(); } catch(err) { } + try { FuzzingFunctions.garbageCollect(); } catch(err) { } + try { FuzzingFunctions.cycleCollect(); } catch(err) { } try { window.gc(); } catch(err) { } } diff --git a/vbscript/README.md b/vbscript/README.md new file mode 100644 index 0000000..4fb1413 --- /dev/null +++ b/vbscript/README.md @@ -0,0 +1,3 @@ +Script and grammar for fuzzing Microsoft VBScript engine. + +Usage is the same as for DOM fuzzing. diff --git a/vbscript/generator.py b/vbscript/generator.py new file mode 100755 index 0000000..e5ff0c8 --- /dev/null +++ b/vbscript/generator.py @@ -0,0 +1,146 @@ +# Domato - main generator script +# ------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import print_function +import os +import re +import random +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) +sys.path.append(parent_dir) +from grammar import Grammar + +_N_MAIN_LINES = 1000 +_N_EVENTHANDLER_LINES = 300 + +def generate_function_body(jsgrammar, num_lines): + js = jsgrammar._generate_code(num_lines) + return js + +def GenerateNewSample(template, jsgrammar): + """Parses grammar rules from string. + + Args: + template: A template string. + htmlgrammar: Grammar for generating HTML code. + cssgrammar: Grammar for generating CSS code. + jsgrammar: Grammar for generating JS code. + + Returns: + A string containing sample data. + """ + + result = template + + handlers = False + while '' in result: + numlines = _N_MAIN_LINES + if handlers: + numlines = _N_EVENTHANDLER_LINES + else: + handlers = True + result = result.replace( + '', + generate_function_body(jsgrammar, numlines), + 1 + ) + + return result + + +def generate_samples(grammar_dir, outfiles): + """Generates a set of samples and writes them to the output files. + + Args: + grammar_dir: directory to load grammar files from. + outfiles: A list of output filenames. + """ + + f = open(os.path.join(grammar_dir, 'template.html')) + template = f.read() + f.close() + + jsgrammar = Grammar() + err = jsgrammar.parse_from_file(os.path.join(grammar_dir, 'vbscript.txt')) + if err > 0: + print('There were errors parsing grammar') + return + + for outfile in outfiles: + result = GenerateNewSample(template, jsgrammar) + + if result is not None: + print('Writing a sample to ' + outfile) + try: + f = open(outfile, 'w') + f.write(result) + f.close() + except IOError: + print('Error writing to output') + + +def get_option(option_name): + for i in range(len(sys.argv)): + if (sys.argv[i] == option_name) and ((i + 1) < len(sys.argv)): + return sys.argv[i + 1] + elif sys.argv[i].startswith(option_name + '='): + return sys.argv[i][len(option_name) + 1:] + return None + + +def main(): + fuzzer_dir = os.path.dirname(__file__) + + multiple_samples = False + + for a in sys.argv: + if a.startswith('--output_dir='): + multiple_samples = True + if '--output_dir' in sys.argv: + multiple_samples = True + + if multiple_samples: + print('Running on ClusterFuzz') + out_dir = get_option('--output_dir') + nsamples = int(get_option('--no_of_files')) + print('Output directory: ' + out_dir) + print('Number of samples: ' + str(nsamples)) + + if not os.path.exists(out_dir): + os.mkdir(out_dir) + + outfiles = [] + for i in range(nsamples): + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) + + generate_samples(fuzzer_dir, outfiles) + + elif len(sys.argv) > 1: + outfile = sys.argv[1] + generate_samples(fuzzer_dir, [outfile]) + + else: + print('Arguments missing') + print("Usage:") + print("\tpython generator.py ") + print("\tpython generator.py --output_dir --no_of_files ") + +if __name__ == '__main__': + main() diff --git a/vbscript/template.html b/vbscript/template.html new file mode 100755 index 0000000..fc42c0c --- /dev/null +++ b/vbscript/template.html @@ -0,0 +1,731 @@ + + + + + + + + + diff --git a/vbscript/vbscript.txt b/vbscript/vbscript.txt new file mode 100755 index 0000000..9d00f26 --- /dev/null +++ b/vbscript/vbscript.txt @@ -0,0 +1,307 @@ + = + + = -1 + = 0 + = 1 + = 2 + = 0 + = 1 + = 2 + = 10 + = 100 + = 1000 +# = 1000000 + = + + = 536870911 + = 536870912 + = 1073741823 + = 1073741824 + = 2147483647 + = 2147483648 + = 4294967295 + = 4294967296 + + = property1 + = property2 + = property3 + = property4 + = property5 + + = property1 + = property2 + = property3 + = property4 + = property5 + = compareMode + = Pattern + = IgnoreCase + = Global + = Count + = FirstIndex + = Length + = Value + + = class1 + = class2 + = class3 + = class4 + = class5 + + = function1 + = function2 + + = sub1 + = sub2 + + = arg1 + = arg2 + = arg3 + = arg4 + = arg5 + + = Date + = Now + = Time + = Timer + + = + = + = + = + = + = + = + = True + = False + = + = + = + = "31-Jan-09" + + = + = & + = & & + = String(, ) + = 17 + = 65 + = 257 + = 1025 + = 4097 + = 65537 + = Chr() + = Chr() & Chr() + = Chr() & Chr() & Chr() + + = True + = False + + = var + = var + = var + = var + = var + = property + + = + = Set + +!begin lines + + = "aaaaaaaaaa" + = "aaaaaaaaaa" + = Array() + = Array(, , ) + = Array(, , , , ) +set = new +set = CreateObject("Scripting.Dictionary") +set = CreateObject("Scripting.Dictionary") +set = New RegExp + + = Me + = + = (, , , , ) + = .f(, , , , ) + = f(, , , , ) + = (, , , , ) + , , , , + +If IsObject() Then Set . = Else . = End if +If IsObject(.) Then Set = . Else = . End if +If IsObject() Then Set . = Else . = End if +If IsObject(.) Then Set = . Else = . End if +If IsObject() Then Set . = Else . = End if +If IsObject(.) Then Set = . Else = . End if +If IsObject() Then Set . = Else . = End if +If IsObject(.) Then Set = . Else = . End if +If IsObject() Then Set . = Else . = End if +If IsObject(.) Then Set = . Else = . End if + = . +. = + + +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +If IsObject() Then Set () = Else () = End if +If IsObject(()) Then Set = () Else = () End if +() = + = () +(, ) = + = (, ) +(, ) = + = (, ) + +Set = GetRef("") + +Eval() + = CreateObject() + = TypeName() + +Erase + +ReDim () +ReDim Preserve () +ReDim () +ReDim Preserve () +ReDim (, ) +ReDim Preserve (, ) +ReDim (, ) +ReDim Preserve (, ) + +#string +InStr , +InStr , , +InStr , , , +InStrRev , +InStrRev , , +InStrRev , , , + = LCase() + = UCase() + = Left(, ) + = Right(, ) +Len() + = LTrim() + = RTrim() + = Trim() + = Mid(, ) + = Mid(, , ) + = Replace(, , ) + = Replace(, , , ) + = Replace(, , , , ) + = Replace(, , , , , ) + = Space() +StrComp , +StrComp , , + = String(, ) + = StrReverse() + +#Array + = Filter(, ) + = Filter(, , ) + = Filter(, , , ) + = Join() + = Join(, ) +LBound , +UBound , + = Split() + = Split(, ) + = Split(, , ) + = Split(, , , ) + +#dictionary +If IsObject() Then Set .Item("") = Else .Item("") = End if +If IsObject(.Item("")) Then Set = .Item("") Else = () End if +If IsObject() Then Set .Item("") = Else .Item("") = End if +If IsObject(.Item("")) Then Set = .Item("") Else = () End if +If IsObject() Then Set .Item("") = Else .Item("") = End if +If IsObject(.Item("")) Then Set = .Item("") Else = () End if +If IsObject() Then Set .Item("") = Else .Item("") = End if +If IsObject(.Item("")) Then Set = .Item("") Else = () End if +If IsObject() Then Set .Item("") = Else .Item("") = End if +If IsObject(.Item("")) Then Set = .Item("") Else = () End if + = .Item("") +.Item("") = + = .Item() +.Item() = +.Key("") = + = .Key("") +.Key() = + = .Key() +.add "", +.add , +.exists() + = .Items + = .Keys +.Remove("") +.Remove() +.RemoveAll + +#regexp +.Test() + = .Replace(, ) +Set var = .Execute() + = .Item(fuzzint) + +# set return value +f1 = +f2 = +f = +x = + +#date and time + = + = CDate(param) +# = DateAdd(, , ) +# = DateDiff(, , ) +# = DateDiff(, , , ) +# = DateDiff(, , , , ) +# = DatePart(, ) +# = DatePart(, , ) +# = DatePart(, , , ) + = DateSerial(, , ) + = DateValue() + = Day() + = Hour() + = Minute() + = Second() + = Month() + = Year() + = MonthName() + = MonthName(, ) + = FormatDateTime(, ) + = TimeSerial(, , ) + = TimeValue() + = Weekday() + = Weekday(, ) + = WeekdayName() + = WeekdayName(, ) + = WeekdayName(, , ) + + = Atn() + = mod + +!end lines diff --git a/webgl/generator.py b/webgl/generator.py new file mode 100644 index 0000000..3cb7aa4 --- /dev/null +++ b/webgl/generator.py @@ -0,0 +1,148 @@ +# Domato - main generator script +# ------------------------------- +# +# Written and maintained by Ivan Fratric +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import print_function +import os +import re +import random +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) +sys.path.append(parent_dir) +from grammar import Grammar + +_N_MAIN_LINES = 100 +_N_EVENTHANDLER_LINES = 1 + +def generate_function_body(jsgrammar, num_lines): + js = '' + js += jsgrammar._generate_code(num_lines) + + return js + +def GenerateNewSample(template, jsgrammar): + """Parses grammar rules from string. + + Args: + template: A template string. + htmlgrammar: Grammar for generating HTML code. + cssgrammar: Grammar for generating CSS code. + jsgrammar: Grammar for generating JS code. + + Returns: + A string containing sample data. + """ + + result = template + handlers = False + while '' in result: + numlines = _N_MAIN_LINES + if handlers: + numlines = _N_EVENTHANDLER_LINES + else: + handlers = True + result = result.replace( + '', + generate_function_body(jsgrammar, numlines), + 1 + ) + + return result + + +def generate_samples(grammar_dir, outfiles): + """Generates a set of samples and writes them to the output files. + + Args: + grammar_dir: directory to load grammar files from. + outfiles: A list of output filenames. + """ + + f = open(os.path.join(grammar_dir, 'template.html')) + template = f.read() + f.close() + + jsgrammar = Grammar() + err = jsgrammar.parse_from_file(os.path.join(grammar_dir, 'webgl.txt')) + if err > 0: + print('There were errors parsing grammar') + return + + for outfile in outfiles: + + result = GenerateNewSample(template, jsgrammar) + + if result is not None: + print('Writing a sample to ' + outfile) + try: + f = open(outfile, 'w') + f.write(result) + f.close() + except IOError: + print('Error writing to output') + + +def get_option(option_name): + for i in range(len(sys.argv)): + if (sys.argv[i] == option_name) and ((i + 1) < len(sys.argv)): + return sys.argv[i + 1] + elif sys.argv[i].startswith(option_name + '='): + return sys.argv[i][len(option_name) + 1:] + return None + + +def main(): + fuzzer_dir = os.path.dirname(__file__) + + multiple_samples = False + + for a in sys.argv: + if a.startswith('--output_dir='): + multiple_samples = True + if '--output_dir' in sys.argv: + multiple_samples = True + + if multiple_samples: + print('Running on ClusterFuzz') + out_dir = get_option('--output_dir') + nsamples = int(get_option('--no_of_files')) + print('Output directory: ' + out_dir) + print('Number of samples: ' + str(nsamples)) + + if not os.path.exists(out_dir): + os.mkdir(out_dir) + + outfiles = [] + for i in range(nsamples): + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) + + generate_samples(fuzzer_dir, outfiles) + + elif len(sys.argv) > 1: + outfile = sys.argv[1] + generate_samples(fuzzer_dir, [outfile]) + + else: + print('Arguments missing') + print("Usage:") + print("\tpython generator.py ") + print("\tpython generator.py --output_dir --no_of_files ") + +if __name__ == '__main__': + main() diff --git a/webgl/template.html b/webgl/template.html new file mode 100644 index 0000000..0c8ec92 --- /dev/null +++ b/webgl/template.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + diff --git a/webgl/webgl.txt b/webgl/webgl.txt new file mode 100644 index 0000000..bdd9d87 --- /dev/null +++ b/webgl/webgl.txt @@ -0,0 +1,655 @@ + + = true + = false + + = true + = false + + = + = + = + = + = + + = gl.LINEAR + = gl.LINEAR_MIPMAP_NEAREST + = + + = gl1 + = gl2 + + = program1 + = program2 + + = tex1 + = tex2 + + = buffer1 + = buffer2 + + = 0 + = 1 + = 2 + = 4 + = 8 + = 16 + = 32 + = 64 + = 128 + + = 0 + = 1 + = 2 + = 4 + = 8 + = 16 + = 32 + = 64 + = 128 + + = 0x7fffff00 + = 0x64 + = 0x3e8 + = 0x4141 + = 0xefff + = 0xaa + = 0xaf43 + = -0x5a + = true + = false + + = 536870911 + = 536870912 + = 1073741823 + = 1073741824 + = 2147483647 + = 2147483648 + = 4294967295 + = 4294967296 + + = + = + + = + + + = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + = 17 + = 65 + = 257 + = 1025 + = 4097 + = 65537 + = String.fromCharCode() + = String.fromCharCode().repeat() + + = 0.0 + = 0.000005 + = 0.0025 + = 0.1 + = 0.2 + = 0.255 + = 0.275 + = 0.3 + = 0.4 + = 0.5 + = 0.55 + = 0.75 + = 1.0 + + = 0.0 + = 0.000005 + = 0.0025 + = 0.1 + = 0.2 + = 0.255 + = 0.275 + = 0.3 + = 0.4 + = 0.5 + = 0.55 + = 0.75 + = 1.0 + + = 1110011 + = 1010011 + = 1000011 + = 1010001 + = 1010000 + + = gl.PACK_ALIGNMENT + = gl.UNPACK_ALIGNMENT + = gl.UNPACK_FLIP_Y_WEBGL + = gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL + = gl.UNPACK_COLORSPACE_CONVERSION_WEBGL + = gl.PACK_ROW_LENGTH + = gl.PACK_SKIP_PIXELS + = gl.PACK_SKIP_ROWS + = gl.UNPACK_ROW_LENGTH + = gl.UNPACK_IMAGE_HEIGHT + = gl.UNPACK_SKIP_PIXELS + = gl.UNPACK_SKIP_ROWS + = gl.UNPACK_SKIP_IMAGES + + = gl.STATIC_DRAW + = gl.DYNAMIC_DRAW + = gl.STREAM_DRAW + = gl.STATIC_READ + = gl.DYNAMIC_READ + = gl.STREAM_READ + = gl.STATIC_COPY + = gl.DYNAMIC_COPY + = gl.STREAM_COPY + + = gl.ACTIVE_TEXTURE + = gl.ALIASED_LINE_WIDTH_RANGE + = gl.ALIASED_POINT_SIZE_RANGE + = gl.ALPHA_BITS + = gl.ARRAY_BUFFER_BINDING + = gl.BLEND + = gl.BLEND_COLOR + = gl.BLEND_DST_ALPHA + = gl.BLEND_DST_RGB + = gl.BLEND_EQUATION + = gl.BLEND_EQUATION_ALPHA + = gl.BLEND_EQUATION_RGB + = gl.BLEND_SRC_ALPHA + = gl.BLEND_SRC_RGB + = gl.COLOR_CLEAR_VALUE + + = gl.TEXTURE_2D + = gl.TEXTURE_CUBE_MAP + = gl.TEXTURE_3D + = gl.COLOR_WRITEMASK + + = vShader4 + = vShader3 + = fShader3 + = fShader4 + + = VERTEX_SHADER + = FRAGMENT_SHADER + + = 'vColor' + = 'vDepth' + = 'oColor' + = 'oDepth' + = 'oVertex' + = 'oTexture' + = 'uScalingFactor' + = 'uGlobalColor' + = 'uRotationVector' + + = gl.ARRAY_BUFFER + = gl.ELEMENT_ARRAY_BUFFER + = gl.COPY_READ_BUFFER + = gl.COPY_WRITE_BUFFER + = gl.TRANSFORM_FEEDBACK_BUFFER + = gl.UNIFORM_BUFFER + = gl.PIXEL_PACK_BUFFER + = gl.PIXEL_UNPACK_BUFFER + + = gl.FRAMEBUFFER + = gl.DRAW_FRAMEBUFFER + = gl.READ_FRAMEBUFFER + + = gl.TEXTURE_2D + = gl.TEXTURE_CUBE_MAP + = gl.TEXTURE_3D + = gl.TEXTURE_2D_ARRAY + + = gl.FUNC_ADD + = gl.FUNC_SUBTRACT + = gl.FUNC_REVERSE_SUBTRACT + = gl.MIN + = gl.MAX + + = gl.FUNC_ADD + = gl.FUNC_SUBTRACT + = gl.FUNC_REVERSE_SUBTRACT + = gl.MIN + = gl.MAX + + = gl.ZERO + = gl.ONE + = gl.SRC_COLOR + = gl.ONE_MINUS_SRC_COLOR + = gl.DST_COLOR + = gl.ONE_MINUS_DST_COLOR + = gl.SRC_ALPHA + = gl.ONE_MINUS_SRC_ALPHA + = gl.DST_ALPHA + = gl.ONE_MINUS_DST_ALPHA + = gl.CONSTANT_COLOR + = gl.ONE_MINUS_CONSTANT_COLOR + = gl.CONSTANT_ALPHA + = gl.ONE_MINUS_CONSTANT_ALPHA + = gl.SRC_ALPHA_SATURATE + + = gl.ZERO + = gl.ONE + = gl.SRC_COLOR + = gl.ONE_MINUS_SRC_COLOR + = gl.DST_COLOR + = gl.ONE_MINUS_DST_COLOR + = gl.SRC_ALPHA + = gl.ONE_MINUS_SRC_ALPHA + = gl.DST_ALPHA + = gl.ONE_MINUS_DST_ALPHA + = gl.CONSTANT_COLOR + = gl.ONE_MINUS_CONSTANT_COLOR + = gl.CONSTANT_ALPHA + = gl.ONE_MINUS_CONSTANT_ALPHA + = gl.SRC_ALPHA_SATURATE + + = gl.COLOR_BUFFER_BIT + = gl.DEPTH_BUFFER_BIT + = gl.STENCIL_BUFFER_BIT + + = gl.COLOR_BUFFER_BIT + = gl.DEPTH_BUFFER_BIT + = gl.STENCIL_BUFFER_BIT + + = gl.FRONT + = gl.BACK + = gl.FRONT_AND_BACK + + = gl.NEVER + = gl.LESS + = gl.EQUAL + = gl.LEQUAL + = gl.GREATER + = gl.NOTEQUAL + = gl.GEQUAL + = gl.ALWAYS + + = gl.BLEND + = gl.CULL_FACE + = gl.DEPTH_TEST + = gl.DITHER + = gl.POLYGON_OFFSET_FILL + = gl.SAMPLE_ALPHA_TO_COVERAGE + = gl.SAMPLE_COVERAGE + = gl.SCISSOR_TEST + = gl.STENCIL_TEST + + = gl.POINTS + = gl.LINE_STRIP + = gl.LINE_LOOP + = gl.LINES + = gl.TRIANGLE_STRIP + = gl.TRIANGLE_FAN + = gl.TRIANGLES + + = gl.UNSIGNED_BYTE + = gl.UNSIGNED_SHORT + + = gl.UNSIGNED_BYTE + = gl.UNSIGNED_SHORT + + = gl.CW + = gl.CCW + + = gl.TEXTURE_2D + = gl.TEXTURE_CUBE_MAP + = gl.TEXTURE_3D + = gl.TEXTURE_2D_ARRAY + + = gl.FLOAT + = gl.FLOAT_VEC2 + = gl.FLOAT_VEC3 + = gl.FLOAT_VEC4 + = gl.INT + = gl.INT_VEC2 + = gl.INT_VEC3 + = gl.INT_VEC4 + = gl.BOOL + = gl.BOOL_VEC2 + = gl.BOOL_VEC3 + = gl.BOOL_VEC4 + = gl.FLOAT_MAT2 + = gl.FLOAT_MAT3 + = gl.FLOAT_MAT4 + = gl.SAMPLER_2D + = gl.SAMPLER_CUBE + = gl.UNSIGNED_INT + = gl.UNSIGNED_INT_VEC2 + = gl.UNSIGNED_INT_VEC3 + = gl.UNSIGNED_INT_VEC4 + = gl.FLOAT_MAT2x3 + = gl.FLOAT_MAT2x4 + = gl.FLOAT_MAT3x2 + = gl.FLOAT_MAT3x4 + = gl.FLOAT_MAT4x2 + = gl.FLOAT_MAT4x3 + = gl.SAMPLER_3D + = gl.SAMPLER_2D_SHADOW + = gl.SAMPLER_2D_ARRAY + = gl.SAMPLER_2D_ARRAY_SHADOW + = gl.SAMPLER_CUBE_SHADOW + = gl.INT_SAMPLER_2D + = gl.INT_SAMPLER_3D + = gl.INT_SAMPLER_CUBE + = gl.INT_SAMPLER_2D_ARRAY + = gl.UNSIGNED_INT_SAMPLER_2D + = gl.UNSIGNED_INT_SAMPLER_3D + = gl.UNSIGNED_INT_SAMPLER_CUBE + = gl.UNSIGNED_INT_SAMPLER_2D_ARRAY + + = gl.FRAMEBUFFER + = gl.DRAW_FRAMEBUFFER + = gl.READ_FRAMEBUFFER + + = gl.COLOR_ATTACHMENT0 + = gl.DEPTH_ATTACHMENT + = gl.STENCIL_ATTACHMENT + = gl.DEPTH_STENCIL_ATTACHMENT + + = gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE + = gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME + = gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL + = gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE + = gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING + = gl.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE + = gl.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_RED_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE + = gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER + + = gl.LOW_FLOAT + = gl.MEDIUM_FLOAT + = gl.HIGH_INT + + = gl.TEXTURE_MAG_FILTER + = gl.TEXTURE_MIN_FILTER + = gl.TEXTURE_WRAP_S + = gl.TEXTURE_WRAP_T + = gl.TEXTURE_BASE_LEVEL + = gl.TEXTURE_COMPARE_FUNC + = gl.TEXTURE_COMPARE_MODE + = gl.TEXTURE_IMMUTABLE_FORMAT + = gl.TEXTURE_IMMUTABLE_LEVELS + = gl.TEXTURE_MAX_LEVEL + = gl.TEXTURE_MAX_LOD + = gl.TEXTURE_MIN_LOD + = gl.TEXTURE_WRAP_R + + = gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING + = gl.VERTEX_ATTRIB_ARRAY_ENABLED + = gl.VERTEX_ATTRIB_ARRAY_SIZE + = gl.VERTEX_ATTRIB_ARRAY_STRIDE + = gl.VERTEX_ATTRIB_ARRAY_TYPE + = gl.VERTEX_ATTRIB_ARRAY_NORMALIZED + = gl.CURRENT_VERTEX_ATTRIB + = gl.VERTEX_ATTRIB_ARRAY_INTEGER + = gl.VERTEX_ATTRIB_ARRAY_DIVISOR + + = gl.GENERATE_MIPMAP_HINT + = gl.FRAGMENT_SHADER_DERIVATIVE_HINT + + = gl.FASTEST + = gl.NICEST + = gl.DONT_CARE + + = gl.ALPHA + = gl.RGB + = gl.RGBA + + = gl.UNSIGNED_BYTE + = gl.UNSIGNED_SHORT_5_6_5 + = gl.UNSIGNED_SHORT_4_4_4_4 + = gl.UNSIGNED_SHORT_5_5_5_1 + = gl.FLOAT + + = gl.UNSIGNED_BYTE + = gl.UNSIGNED_SHORT_5_6_5 + = gl.UNSIGNED_SHORT_4_4_4_4 + = gl.UNSIGNED_SHORT_5_5_5_1 + = gl.FLOAT + + = gl.BYTE + = gl.SHORT + = gl.UNSIGNED_BYTE + = gl.UNSIGNED_SHORT + = gl.FLOAT + = gl.HALF_FLOAT + + = gl.RGBA4 + = gl.RGB565 + = gl.RGB5_A1 + = gl.DEPTH_COMPONENT16 + = gl.STENCIL_INDEX8 + = gl.DEPTH_STENCIL + = gl.R8 + = gl.R8UI + = gl.R8I + = gl.R16UI + = gl.R16I + = gl.R32UI + = gl.R32I + = gl.RG8 + = gl.RG8UI + = gl.RG8I + = gl.RG16UI + = gl.RG16I + = gl.RG32UI + = gl.RG32I + = gl.RGB8 + = gl.RGBA8 + = gl.SRGB8_ALPHA8 + = gl.RGB10_A2 + = gl.RGBA8UI + = gl.DEPTH_COMPONENT24 + = gl.DEPTH_COMPONENT32F + = gl.DEPTH24_STENCIL8 + = gl.DEPTH32F_STENCIL8 + + = gl.KEEP + = gl.ZERO + = gl.REPLACE + = gl.INCR + = gl.INCR_WRAP + = gl.DECR + = gl.DECR_WRAP + = gl.INVERT + + = gl.KEEP + = gl.ZERO + = gl.REPLACE + = gl.INCR + = gl.INCR_WRAP + = gl.DECR + = gl.DECR_WRAP + = gl.INVERT + +<_glMgg> = gl.KEEP +<_glMgg> = gl.ZERO +<_glMgg> = gl.REPLACE +<_glMgg> = gl.INCR +<_glMgg> = gl.INCR_WRAP +<_glMgg> = gl.DECR +<_glMgg> = gl.DECR_WRAP +<_glMgg> = gl.INVERT + + = gl.TEXTURE_2D + = gl.TEXTURE_CUBE_MAP_POSITIVE_X + = gl.TEXTURE_CUBE_MAP_NEGATIVE_X + = gl.TEXTURE_CUBE_MAP_POSITIVE_Y + = gl.TEXTURE_CUBE_MAP_NEGATIVE_Y + = gl.TEXTURE_CUBE_MAP_POSITIVE_Z + = gl.TEXTURE_CUBE_MAP_NEGATIVE_Z + + = gl.ALPHA + = gl.RGB + = gl.RGBA + = gl.LUMINANCE + = gl.LUMINANCE_ALPHA + + = 'ANGLE_instanced_arrays' + = 'EXT_blend_minmax' + = 'EXT_color_buffer_float' + = 'EXT_color_buffer_half_float' + = 'EXT_disjoint_timer_query' + = 'EXT_frag_depth' + = 'EXT_sRGB' + = 'EXT_shader_texture_lod' + = 'EXT_texture_filter_anisotropic' + = 'OES_element_index_uint' + = 'OES_standard_derivatives' + = 'OES_texture_float' + = 'OES_texture_float_linear' + = 'OES_vertex_array_object' + = 'WEBGL_color_buffer_float' + = 'WEBGL_compressed_texture_astc' + = 'WEBGL_compressed_texture_atc' + = 'WEBGL_compressed_texture_etc' + = 'WEBGL_compressed_texture_etc1' + = 'WEBGL_compressed_texture_pvrtc' + = 'WEBGL_debug_renderer_info' + = 'WEBGL_debug_shaders' + = 'WEBGL_depth_texture' + = 'WEBGL_draw_buffers' + = 'WEBGL_lose_context' + + = this + + = + +!include ../rules/common.txt +!include ../rules/cssproperties.txt + +!lineguard try { } catch(e) { } +!varformat fuzzvar%05d +!begin lines + +.activeTexture(gl.TEXTURE); +.attachShader(, ); +.getParameter(); +.linkProgram(); +.useProgram(); +.pixelStorei(, ); +.pixelStorei(, ); +.bindTexture(, tex); +.bindAttribLocation(, , ); + +var = .createBuffer(); .bindBuffer(, ); +if ( != undefined) {.deleteBuffer();} +.isBuffer(); +var f = .createBuffer(); .bindFramebuffer(, f); +if (f != undefined) {.deleteFramebuffer(f);} +.isFramebuffer(f); +var r = .createBuffer(); .bindRenderbuffer(gl.RENDERBUFFER, r); +if (r != undefined) {.deleteRenderbuffer(r);} +.isRenderbuffer(r); +var = gl.createTexture(); .bindTexture(, ); +if ( != undefined) {.deleteTexture();} + +.isTexture(); +.blendColor(, , , ); +.blendColor(, , , ); +.blendEquation(); +.blendEquationSeparate(, ); +.enable(.BLEND); .blendFunc(, ); +.enable(.BLEND); .blendFuncSeparate(, , , ); +var = .createBuffer(); .bindBuffer(, ); .bufferData(, , ); +var = .createBuffer(); .bindBuffer(, ); .bufferData(, , ); .bufferSubData(, , , , ); +.checkFramebufferStatus(.FRAMEBUFFER); +.clear(); +.clear( | ); +.clearColor(, , , ); +.clearColor(, , , ); +.clearColor(, , , ); +.clearColor(, , , ); +.clearDepth(); +.clearStencil(); +.colorMask(, , , ); +.colorMask(, , , ); +.createShader(); +var = .createTexture(); +.enable(.CULL_FACE); .cullFace(); +.deleteShader(); +.enable(gl.DEPTH_TEST); .depthFunc(); +.depthMask(); +.depthRange(, ); +.detachShader(, ); +.disable(); +.isEnabled(); +.disableVertexAttribArray(); +.drawArrays(, , ); +.drawElements(, , , ); +.finish(); +.flush(); +.frontFace(); +.generateMipmap(); +const info1 = .getActiveAttrib(, ); +const info2 = .getActiveAttrib(, ); +const ifo1 = .getActiveUniform(, ); +const ifo2 = .getActiveUniform(, ); +.getAttachedShaders(); +.getAttribLocation(, ); +.getBufferParameter(, ); +.getContextAttributes(); +.getError(); +.getFramebufferAttachmentParameter(, , ); +.getProgramInfoLog(); +.getShaderPrecisionFormat(, ); +var source211 = .getShaderSource(); +var source122 = .getShaderSource(); +.getTexParameter(, ); +var loc = .getUniformLocation(, ); .getUniform(, loc); +.getVertexAttrib(, ); +.getVertexAttribOffset(, gl.VERTEX_ATTRIB_ARRAY_POINTER); +.hint(, ); +.lineWidth(); +var pixels = new Uint8Array(.drawingBufferWidth * .drawingBufferHeight * 4); .readPixels(, , .drawingBufferWidth, .drawingBufferHeight, , , pixels); +.renderbufferStorage(.RENDERBUFFER, , , ); +.enable(gl.SAMPLE_COVERAGE); .sampleCoverage(, ); +.scissor(, , , ); +.enable(gl.STENCIL_TEST); .stencilFunc(, , ); +.enable(gl.STENCIL_TEST); .stencilFuncSeparate(, , , ); +.stencilMask(); +.stencilMask(, ); +.enable(.STENCIL_TEST); .stencilOp(, <_glMgg>, ); +.enable(.STENCIL_TEST); .stencilOp(, , <_glMgg>, ); +.texParameterf(, , ); +.texParameteri(, , ); +.viewport(, , , ); +.enableVertexAttribArray(0); +.enableVertexAttribArray(0); .vertexAttribPointer(, , , , , ); +.vertexAttrib1f(, ); +.vertexAttrib2f(, , ); +.vertexAttrib3f(, , , ); +.vertexAttrib4f(, , , , ); +.vertexAttrib1fv(, ); +.vertexAttrib2fv(, ); +.vertexAttrib3fv(, ); +.vertexAttrib4fv(, ); +.validateProgram(); +var loc = .getUniformLocation(, ); .uniformMatrix2fv(loc, , [,, ,]); +var loc = .getUniformLocation(, ); .uniformMatrix3fv(loc, , [,, ,]); +var loc = .getUniformLocation(, ); .uniformMatrix4fv(loc, , [,, ,]); +var loc = .getUniformLocation(, ); .uniform1f(loc, ); +var loc = .getUniformLocation(, ); .uniform1fv(loc, ); +var loc = .getUniformLocation(, ); .uniform1i(loc, ); +var loc = .getUniformLocation(, ); .uniform1iv(loc, ); +var loc = .getUniformLocation(, ); .uniform2f(loc, , ); +var loc = .getUniformLocation(, ); .uniform2fv(loc, ); +var loc = .getUniformLocation(, ); .uniform2i(loc, , ); +var loc = .getUniformLocation(, ); .uniform2iv(loc, ); +var loc = .getUniformLocation(, ); .uniform3f(loc, , , ); +var loc = .getUniformLocation(, ); .uniform3fv(loc, ); +var loc = .getUniformLocation(, ); .uniform3i(loc, , , ); +var loc = .getUniformLocation(, ); .uniform3iv(loc, ); +var loc = .getUniformLocation(, ); .uniform4f(loc, , , , ); +var loc = .getUniformLocation(, ); .uniform4fv(loc, ); +var loc = .getUniformLocation(, ); .uniform4i(loc, , , , ); +var loc = .getUniformLocation(, ); .uniform4iv(loc, ); +.texImage2D(, , , , , 0, , , img); +var = .createRenderbuffer(); .framebufferRenderbuffer(, , gl.RENDERBUFFER, ); +var = .createTexture(); .framebufferTexture2D(, , , , ); +var ext = .getExtension(); +var vara = .getFramebufferAttachmentParameter(, , ); +var varb = .getFramebufferAttachmentParameter(, , ); +if (!.isContextLost()) {var info = .getProgramInfoLog();} + +!end lines diff --git a/webgpu/README.md b/webgpu/README.md new file mode 100644 index 0000000..532f77d --- /dev/null +++ b/webgpu/README.md @@ -0,0 +1,12 @@ +# Simple WebGPU fuzzer + +## Setup + +1. Populate the `wgsl/` directory with wgsl scripts. I would recomment copying wgsl test files from [tint's tests](https://source.chromium.org/chromium/chromium/src/+/main:third_party/dawn/test/tint/bug/). +2. From here, the usage is the same as [vanilla Domato's](https://github.com/googleprojectzero/domato). + +## Bugs +Chrome: [40063883](https://issues.chromium.org/u/0/issues/40063883), [40063356](https://issues.chromium.org/u/0/issues/40063356) + +## Building Grammars +This repo also contains a helper script that can be used to assist in generating Domato grammars using Chrome's [WebIDL compiler](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/bindings/scripts/web_idl/README.md;l=1?q=f:md%20web_idl&sq=). It is far from complete but may help others generate grammars faster. diff --git a/webgpu/build_grammar.py b/webgpu/build_grammar.py new file mode 100644 index 0000000..eacf782 --- /dev/null +++ b/webgpu/build_grammar.py @@ -0,0 +1,150 @@ +# Domato - example generator script +# -------------------------------------- +# +# Written by Brendon Tiszka +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import web_idl + +# Path to your chromium build directory +PATH_TO_CHROME_BUILD_DIR = "" +web_idl_database_path = '/gen/third_party/blink/renderer/bindings/web_idl_database.pickle' +web_idl_database = web_idl.Database.read_from_file(PATH_TO_CHROME_BUILD_DIR + web_idl_database_path) + +def is_gpu(ident): + if "GPU" in ident: + return True + return False + +def is_promise(ident): + if "Promise" in ident: + return True + return False + +def remove_promise_info(s): + if "OrNullPromise" in s: + return s[:s.index("OrNullPromise")] + + if "Promise" in s: + return s[:s.index("Promise")] + + return s + +def parse_enums(): + builder = "" + + for enum in web_idl_database.enumerations: + if not is_gpu(enum.identifier): + continue + + for value in enum.values: + builder += "<{}> = \"{}\"\n".format(enum.identifier, value) + + builder += "\n" + + return builder + +def parse_namespaces(): + builder = "" + + for ns in web_idl_database.namespaces: + if not is_gpu(ns.identifier): + continue + + for const in ns.constants: + builder += "<{}> = {}.{}\n".format(ns.identifier, ns.identifier, const.identifier) + + builder += "\n" + + return builder + +def parse_dictionaries(): + builder = "" + + for dictionary in web_idl_database.dictionaries: + if not is_gpu(dictionary.identifier): + continue + + print(dictionary.identifier) + +def parse_interfaces(): + builder = "" + + for interface in web_idl_database.interfaces: + if not is_gpu(interface.identifier): + continue + + + builder += "#" + ("~"*16) + interface.identifier + ("~"*16) + "#\n" + for attribute in interface.attributes: + if attribute.is_readonly: + continue + + builder += "<{}>.{} = <{}>".format(interface.identifier, attribute.identifier, attribute.idl_type.type_name) + builder += "\n" + + for operation in interface.operations: + required_args = operation.num_of_required_arguments + num_args = len(operation.arguments) + + lifted_args = [] + for argument in operation.arguments: + lifted_args.append("<{}>".format(argument.idl_type.type_name)) + + for i in range(required_args, num_args + 1): + if operation.return_type.type_name != "Void": + return_type = remove_promise_info(operation.return_type.type_name) + builder += " = ".format(return_type) + + if is_promise(operation.return_type.type_name): + builder += "await " + + builder += "<{}>.{}(".format(interface.identifier, operation.identifier) + builder += "{}".format(",".join(lifted_args[:i])) + builder += ");\n" + + builder += "\n" + return builder + + +def parse_dictionaries(): + builder = "" + + for dictionary in web_idl_database.dictionaries: + if not is_gpu(dictionary.identifier): + continue + + + lifted_members = [] + for member in dictionary.members: + lifted_members.append("{}: <{}>".format(member.identifier, member.idl_type.type_name)) + + builder += "<{}> = ".format(dictionary.identifier) + builder += "{ " + builder += ", ".join(lifted_members) + builder += " };" + builder += "\n" + + return builder + +if __name__ == "__main__": + enums = parse_enums() + namespaces = parse_namespaces() + interfaces = parse_interfaces() + dictionaries = parse_dictionaries() + print(enums) + print(namespaces) + print(interfaces) + print(dictionaries) diff --git a/webgpu/generator.py b/webgpu/generator.py new file mode 100644 index 0000000..95657a3 --- /dev/null +++ b/webgpu/generator.py @@ -0,0 +1,172 @@ +# Domato - generator script for WebGPU +# ------------------------------- +# +# Written and maintained by Ivan Fratric +# Modified by Brendon Tiszka to target webgpu +# +# Copyright 2017 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function +import glob +import os +import random +import re +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) +sys.path.append(parent_dir) +from grammar import Grammar + +_N_MAIN_LINES = 1000 +_N_SHADERS = 10 + +def extract_shader_stages_and_functions(code): + # Pattern to match both single-line and multiline stage attributes + pattern = r'@(?:compute|vertex|fragment)(?:\s+@[^(\n]+(?:\([^)]*\))?)*\s*(?:\n\s*)?fn\s+(\w+)' + matches = re.finditer(pattern, code) + + # Extract stage-function pairs + result = [] + for match in matches: + # Find the stage attribute within the matched attributes + stage_attr = re.search(r'@(compute|vertex|fragment)', match.group(0)).group(0) + function_name = match.group(1) + result.append((stage_attr, function_name)) + + return result + +def parse_entrypoints(shaders): + entrypoints = [] + for shader in shaders: + attr_fn_pairs = extract_shader_stages_and_functions(shader) + for attr, fn in attr_fn_pairs: + entrypoints.append(fn) + + result = "" + for entrypoint in entrypoints: + result += " = \"{}\"\n".format(entrypoint) + + return result + +def parse_bindings(shaders): + binding_pattern = r'@binding\((\d+)\)' + + binding_numbers = [] + for shader in shaders: + matches = re.finditer(binding_pattern, shader) + binding_numbers.extend(match.group(1) for match in matches) + + return "\n".join(f" = {binding}" for binding in binding_numbers) + +def generate_function_body(webgpugrammar, num_lines): + js = '' + js += webgpugrammar._generate_code(num_lines) + + return js + +def generate_new_sample(template, webgpugrammar): + result = template + while '' in result: + result = result.replace( + '', + generate_function_body(webgpugrammar, _N_MAIN_LINES), + 1 + ) + + return result + + +def generate_samples(template, grammar_dir, outfiles): + extra = "" + shaders_dir = os.path.join(grammar_dir, "wgsl/*.wgsl") + shader_files = glob.glob(shaders_dir) + + shaders = [] + for i in range(_N_SHADERS): + shader_path = random.choice(shader_files) + with open(shader_path) as fp: + shader_src = fp.read() + shaders.append(shader_src) + + with open(os.path.join(grammar_dir, template), "r") as fp: + template_contents = fp.read() + + SHADER_CONST = "" + for i, shader in enumerate(shaders): + shader_template = SHADER_CONST % str(i) + template_contents = template_contents.replace(shader_template, shader) + + extra += parse_entrypoints(shaders) + "\n" + extra += parse_bindings(shaders) + "\n" + + webgpugrammar = Grammar() + err = webgpugrammar.parse_from_file(os.path.join(grammar_dir, os.path.join(grammar_dir, 'webgpu.txt')), extra) + if err > 0: + print('There were errors parsing grammar') + return + + for outfile in outfiles: + result = generate_new_sample(template_contents, webgpugrammar) + + if result is not None: + print('Writing a sample to ' + outfile) + try: + with open(outfile, 'w') as f: + f.write(result) + except IOError: + print('Error writing to output') + + +def get_option(option_name): + for i in range(len(sys.argv)): + if (sys.argv[i] == option_name) and ((i + 1) < len(sys.argv)): + return sys.argv[i + 1] + elif sys.argv[i].startswith(option_name + '='): + return sys.argv[i][len(option_name) + 1:] + return None + +def main(): + fuzzer_dir = os.path.dirname(__file__) + + multiple_samples = False + template = os.path.join(fuzzer_dir, "template.html") + + for a in sys.argv: + if a.startswith('--output_dir='): + multiple_samples = True + if '--output_dir' in sys.argv: + multiple_samples = True + + if multiple_samples: + print('Running on ClusterFuzz') + out_dir = get_option('--output_dir') + nsamples = int(get_option('--no_of_files')) + print('Output directory: ' + out_dir) + print('Number of samples: ' + str(nsamples)) + if not os.path.exists(out_dir): + os.mkdir(out_dir) + outfiles = [] + for i in range(nsamples): + outfiles.append(os.path.join(out_dir, 'fuzz-' + str(i).zfill(5) + '.html')) + generate_samples(template, fuzzer_dir, outfiles) + else: + print('Arguments missing') + print("Usage:") + print("""--input_dir . ** not used. ** + --output_dir . This is the output directory which the fuzzer should write to. + --no_of_files . This is the number of testcases which the fuzzer should write to the output directory. + """) + +if __name__ == '__main__': + main() diff --git a/webgpu/template.html b/webgpu/template.html new file mode 100644 index 0000000..8402049 --- /dev/null +++ b/webgpu/template.html @@ -0,0 +1,109 @@ + + + + + + \ No newline at end of file diff --git a/webgpu/webgpu.txt b/webgpu/webgpu.txt new file mode 100644 index 0000000..a7f5b5e --- /dev/null +++ b/webgpu/webgpu.txt @@ -0,0 +1,716 @@ +!include webgpuhelpers.txt + + = Shader0 + = Shader1 + = Shader2 + = Shader3 + = Shader4 + = Shader5 + = Shader6 + = Shader7 + = Shader8 + = Shader9 + + = 1234 + = o + = wgsize + + = "srgb" + = "display-p3" + + = "uniform-buffer" + = "storage-buffer" + = "readonly-storage-buffer" + = "sampler" + = "comparison-sampler" + = "sampled-texture" + = "multisampled-texture" + = "writeonly-storage-texture" + + = "float" + = "sint" + = "uint" + = "depth-comparison" + + = "zero" + = "one" + = "src" + = "one-minus-src" + = "src-alpha" + = "one-minus-src-alpha" + = "dst" + = "one-minus-dst" + = "dst-alpha" + = "one-minus-dst-alpha" + = "src-alpha-saturated" + = "constant" + = "one-minus-constant" + + = "add" + = "subtract" + = "reverse-subtract" + = "min" + = "max" + + = "unmapped" + = "pending" + = "mapped" + + = "uniform" + = "storage" + = "read-only-storage" + + = "opaque" + = "premultiplied" + + = "error" + = "warning" + = "info" + + = "beginning" + = "end" + + = "out-of-memory" + = "validation" + = "internal" + + = "destroyed" + + = "auto" + + = "uint16" + = "uint32" + + = "occlusion" + = "pipeline-statistics" + = "timestamp" + + = "vertex-shader-invocations" + = "clipper-invocations" + = "clipper-primitives-out" + = "fragment-shader-invocations" + = "compute-shader-invocations" + + = "ccw" + = "cw" + + = "none" + = "front" + = "back" + + = "load" + = "clear" + + = "store" + = "discard" + + = "beginning" + = "end" + + = "point-list" + = "line-list" + = "line-strip" + = "triangle-list" + = "triangle-strip" + + = "low-power" + = "high-performance" + + = "filtering" + = "non-filtering" + = "comparison" + + = "clamp-to-edge" + = "repeat" + = "mirror-repeat" + + = "nearest" + = "linear" + + = "never" + = "less" + = "equal" + = "less-equal" + = "greater" + = "not-equal" + = "greater-equal" + = "always" + + = "keep" + = "zero" + = "replace" + = "invert" + = "increment-clamp" + = "decrement-clamp" + = "increment-wrap" + = "decrement-wrap" + + = "write-only" + + = "pipeline-statistics-query" + = "texture-compression-bc" + = "texture-compression-etc2" + = "texture-compression-astc" + = "timestamp-query" + = "timestamp-query-inside-passes" + = "shader-float16" + = "depth-clip-control" + = "depth32float-stencil8" + = "indirect-first-instance" + = "chromium-experimental-dp4a" + = "rg11b10ufloat-renderable" + + = "float" + = "unfilterable-float" + = "depth" + = "sint" + = "uint" + + = "1d" + = "2d" + = "3d" + + = "r8unorm" + = "r8snorm" + = "r8uint" + = "r8sint" + = "r16uint" + = "r16sint" + = "r16float" + = "rg8unorm" + = "rg8snorm" + = "rg8uint" + = "rg8sint" + = "r32uint" + = "r32sint" + = "r32float" + = "rg16uint" + = "rg16sint" + = "rg16float" + = "rgba8unorm" + = "rgba8unorm-srgb" + = "rgba8snorm" + = "rgba8uint" + = "rgba8sint" + = "bgra8unorm" + = "bgra8unorm-srgb" + = "rgb9e5ufloat" + = "rgb10a2unorm" + = "rg11b10ufloat" + = "rg32uint" + = "rg32sint" + = "rg32float" + = "rgba16uint" + = "rgba16sint" + = "rgba16float" + = "rgba32uint" + = "rgba32sint" + = "rgba32float" + = "depth32float" + = "depth32float-stencil8" + = "depth24plus" + = "depth24plus-stencil8" + = "depth16unorm" + = "stencil8" + = "bc1-rgba-unorm" + = "bc1-rgba-unorm-srgb" + = "bc2-rgba-unorm" + = "bc2-rgba-unorm-srgb" + = "bc3-rgba-unorm" + = "bc3-rgba-unorm-srgb" + = "bc4-r-unorm" + = "bc4-r-snorm" + = "bc5-rg-unorm" + = "bc5-rg-snorm" + = "bc6h-rgb-ufloat" + = "bc6h-rgb-float" + = "bc7-rgba-unorm" + = "bc7-rgba-unorm-srgb" + = "etc2-rgb8unorm" + = "etc2-rgb8unorm-srgb" + = "etc2-rgb8a1unorm" + = "etc2-rgb8a1unorm-srgb" + = "etc2-rgba8unorm" + = "etc2-rgba8unorm-srgb" + = "eac-r11unorm" + = "eac-r11snorm" + = "eac-rg11unorm" + = "eac-rg11snorm" + = "astc-4x4-unorm" + = "astc-4x4-unorm-srgb" + = "astc-5x4-unorm" + = "astc-5x4-unorm-srgb" + = "astc-5x5-unorm" + = "astc-5x5-unorm-srgb" + = "astc-6x5-unorm" + = "astc-6x5-unorm-srgb" + = "astc-6x6-unorm" + = "astc-6x6-unorm-srgb" + = "astc-8x5-unorm" + = "astc-8x5-unorm-srgb" + = "astc-8x6-unorm" + = "astc-8x6-unorm-srgb" + = "astc-8x8-unorm" + = "astc-8x8-unorm-srgb" + = "astc-10x5-unorm" + = "astc-10x5-unorm-srgb" + = "astc-10x6-unorm" + = "astc-10x6-unorm-srgb" + = "astc-10x8-unorm" + = "astc-10x8-unorm-srgb" + = "astc-10x10-unorm" + = "astc-10x10-unorm-srgb" + = "astc-12x10-unorm" + = "astc-12x10-unorm-srgb" + = "astc-12x12-unorm" + = "astc-12x12-unorm-srgb" + + = "1d" + = "2d" + = "2d-array" + = "cube" + = "cube-array" + = "3d" + + = "all" + = "stencil-only" + = "depth-only" + + = "uint8x2" + = "uint8x4" + = "sint8x2" + = "sint8x4" + = "unorm8x2" + = "unorm8x4" + = "snorm8x2" + = "snorm8x4" + = "uint16x2" + = "uint16x4" + = "sint16x2" + = "sint16x4" + = "unorm16x2" + = "unorm16x4" + = "snorm16x2" + = "snorm16x4" + = "float16x2" + = "float16x4" + = "float32" + = "float32x2" + = "float32x3" + = "float32x4" + = "uint32" + = "uint32x2" + = "uint32x3" + = "uint32x4" + = "sint32" + = "sint32x2" + = "sint32x3" + = "sint32x4" + + = "vertex" + = "instance" + +# Namespaces + = GPUBufferUsage.MAP_READ + = GPUBufferUsage.MAP_WRITE + = GPUBufferUsage.COPY_SRC + = GPUBufferUsage.COPY_DST + = GPUBufferUsage.INDEX + = GPUBufferUsage.VERTEX + = GPUBufferUsage.UNIFORM + = GPUBufferUsage.STORAGE + = GPUBufferUsage.INDIRECT + = GPUBufferUsage.QUERY_RESOLVE + + = GPUColorWrite.RED + = GPUColorWrite.GREEN + = GPUColorWrite.BLUE + = GPUColorWrite.ALPHA + = GPUColorWrite.ALL + + = GPUMapMode.READ + = GPUMapMode.WRITE + + = GPUShaderStage.VERTEX + = GPUShaderStage.FRAGMENT + = GPUShaderStage.COMPUTE + + = GPUTextureUsage.COPY_SRC + = GPUTextureUsage.COPY_DST + = GPUTextureUsage.TEXTURE_BINDING + = GPUTextureUsage.STORAGE_BINDING + = GPUTextureUsage.RENDER_ATTACHMENT + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# +#~~~~~~~~~DICTIONARIES~~~~~~~~~~~# +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# + = { label: , entries: , layout: } + = { binding: , resource: } + = { binding: , resource: } + = { binding: , resource: } + = { binding: , resource: } + = { label: , entries: } + = { binding: , buffer: , visibility: } + = { binding: , externalTexture: , visibility: } + = { binding: , sampler: , visibility: } + = { binding: , texture: , visibility: } + = { dstFactor: , operation: , srcFactor: } + + = { alpha: , color: } + = { buffer: , offset: , size: } + = { hasDynamicOffset: , minBindingSize: , type: } + = { label: , mappedAtCreation: , size: , usage: } + = { alphaMode: , colorSpace: , device: , format: , usage: , viewFormats: } + = { a: , b: , g: , r: } + = { alphaBlend: , colorBlend: , format: , writeMask: } + = { blend: , format: , writeMask: } + = { label: } + = { label: } + = { label: , timestampWrites: } + = { location: , queryIndex: , querySet: } + = { label: , layout: , compute: } + = { label: , layout: , compute: } + = { depthBias: , depthBiasClamp: , depthBiasSlopeScale: , depthCompare: , depthWriteEnabled: , format: , stencilBack: , stencilFront: , stencilReadMask: , stencilWriteMask: } + = { depthCompare: , depthWriteEnabled: , format: , stencilBack: , stencilFront: , stencilReadMask: , stencilWriteMask: } + = { label: , defaultQueue: , requiredFeatures: , requiredLimits: } + = { depthOrArrayLayers: , height: , width: } + = { } + = { label: , colorSpace: , source: } + = { label: , colorSpace: , source: } + = { constants: , entryPoint: , module: , targets: } + = { constants: , entryPoint: , module: , targets: } + = { bytesPerRow: , offset: , rowsPerImage: , buffer: } + = { flipY: , origin: , source: } + = { flipY: , origin: , source: } + = { flipY: , origin: , source: } + = { flipY: , origin: , source: } + = { imageBitmap: , origin: } + = { aspect: , mipLevel: , origin: , texture: } + = { aspect: , mipLevel: , origin: , texture: , colorSpace: , premultipliedAlpha: } + = { bytesPerRow: , offset: , rowsPerImage: } + = { alphaToCoverageEnabled: , count: , mask: } + = { label: } + = { x: , y: } + = { x: , y: , z: } + = { label: , layout: } + = { label: , layout: } + = { label: , bindGroupLayouts: } + = { cullMode: , frontFace: , stripIndexFormat: , topology: , unclippedDepth: } + = { constants: , entryPoint: , module: } + = { label: , count: , pipelineStatistics: , type: } + = { label: } + = { cullMode: , depthBias: , depthBiasClamp: , depthBiasSlopeScale: , frontFace: } + = { label: } + = { label: , colorFormats: , depthStencilFormat: , sampleCount: , depthReadOnly: , stencilReadOnly: } + = { clearValue: , loadOp: , resolveTarget: , storeOp: , view: } + = { depthClearValue: , depthLoadOp: , depthReadOnly: , depthStoreOp: , stencilClearValue: , stencilLoadOp: , stencilReadOnly: , stencilStoreOp: , view: } + = { label: , colorAttachments: , depthStencilAttachment: , maxDrawCount: , occlusionQuerySet: , timestampWrites: } + = { label: , colorFormats: , depthStencilFormat: , sampleCount: } + = { location: , queryIndex: , querySet: } + = { label: , layout: , depthStencil: , fragment: , multisample: , primitive: , vertex: } + = { label: , layout: , depthStencil: , fragment: , multisample: , primitive: , vertex: } + = { powerPreference: } + = { type: } + = { label: , addressModeU: , addressModeV: , addressModeW: , compare: , lodMaxClamp: , lodMinClamp: , magFilter: , maxAnisotropy: , minFilter: , mipmapFilter: } + = { layout: } + = { layout: } + = { compare: , depthFailOp: , failOp: , passOp: } + = { access: , format: , viewDimension: } + = { multisampled: , sampleType: , viewDimension: } + = { label: , dimension: , format: , mipLevelCount: , sampleCount: , size: , usage: , viewFormats: } + = { label: , arrayLayerCount: , aspect: , baseArrayLayer: , baseMipLevel: , dimension: , format: , mipLevelCount: } + = { bubbles: , cancelable: , composed: , error: } + = { format: , offset: , shaderLocation: } + = { arrayStride: , attributes: , stepMode: } + = { constants: , entryPoint: , module: , buffers: } + + + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [] + = [, ] + = [, , ] + = [, , , ] + = [] + = [, ] + = [, , ] + + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = {} + = { : } + = { : } + = { : } + + = adapter + = device + +!lineguard try { } catch(e) {} +!varformat fuzzvar%05d +!begin lines + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# +#~~~~~~~~~~INTERFACES~~~~~~~~~~~~# +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# + + +#~~~~~~~~~~~~~~~~GPU~~~~~~~~~~~~~~~~# + = .getPreferredCanvasFormat(); + +#~~~~~~~~~~~~~~~~GPUAdapter~~~~~~~~~~~~~~~~# + + = await .requestAdapterInfo(); + +#~~~~~~~~~~~~~~~~GPUBindGroup~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUBindGroupLayout~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUBuffer~~~~~~~~~~~~~~~~# +.label = +await .mapAsync(); +await .mapAsync(,); +await .mapAsync(,,); + = .getMappedRange(); + = .getMappedRange(); + = .getMappedRange(,); +.unmap(); +.destroy(); + +#~~~~~~~~~~~~~~~~GPUCanvasContext~~~~~~~~~~~~~~~~# +.configure(); +.unconfigure(); + = .getCurrentTexture(); + +#~~~~~~~~~~~~~~~~GPUCommandBuffer~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUCommandEncoder~~~~~~~~~~~~~~~~# +.label = + = .beginRenderPass(); + = .beginComputePass(); + = .beginComputePass(); +.copyBufferToBuffer(,,,,); +.copyBufferToTexture(,,); +.copyTextureToBuffer(,,); +.copyTextureToTexture(,,); +.pushDebugGroup(); +.popDebugGroup(); +.insertDebugMarker(); +.resolveQuerySet(,,,,); +.writeTimestamp(,); +.clearBuffer(); +.clearBuffer(,); +.clearBuffer(,,); + = .finish(); + = .finish(); + +#~~~~~~~~~~~~~~~~GPUComputePassEncoder~~~~~~~~~~~~~~~~# +.label = +.setPipeline(); +.dispatchWorkgroups(); +.dispatchWorkgroups(,); +.dispatchWorkgroups(,,); +.dispatchWorkgroupsIndirect(,); +.writeTimestamp(,); +.end(); +.setBindGroup(,); +.setBindGroup(,,); +.setBindGroup(,,,,); +.pushDebugGroup(); +.popDebugGroup(); +.insertDebugMarker(); + +#~~~~~~~~~~~~~~~~GPUComputePipeline~~~~~~~~~~~~~~~~# +.label = + = .getBindGroupLayout(); + +#~~~~~~~~~~~~~~~~GPUDevice~~~~~~~~~~~~~~~~# + = device.queu; +.onuncapturederror = null +.label = +.destroy(); + = .createBuffer(); + = .createTexture(); + = .experimentalImportTexture(,); + = .createSampler(); + = .createSampler(); + = .importExternalTexture(); + = .createBindGroup(); + = .createBindGroupLayout(); + = .createPipelineLayout(); + = .createRenderPipeline(); + = .createComputePipeline(); + = await .createRenderPipelineAsync(); + = await .createComputePipelineAsync(); + = .createCommandEncoder(); + = .createCommandEncoder(); + = .createRenderBundleEncoder(); + = .createQuerySet(); +.pushErrorScope(); + = await .popErrorScope(); + +#~~~~~~~~~~~~~~~~GPUExternalTexture~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUInternalError~~~~~~~~~~~~~~~~# + +#~~~~~~~~~~~~~~~~GPUPipelineLayout~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUQuerySet~~~~~~~~~~~~~~~~# +.label = +.destroy(); + +#~~~~~~~~~~~~~~~~GPUQueue~~~~~~~~~~~~~~~~# +.label = +.submit(); +await .onSubmittedWorkDone(); +.writeBuffer(,,); +.writeBuffer(,,,); +.writeBuffer(,,,,); +.writeBuffer(,,); +.writeBuffer(,,,); +.writeBuffer(,,,,); +.writeTexture(,,,); +.writeTexture(,,,); +.copyExternalImageToTexture(,,); + +#~~~~~~~~~~~~~~~~GPURenderBundle~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPURenderBundleEncoder~~~~~~~~~~~~~~~~# +.label = + = .finish(); + = .finish(); +.setBindGroup(,); +.setBindGroup(,,); +.setBindGroup(,,,,); +.pushDebugGroup(); +.popDebugGroup(); +.insertDebugMarker(); +.setPipeline(); +.setIndexBuffer(,); +.setIndexBuffer(,,); +.setIndexBuffer(,,,); +.setVertexBuffer(,); +.setVertexBuffer(,,); +.setVertexBuffer(,,,); +.draw(); +.draw(,); +.draw(,,); +.draw(,,,); +.drawIndexed(); +.drawIndexed(,); +.drawIndexed(,,); +.drawIndexed(,,,); +.drawIndexed(,,,,); +.drawIndirect(,); +.drawIndexedIndirect(,); + +#~~~~~~~~~~~~~~~~GPURenderPassEncoder~~~~~~~~~~~~~~~~# +.label = +.setViewport(,,,,,); +.setScissorRect(,,,); +.setBlendConstant(); +.setStencilReference(); +.executeBundles(); +.beginOcclusionQuery(); +.endOcclusionQuery(); +.writeTimestamp(,); +.end(); +.setBindGroup(,); +.setBindGroup(,,); +.setBindGroup(,,,,); +.pushDebugGroup(); +.popDebugGroup(); +.insertDebugMarker(); +.setPipeline(); +.setIndexBuffer(,); +.setIndexBuffer(,,); +.setIndexBuffer(,,,); +.setVertexBuffer(,); +.setVertexBuffer(,,); +.setVertexBuffer(,,,); +.draw(); +.draw(,); +.draw(,,); +.draw(,,,); +.drawIndexed(); +.drawIndexed(,); +.drawIndexed(,,); +.drawIndexed(,,,); +.drawIndexed(,,,,); +.drawIndirect(,); +.drawIndexedIndirect(,); + +#~~~~~~~~~~~~~~~~GPURenderPipeline~~~~~~~~~~~~~~~~# +.label = + = .getBindGroupLayout(); + +#~~~~~~~~~~~~~~~~GPUSampler~~~~~~~~~~~~~~~~# +.label = + +#~~~~~~~~~~~~~~~~GPUShaderModule~~~~~~~~~~~~~~~~# +.label = + = await .compilationInfo(); + +#~~~~~~~~~~~~~~~~GPUTexture~~~~~~~~~~~~~~~~# +.label = + = .createView(); + = .createView(); +.destroy(); + +#~~~~~~~~~~~~~~~~GPUTextureView~~~~~~~~~~~~~~~~# +.label = diff --git a/webgpu/webgpuhelpers.txt b/webgpu/webgpuhelpers.txt new file mode 100644 index 0000000..e31b7b2 --- /dev/null +++ b/webgpu/webgpuhelpers.txt @@ -0,0 +1,136 @@ + + + = + = + = + = + = + = + = + = + = {} + + = self +=navigator +=self.navigator + = window + = document + = .contentWindow.document +=self + + = +=.gpu + = "fuzzstr_" + + = .transferControlToOffscreen() += + + = html_tag_to_id("canvas", ) + = + + = + = + = true + = false + + = + = + = . + = . + = + = + = + = + + = 0 + = 1 + = 2 + = 3 + = 4 + = 5 + = 6 + = 7 + = 8 + = 9 + = 10 + = 11 + = 12 + = 13 + = 14 + = 15 + = 16 + = + += + = 0 + = 1 + = 2 + = 4 + = 8 + = 16 + = 32 + = 64 + = 128 + + = 0x64 + = 0x3e8 + = 0x4141 + = 0xefff + = 0xaa + = 0xaf43 + = -0x9c + = true + = false + + = + = + = + = + + = 0x100 + = 65536 + = + = + + = 536870911 + = 536870912 + = 1073741823 + = 1073741824 + = 2147483647 + = 2147483648 + = 4294967295 + = 4294967296 + + +!lineguard try { } catch(e) { } +!varformat fuzzvar%05d +!begin lines + + = html_tag_to_id("iframe", ); + = html_tag_to_id("video", ); + = html_tag_to_id("video", ); + = html_tag_to_id("canvas", ); + + + = await createImageBitmap(,,,,); + = await createImageBitmap(,,,,); + = await createImageBitmap(,,,,); + = new VideoFrame(, { timestamp: }); + = new ImageData(, ); + = self.URL.createObjectURL(new Blob([worker_blob], { type: 'text/javascript' })); +=.getContext('webgpu'); + + + = new Int8Array(); + = new Int16Array(); + = new Int32Array(); + = new Uint8Array(); + = new Uint16Array(); + = new Uint32Array(); + = new Float32Array(); + = new Float64Array(); + = new Uint8ClampedArray(); + +out_of_scope_gc_flush(); +out_of_scope_gc_flush(); +out_of_scope_gc_flush(); diff --git a/webgpu/wgsl/domato-example.wgsl b/webgpu/wgsl/domato-example.wgsl new file mode 100644 index 0000000..61285b4 --- /dev/null +++ b/webgpu/wgsl/domato-example.wgsl @@ -0,0 +1,24 @@ +alias RTArr = array; + +struct S { + field0 : RTArr, +} + +var x_2 : vec3; + +@group(0) @binding(0) var x_5 : S; + +@group(0) @binding(1) var x_6 : S; + +fn main_1() { + let x_20 : u32 = x_2.x; + let x_22 : u32 = x_5.field0[x_20]; + x_6.field0[x_20] = bitcast(-(bitcast(x_22))); + return; +} + +@compute @workgroup_size(1, 1, 1) +fn main(@builtin(global_invocation_id) x_2_param : vec3) { + x_2 = x_2_param; + main_1(); +}