1296N/A/*
1296N/A * Solaris X consolidation configuration for Parfait static analysis
1296N/A * This file provides additional information about functions that Parfait
1296N/A * can use to make more accurate analysis.
1296N/A */
1296N/A
1296N/A/*
1296N/A * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
1296N/A *
1296N/A * Permission is hereby granted, free of charge, to any person obtaining a
1296N/A * copy of this software and associated documentation files (the "Software"),
1296N/A * to deal in the Software without restriction, including without limitation
1296N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1296N/A * and/or sell copies of the Software, and to permit persons to whom the
1296N/A * Software is furnished to do so, subject to the following conditions:
1296N/A *
1296N/A * The above copyright notice and this permission notice (including the next
1296N/A * paragraph) shall be included in all copies or substantial portions of the
1296N/A * Software.
1296N/A *
1296N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1296N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1296N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1296N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1296N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1296N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1296N/A * DEALINGS IN THE SOFTWARE.
1296N/A */
1296N/A
1296N/Ainclude 'std.conf';
1296N/A
1296N/A/* Local copy until added to parfait's std.conf (Bug 14121100) */
1296N/Aasprintf(p,const fmt,args...) : printf(fmt,args), noescape {
1296N/A if (result >= 0) {
1296N/A *p == new(result);
1296N/A }
1296N/A}
1296N/Avasprintf(p,const fmt,va) : noescape {
1296N/A if (result >= 0) {
1296N/A *p == new(result);
1296N/A }
1296N/A}
1296N/A
1296N/A/* Local copy until added to parfait's std.conf (Bug 14121213) */
1296N/Astrndup(const s, n) : noescape {
1296N/A if ( result != 0 ) {
1296N/A result == new(undefined);
1296N/A strlen(result) == PRE ( strlen(s) < n ? strlen(s) : n);
1296N/A }
1296N/A}
1296N/A
1296N/A/* Define custom bug types for common precondition assertions */
1296N/Abugtype "null-pointer-deref-call-X"(ptr) : "null-pointer-deref" {
1296N/A name="Null Pointer Dereference in X function";
1296N/A priority="error";
1296N/A enabled="true";
1296N/A message="Null pointer dereference in call to ", callee_name(), ". Pointer ", name(ptr), " may be dereferenced";
1296N/A}
1296N/A
1296N/A/*************************************************************************
1296N/A * Client side functions
1296N/A */
1296N/A
1296N/A/** libX11 **/
1296N/Abugtype "X-resource-leak"(xid) {
1296N/A name="X Resource Leak";
1296N/A priority="error";
1296N/A enabled="true";
1296N/A message="Leaked X Resource ", name(xid);
1296N/A}
1296N/A
1296N/Aresource <x-resource> {
1296N/A name="X Resource";
1296N/A "X-resource-leak"(resource): noleak(resource);
1296N/A resource == 0 => !isa(resource);
1296N/A}
1296N/A
1296N/A/* Listed pretty much in same order as <X11/Xlib.h> */
1296N/A
1296N/A/* Todo: XLoadQueryFont...XNewModifiermap */
1296N/A
1296N/AXCreateImage(const display, v, dp, f, o, data, w, h, bp, bpl) {
1296N/A "null-pointer-deref-call-X"(display) : display != 0;
1296N/A if (result != 0) {
1296N/A result == new(undefined);
1296N/A }
1296N/A}
1296N/AXDestroyImage(p) { /* actually in <X11/Xutil.h> */
1296N/A "null-pointer-deref-call-X"(p) : p != 0;
1296N/A delete(p);
1296N/A}
1296N/A/* Todo: XInitImage, XGetImage, XGetSubImage */
1296N/A
1296N/AXOpenDisplay(const d) {
1296N/A if (result != 0) {
1296N/A result == new(undefined);
1296N/A }
1296N/A}
1296N/A
1296N/AXFetchBuffer(d, n, b) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A *n == size(result);
1296N/A result == new(*n);
1296N/A }
1296N/A}
1296N/AXFetchBytes(d, n) : XFetchBuffer(d, n, 0);
1296N/A
1296N/AXGetAtomName(d, a) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(undefined);
1296N/A }
1296N/A}
1296N/A/* Todo: XGetAtomNames, XGetDefault, XDisplayName, XKeysymToString,
1296N/A XInternAtom, XInternAtoms */
1296N/A
1296N/AXCopyColormapAndFree(d, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreateColormap(d, w, v, a) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreatePixmapCursor(d, s, m, fg, bg, x, y) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreateGlyphCursor(d, sf, mf, sc, mc, fg, bg) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreateFontCursor(d, s) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXLoadFont(d, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/A
1296N/AXCreateGC(d, dr, vm, v) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(112); /* sizeof(struct _XGC) */
1296N/A }
1296N/A}
1296N/A/* Todo: XGContextFromGC, XFlushGC */
1296N/A
1296N/AXCreatePixmap(d, dr, w, h, dp) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreateBitmapFromData(d, dr, dt, w, h) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreatePixmapFromBitmapData(d, dr, dt, w, h, fg, bg, dp) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/AXCreateSimpleWindow(d,p,x,y,w,h,bw,b,bg) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/A/* Todo: XGetSelectionOwner */
1296N/AXCreateWindow(d,p,x,y,w,h,bw,dp,c,v,vm,a) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A result != 0;
1296N/A init<x-resource>(result);
1296N/A}
1296N/A/* Todo: XListInstalledColormaps, XListFonts, XListFontsWithInfo, XGetFontPath */
1296N/A
1296N/AXListExtensions(d, n) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(undefined); /* n * char* + extension strings */
1296N/A }
1296N/A}
1296N/AXListProperties(d, w, n) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(n * 4);
1296N/A }
1296N/A}
1296N/AXListHosts(d, n, s) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(undefined); /* n * char* + extension strings */
1296N/A }
1296N/A}
1296N/A
1296N/AXKeycodeToKeysym(d, k, i) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A}
1296N/AXLookupKeysym(e, i) : noescape {
1296N/A "null-pointer-deref-call-X"(e) : e != 0;
1296N/A}
1296N/AXGetKeyboardMapping(d, fk, kc, ks) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(kc * ks);
1296N/A }
1296N/A}
1296N/AXStringToKeysym(s) : noescape {
1296N/A "null-pointer-deref-call-X"(s) : s != 0;
1296N/A}
1296N/AXMaxRequestSize(d) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A}
1296N/AXExtendedMaxRequestSize(d) : XMaxRequestSize(d);
1296N/AXScreenResourceString(d) : XMaxRequestSize(d);
1296N/AXDisplayMotionBufferSize(d) : XMaxRequestSize(d);
1296N/AXVisualIdFromVisual(v) : noescape {
1296N/A /* Todo: visual resource id? */
1296N/A "null-pointer-deref-call-X"(v) : v != 0;
1296N/A}
1296N/A
1296N/AXLockDisplay(d) : XMaxRequestSize(d);
1296N/AXUnlockDisplay(d) : XMaxRequestSize(d);
1296N/A
1296N/AXAddExtension(d) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A result == new(128);
1296N/A }
1296N/A}
1296N/AXInitExtension(d, n) : XAddExtension(d);
1296N/AXFindOnExtensionList(s, n) {
1296N/A "null-pointer-deref-call-X"(s) : s != 0;
1296N/A}
1296N/A
1296N/A/* these are routines for which there are also macros */
1296N/AXDefaultRootWindow(d) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A}
1296N/AXRootWindow(d, n) : XDefaultRootWindow(d);
1296N/AXRootWindowOfScreen(s) : XDefaultRootWindow(s);
1296N/AXDefaultVisual(d, n) : XDefaultRootWindow(d);
1296N/AXDefaultVisualOfScreen(s) : XDefaultRootWindow(s);
1296N/AXDefaultGC(d, n) : XDefaultRootWindow(d);
1296N/AXDefaultGCOfScreen(s) : XDefaultRootWindow(s);
1296N/AXBlackPixel(d, n) : XDefaultRootWindow(d);
1296N/AXWhitePixel(d, n) : XDefaultRootWindow(d);
1296N/AXBlackPixelOfScreen(s) : XDefaultRootWindow(s);
1296N/AXWhitePixelOfScreen(s) : XDefaultRootWindow(s);
1296N/AXNextRequest(d) : XDefaultRootWindow(d);
1296N/AXLastKnownRequestProcessed(d) : XDefaultRootWindow(d);
1296N/AXServerVendor(d) : XDefaultRootWindow(d);
1296N/AXDisplayString(d) : XDefaultRootWindow(d);
1296N/A
1296N/AXDefaultColormap(d, n) : noescape {
1296N/A /* Todo: colormap resource id? */
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A}
1296N/AXDefaultColormapOfScreen(s) : XDefaultColormap(s, 0);
1296N/A
1296N/AXDisplayOfScreen(s) : XDefaultRootWindow(s);
1296N/AXScreenOfDisplay(d, n) : XDefaultRootWindow(d);
1296N/AXDefaultScreenOfDisplay(d) : XDefaultRootWindow(d);
1296N/AXEventMaskOfScreen(s) : XDefaultRootWindow(s);
1296N/AXScreenNumberOfScreen(s) : XDefaultRootWindow(s);
1296N/A
1296N/A/* Todo: XSetErrorHandler, XSetIOErrorHandler */
1296N/A
1296N/AXListPixmapFormats(d, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A "null-pointer-deref-call-X"(c) : c != 0;
1296N/A if (result != 0) {
1296N/A result == new(c * 12); /* sizeof(XPixmapFormatValues) */
1296N/A }
1296N/A}
1296N/AXListDepths(d, s, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A "null-pointer-deref-call-X"(c) : c != 0;
1296N/A if (result != 0) {
1296N/A result == new(c * 4); /* sizeof(int) */
1296N/A }
1296N/A}
1296N/A/* Todo: ICCCM routines - XReconfigureWMWindow...XSetWMColormapWindows,
1296N/A XSetTransientForHint */
1296N/AXFreeStringList(l) : free(l);
1296N/A
1296N/AXActivateScreenSaver(d) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A}
1296N/AXAddHost(d, h) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A "null-pointer-deref-call-X"(h) : h != 0;
1296N/A}
1296N/AXAddHosts(d, h, n) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A "null-pointer-deref-call-X"(h) : h != 0;
1296N/A}
1296N/A/* Todo: XAddToExtensionList...XClearWindow */
1296N/AXCloseDisplay(d) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A delete(d);
1296N/A}
1296N/A/* Todo: XConfigureWindow...XDeleteProperty */
1296N/AXDestroyWindow(d, w) {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(w);
1296N/A}
1296N/AXDestroySubwindows(d, w) : XDestroyWindow(d, w); /* Todo: subwindows? */
1296N/A/* Todo: XDoesBackingStore...XDisplayHeightMM */
1296N/AXDisplayKeycodes(d, min, max) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A min >= 8;
1296N/A max <= 255;
1296N/A}
1296N/A/* Todo: XDisplayPlanes...XEventsQueued */
1296N/AXFetchName(d, w, name) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (name != 0) {
1296N/A name == new(undefined);
1296N/A }
1296N/A}
1296N/A/* Todo: XFillArcs...XForceScreenSaver */
1296N/AXFree(p) : free(p);
1296N/AXFreeColormap(d, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(c);
1296N/A}
1296N/A/* Todo: XFreeColors */
1296N/AXFreeCursor(d, c) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(c);
1296N/A}
1296N/AXFreeExtensionList(l) : free(l);
1296N/AXFreeFont(d, f) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(f);
1296N/A}
1296N/A/* Todo: XFreeFontInfo */
1296N/AXFreeFontNames(l) : free(l);
1296N/AXFreeFontPath(l) : free(l);
1296N/AXFreeGC(d, gc) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(gc);
1296N/A}
1296N/AXFreeModifierMap(m) : free(m);
1296N/AXFreePixmap(d, p) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A destroy<x-resource>(p);
1296N/A}
1296N/A/* Todo: XGeometry...XGetGeometry */
1296N/AXGetIconName(d, w, name) : XFetchName(d, w, name);
1296N/A/* Todo: XGetInputFocus...XGetTransientForHint */
1296N/AXGetWindowProperty(d, w, p, lo, ll, del, rt, at, af, n, bar, prop) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (prop != 0) {
1296N/A prop == new(undefined);
1296N/A }
1296N/A}
1296N/A/* Todo: XGetWindowAttributes...XQueryColors */
1296N/AXQueryExtension(d, n, op, ev, er) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A if (result != 0) {
1296N/A op >= 128;
1296N/A op <= 255;
1296N/A }
1296N/A}
1296N/A/* Todo: XQueryKeymap...XQueryTextExtents16 */
1296N/AXQueryTree(d, w, r, p, c, nc) : noescape {
1296N/A "null-pointer-deref-call-X"(d) : d != 0;
1296N/A "null-pointer-deref-call-X"(c) : c != 0;
1296N/A if (result != 0) {
1296N/A c == new(nc * 4);
1296N/A }
1296N/A}
1296N/A/* Todo: XRaiseWindow...XRemoveFromSaveSet */
1296N/AXRemoveHost(d, h) : XAddHost(d, h);
1296N/AXRemoveHosts(d, h, n) : XAddHosts(d, h, n);
1296N/A/* Todo: XReparentWindow...XFreeEventData */
1296N/A
1296N/A/* Allocation functions from <X11/Xutil.h> */
1296N/AXAllocClassHint() : malloc(size(result));
1296N/AXAllocIconSize() : malloc(size(result));
1296N/AXAllocSizeHints() : malloc(size(result));
1296N/AXAllocStandardColormap() : malloc(size(result));
1296N/AXAllocWMHints() : malloc(size(result));
1296N/A
1296N/A/** libXt
1296N/A * Functions from Xt's Alloc.c - like libc ones, except exit on failure,
1296N/A * instead of return NULL
1296N/A */
1296N/AXtAsprintf(p,const fmt,args...) : printf(fmt,args), noescape {
1296N/A *p == new(result);
1296N/A}
1296N/A
1296N/AXtMalloc(s) {
1296N/A result == new(s);
1296N/A}
1296N/A
1296N/AXtRealloc(p,s) {
1296N/A delete(p);
1296N/A result == new(s);
1296N/A}
1296N/A
1296N/AXtCalloc(n,s) {
1296N/A result == new(n*s);
1296N/A}
1296N/A
1296N/AXtFree(p) : free(p);
1296N/A
1296N/A/*************************************************************************
1296N/A * Server side functions
1296N/A */
1296N/A
1296N/A/* include/misc.h: byte swapping */
1296N/A /* XXX - does not work! */
1296N/Abugtype "wrong-size-swap"(ptr,funcsize) {
1296N/A name="Wrong size Xserver swap function used";
1296N/A priority="error";
1296N/A enabled="true";
1296N/A message="Wrong size swap function used: ", callee_name(), " expects ", funcsize, "-byte variable, got ", size(ptr),"-byte ", name(ptr), " instead.";
1296N/A}
1296N/A
1296N/Aswap_uint32(x) : noescape {
1296N/A "wrong-size-swap"(x,4): size(*x) == 4;
1296N/A}
1296N/Aswap_uint16(x) : noescape {
1296N/A "wrong-size-swap"(x,2): size(*x) == 4;
1296N/A}
1296N/ASwapLongs(x,count) : noescape {
1296N/A "wrong-size-swap"(x,4): size(x) == 4;
1296N/A}
1296N/ASwapShorts(x,count) : noescape {
1296N/A "wrong-size-swap"(x,2): size(x) == 4;
1296N/A}
1296N/A
1296N/A/* dix/pixmap.c */
1296N/AAllocatePixmap(const pScreen, pixDataSize) : noescape {
1296N/A if (result != 0) {
1296N/A result == new(pixDataSize);
1296N/A }
1296N/A}
1296N/AFreePixmap(p) : free(p);
1296N/A
1296N/A/* dix/region.c */
1296N/ARegionCreate(const rect, s) {
1296N/A result == new(12); /* sizeof struct pixman_region16 */
1296N/A}
1296N/ARegionDestroy(p) : free(p);
1296N/A
1296N/A/* fb/fbpixmap.c */
1296N/AfbCreatePixmapBpp(const pS, w, h, d, b, ht) {
1296N/A if (result != 0) {
1296N/A result == new(w*h);
1296N/A }
1296N/A}
1296N/AfbCreatePixmap(const pS, w, h, d, ht) : fbCreatePixmapBpp(pS, w, h, d, d, ht);
1296N/AfbDestroyPixmap(p) : FreePixmap(p);
1296N/A
1296N/A/* os/log.c: logging functions */
1296N/ALogWrite(verb, const fmt, args...) : printf(fmt, args), noescape;
1296N/ALogMessageVerb(type, verb, const fmt, args...) : printf(fmt, args), noescape;
1296N/ALogMessage(type, const fmt, args...) : printf(fmt, args), noescape;
1296N/AFatalError(const fmt, args...) : printf(fmt, args), noescape, exit;
1296N/AErrorF(const fmt, args...) : printf(fmt, args), noescape;
1296N/AAbortServer(): exit;
1296N/A
1296N/A/* os/utils.c: allocation & other helpers */
1296N/AXalloc(s) : malloc(s);
1296N/AXNFalloc(s) {
1296N/A result == new(s);
1296N/A}
1296N/AXcalloc(s) : calloc(1,s);
1296N/AXNFcalloc(s) : XNFalloc(s);
1296N/AXrealloc(p, s) : realloc(p, s);
1296N/AXNFrealloc(p, s) : realloc(p, s);
1296N/AXfree(p) : free(p);
1296N/AXstrdup(const s) : noescape {
1296N/A if ( s == 0 ) {
1296N/A result == 0;
1296N/A } else {
1296N/A if( result != 0 ) {
1296N/A result == new(strlen(s)+1);
1296N/A strlen(result) == strlen(s);
1296N/A }
1296N/A }
1296N/A}
1296N/AXNFstrdup(const s) : noescape {
1296N/A if ( s == 0 ) {
1296N/A result == 0;
1296N/A } else {
1296N/A result == new(strlen(s)+1);
1296N/A strlen(result) == strlen(s);
1296N/A }
1296N/A}
1296N/AOsAbort() : abort();
1296N/AFopen(f, m) : fopen(f, m);
1296N/AFclose(p) : fclose(p);
1296N/A
1296N/A/* os/xprintf.c: allocating printf wrappers/variants */
1296N/AXvasprintf(p, fmt, va) : vasprintf(p, fmt, va);
1296N/AXasprintf(p, fmt, args...) : asprintf(p, fmt, args);
1296N/AXNFvasprintf(p, fmt, va) : noescape {
1296N/A *p == new(result);
1296N/A}
1296N/AXNFasprintf(p, fmt, args...) : noescape, printf(fmt, args) {
1296N/A *p == new(result);
1296N/A}
1296N/AXvprintf(fmt, va) : noescape {
1296N/A if (result != 0) {
1296N/A result == new(undefined);
1296N/A }
1296N/A}
1296N/AXprintf(fmt, args...) : noescape, printf(fmt, args) {
1296N/A if (result != 0) {
1296N/A result == new(undefined);
1296N/A }
1296N/A}
1296N/AXNFvprintf(fmt, va) : noescape {
1296N/A result == new(undefined);
1296N/A}
1296N/AXNFprintf(fmt, args...) : noescape, printf(fmt, args) {
1296N/A result == new(undefined);
1296N/A}