<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Josh Lospinoso: Bits]]></title><description><![CDATA[Systems, C++, security, and the places source-level promises meet machine reality.]]></description><link>https://newsletter.lospino.so/s/bits</link><image><url>https://substackcdn.com/image/fetch/$s_!J1s6!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbd84e8-dd86-4cb0-9020-ec043bfdabe0_1024x1024.png</url><title>Josh Lospinoso: Bits</title><link>https://newsletter.lospino.so/s/bits</link></image><generator>Substack</generator><lastBuildDate>Mon, 10 Aug 2026 15:35:29 GMT</lastBuildDate><atom:link href="https://newsletter.lospino.so/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Josh Lospinoso]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[joshlospinoso@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[joshlospinoso@substack.com]]></itunes:email><itunes:name><![CDATA[Josh Lospinoso]]></itunes:name></itunes:owner><itunes:author><![CDATA[Josh Lospinoso]]></itunes:author><googleplay:owner><![CDATA[joshlospinoso@substack.com]]></googleplay:owner><googleplay:email><![CDATA[joshlospinoso@substack.com]]></googleplay:email><googleplay:author><![CDATA[Josh Lospinoso]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[ARM64 Is Not Just x64 With More Registers]]></title><description><![CDATA[Here is a small AArch64 bug:]]></description><link>https://newsletter.lospino.so/p/arm64-is-not-just-x64-with-more-registers</link><guid isPermaLink="false">https://newsletter.lospino.so/p/arm64-is-not-just-x64-with-more-registers</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Sat, 25 Jul 2026 19:00:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7yU-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7yU-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7yU-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7yU-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70341,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7yU-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!7yU-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F161cd589-6404-4399-8f0d-d0da0183b28e_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here is a small AArch64 bug:</p><pre><code><code>bad_wrapper:
 bl helper
 ret</code></code></pre><p>It looks plausible if the mental model came from x86. Call a helper. Return to the caller. But AArch64 bl does not push a return address onto the stack. It writes the return address into the link register, x30. If bad_wrapper entered with its caller&#8217;s return address in x30, then bl helper overwrote it. The later ret no longer has the original link-register state.</p><p>A non-leaf wrapper usually has to preserve what it will need after the nested call:</p><pre><code><code>good_wrapper:
 stp x29, x30, [sp, #-16]!
 mov x29, sp
 bl helper
 ldp x29, x30, [sp], #16
 ret</code></code></pre><p>That is the claim: ARM64 is not x64 with a larger register file. The instruction set gives you registers. The ABI tells you which registers are part of the call packet, which ones are reserved, how the stack behaves, where the return address lives, and which platform rules apply.</p><p>AAPCS64 gives a clean first table. x0 through x7 are parameter/result registers. v0 through v7 carry floating-point and SIMD arguments. x30 is the link register. x29 is the frame pointer. x8 can be the indirect result location register.</p><p>That table is useful. It is not the whole ABI.</p><p>The sharp example is x18. Architecturally, it is a general-purpose register. ABI-wise, it has a passport problem. AAPCS64 defines it as platform-specific and warns portable hand-written assembly to avoid it. Windows ARM64 reserves x18 as a platform register. Code that casually uses it as scratch may work in one environment and violate the platform contract in another.</p><p>Stack rules have the same shape. Alignment, red zones, frame-pointer expectations, and unwind metadata are platform ABI properties, not facts you get from the words &#8220;ARM64.&#8221; ARM64EC makes the point even harder: it runs on ARM64 hardware, but follows x64-oriented software conventions for mixed ARM64/x64 interoperability on Windows.</p><p>The boundary is evidence. A register-file fact is not automatically an ABI fact. A base ABI fact is not automatically a platform fact. A platform ABI fact is not universal hardware behavior.</p><p>Ask which ARM64 ABI you are in before deciding what a register means.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/arm64-is-not-just-x64/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260605_arm64-is-not-just-x64&amp;utm_content=backfill_dispatch">ARM64 Is Not Just x64 With More Registers</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-05. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[C Constructs That Still Don't Work in C++ - and a Few That Changed]]></title><description><![CDATA[C++ is not a superset of C.]]></description><link>https://newsletter.lospino.so/p/c-constructs-that-still-dont-work</link><guid isPermaLink="false">https://newsletter.lospino.so/p/c-constructs-that-still-dont-work</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Tue, 21 Jul 2026 19:00:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PhHE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PhHE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PhHE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PhHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PhHE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!PhHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86950526-4e63-4ddf-a0c8-cfc9f37611ad_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>C++ is not a superset of C.</p><p>That warning is still accurate, but it is less useful when stated without a language mode. The 2019 version of this post surveyed C constructs that do not work in C++. The 2026 update does not retire that advice. It makes the border more precise.</p><p>The question is no longer only &#8220;does valid C compile as C++?&#8221; Often it is: C17, C23, C++17, C++20, or C++23?</p><p>Designated initialization is the clean example. C++20 added designated initializers, but not the whole C feature. C designators can target array elements, nested members, and fields out of declaration order. The C++20 form is narrower: direct non-static data members, declaration order, and all-designated clauses. C-style array designators, nested designators, out-of-order designators, and mixed positional/designated clauses remain outside the portable C++ form.</p><p>The old empty-parameter-list trap moved too. In C17 and earlier, <code>void f()</code> did not mean the same thing C++ programmers normally expect. It did not provide a prototype saying &#8220;no parameters.&#8221; C23 changed that: <code>void f()</code> now behaves as though declared with <code>void</code>. So the compatibility answer depends on which C mode is in play.</p><p>The <code>malloc</code> row is still easy to misread. In C++, <code>void*</code> does not implicitly convert to an object pointer type. But the cast is not the interesting part. Lifetime is. C++20 repaired some implicit-lifetime cases around allocation, but allocation still does not call constructors, initialize values, or make non-implicit-lifetime types safe to use without construction.</p><p>Other checkpoint rows remain: discarding <code>const</code>, enum behavior including C23 changes, <code>restrict</code>, and flexible array members. Each row is less a trivia question than a reminder that source compatibility, ABI boundaries, object lifetime, and compiler mode are different obligations.</p><p>The practical rule is simple: when discussing C/C++ compatibility, label the language mode before drawing the conclusion. &#8220;Valid C&#8221; and &#8220;valid C++&#8221; are not precise enough anymore.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/c-constructs-that-still-dont-work-in-cpp/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260520_c-constructs-that-still-dont-work-in-cpp&amp;utm_content=backfill_dispatch">C Constructs That Still Don&#8217;t Work in C++ - and a Few That Changed</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-05-20. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[The ABI Is the Boundary]]></title><description><![CDATA[This Rust declaration is not just convenient syntax:]]></description><link>https://newsletter.lospino.so/p/the-abi-is-the-boundary</link><guid isPermaLink="false">https://newsletter.lospino.so/p/the-abi-is-the-boundary</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Mon, 20 Jul 2026 19:01:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bj56!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bj56!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bj56!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!bj56!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!bj56!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!bj56!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bj56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74194,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bj56!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!bj56!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!bj56!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!bj56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84dac447-2b52-4232-8336-e266ad310e45_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This Rust declaration is not just convenient syntax:</p><pre><code><code>unsafe extern "C" {
 fn five_ints(a: i32, b: i32, c: i32, d: i32, e: i32) -&gt; i32;
}</code></code></pre><p>It is a boundary claim.</p><p>The declaration says there is a function somewhere else. It says Rust should lower the call using the target&#8217;s C ABI rather than Rust&#8217;s own internal calling convention. It says the source-level types in the declaration match the binary packet the other side will decode. The compiler can generate the packet. It cannot prove the declaration is true.</p><p>That is the claim of the essay: modern software has not escaped ABI problems. It has moved them to sharper composition points: Rust FFI, Python native extensions, WebAssembly components, eBPF helpers, plugin APIs, and compatibility modes.</p><p>A boring C-shaped plugin table shows why this keeps happening:</p><pre><code><code>struct plugin_api {
 int (*open)(void *ctx, const char *path);
 int (*read)(void *ctx, void *buf, unsigned long len);
 void (*close)(void *ctx);
};</code></code></pre><p>This is not elegant in the way high-level language APIs are elegant. That is part of the point. The receiver is explicit. The context pointer is explicit. The function signatures are fixed. C++ object layout, exceptions, hidden receivers, and runtime-specific ownership semantics do not leak directly into the public contract. The boundary still has many ways to fail - integer widths, alignment, lifetime, allocator ownership, callback table layout - but fewer of them are invisible.</p><p>The boundary matters because independently built pieces do not share intent. They share a packet. In Rust FFI, the packet is a native call. In CPython&#8217;s Stable ABI, it is a versioned symbol and structure contract. In WebAssembly components, it is canonical lowering through core Wasm values and linear memory. In eBPF, it is a verifier-understood register convention.</p><p>Do not overread the design rule. A C-shaped boundary is not automatically safe. A stable runtime ABI does not repeal the platform ABI beneath it. A high-level declaration does not prove a binary fact.</p><p>The safer rule is narrower: when two independently built systems meet, specify the packet the other side can actually decode.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/the-abi-is-the-boundary/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260609_the-abi-is-the-boundary&amp;utm_content=backfill_dispatch">The ABI Is the Boundary</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-09. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[It Works Until the Stack Walker Arrives]]></title><description><![CDATA[A hand-written function, JIT stub, or trampoline can pass the easiest test: it returns to the caller with the right value.]]></description><link>https://newsletter.lospino.so/p/it-works-until-the-stack-walker-arrives</link><guid isPermaLink="false">https://newsletter.lospino.so/p/it-works-until-the-stack-walker-arrives</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Sat, 18 Jul 2026 19:01:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gc8I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gc8I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gc8I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gc8I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59132,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789613?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gc8I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!gc8I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb531c6b-b74e-473d-a1d3-bd7a388ecf0e_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A hand-written function, JIT stub, or trampoline can pass the easiest test: it returns to the caller with the right value.</p><p>That is not enough.</p><p>The claim in this essay is narrower and more useful: modern ABI correctness includes the failure path. A function frame has to be executable on the sunny path and explainable when an exception runtime, debugger, profiler, sanitizer, or crash reporter needs to reconstruct the caller. Returning correctly proves the epilogue worked. It does not prove the frame can be unwound.</p><p>The concrete artifact is unwind metadata. On Windows x64, a non-leaf function that allocates stack or calls another function is not fully described by its code bytes alone. The system also needs a function-table entry and unwind information: where the function starts and ends, how much stack it allocated, which nonvolatile registers were saved, and how to recover the caller&#8217;s state. On ELF-oriented toolchains, hand-written assembly often tells the same story through CFI directives:</p><pre><code><code>.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset rbp, -16
mov rbp, rsp
.cfi_def_cfa_register rbp
call helper
pop rbp
.cfi_def_cfa rsp, 8
ret
.cfi_endproc</code></code></pre><p>The exact encoding varies by platform. The mechanism does not: a live frame needs a machine-readable explanation.</p><p>The boundary is important. This is not a claim that every small leaf helper needs elaborate metadata, or that one Windows rule generalizes cleanly to every object format. Leaf-function shortcuts exist. Platform rules differ. The bug appears when the function evolves - adds a call, saves a nonvolatile register, allocates scratch space, or becomes a trampoline - and the frame description does not evolve with it.</p><p>That creates a boring failure mode, which is why it is common: the code works until observability enters the system.</p><p>That is the practical boundary: the call has to remain explainable to the machinery that arrives after the sunny path has already succeeded.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/it-works-until-the-stack-walker-arrives/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260608_it-works-until-the-stack-walker-arrives&amp;utm_content=backfill_dispatch">It Works Until the Stack Walker Arrives</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-08. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Varargs: The Function Call With Missing Type Information]]></title><description><![CDATA[printf is not just another function call.]]></description><link>https://newsletter.lospino.so/p/varargs-the-function-call-with-missing</link><guid isPermaLink="false">https://newsletter.lospino.so/p/varargs-the-function-call-with-missing</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Thu, 16 Jul 2026 19:00:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zDl5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zDl5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zDl5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zDl5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49699,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789527?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zDl5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zDl5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc1f2bca-8fba-4522-912a-7525a112f93e_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>printf is not just another function call.</p><p>Its signature stops describing the interesting part:</p><pre><code><code>int printf(const char *fmt, ...);</code></code></pre><p>The fixed prefix says there is a format string. The ellipsis says the rest of the typed parameter list is missing. The caller may pass an int, a double, a pointer, a promoted char, a promoted float, or a sequence selected by another layer. The callee does not receive named source-level parameters for those trailing values. It receives ABI state and a va_list mechanism that must recover them later.</p><p>That is the claim: varargs are not merely flexible syntax. They are a function-call protocol with missing type information.</p><p>A small artifact shows the problem:</p><pre><code><code>int call_printf_double(double x) {
 return printf("x=%f\n", x);
}</code></code></pre><p>On System V AMD64, the format string goes in rdi, the double is in xmm0, and the caller sets al to indicate vector-register usage for a call that may reach a variadic callee. That AL marker is not visible in the C signature, but the variadic machinery depends on it.</p><p>Windows x64 solves a related problem differently. For a vararg or unprototyped call, a floating-point value must be duplicated into the corresponding general-purpose register as well as the floating-point register. In the printf(&#8221;x=%f\n&#8221;, x) shape, the wrapper can move the floating-point value into the right XMM lane and also copy its bits into the matching integer register.</p><p>Same source value. Different transport rules.</p><p>The format string does not replace the ABI. It tells printf what to request. It does not place the unnamed double in an XMM register, duplicate it into a general-purpose register, set AL, create a register-save area, or put overflow arguments on the stack in the expected location.</p><p>The boundary is FFI. A foreign-function bridge can often model a fixed signature:</p><pre><code><code>void log_f64(const char *label, double value);</code></code></pre><p>A variadic function asks it to model a family of call shapes. Each unnamed suffix can change register usage, stack usage, and ABI-specific metadata. The conservative rule is boring because it is correct: avoid exposing variadic C APIs across language boundaries when fixed wrappers are practical.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/varargs-missing-type-information/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260604_varargs-missing-type-information&amp;utm_content=backfill_dispatch">Varargs: The Function Call With Missing Type Information</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-04. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Hidden Arguments Are Everywhere]]></title><description><![CDATA[The most important field in a function call is often the one the source code did not spell.]]></description><link>https://newsletter.lospino.so/p/hidden-arguments-are-everywhere</link><guid isPermaLink="false">https://newsletter.lospino.so/p/hidden-arguments-are-everywhere</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Wed, 15 Jul 2026 19:00:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wUkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wUkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wUkU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wUkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66501,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789484?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wUkU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!wUkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dbce8c5-c249-4c6e-8e3d-719517e3ad87_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The most important field in a function call is often the one the source code did not spell.</p><p>A programmer may write:</p><pre><code><code>struct Big make_big(long long seed);</code></code></pre><p>The ABI may need a different shape:</p><pre><code><code>make_big(result_storage, seed)</code></code></pre><p>That is the claim: the source-level function signature is not the full call packet. It tells the programmer what expression is legal. It does not necessarily tell the binary where the return storage lives, how the callee receives an object pointer, which runtime context arrives first, or whether a thunk has adjusted the receiver before control reaches the final implementation.</p><p>The cleanest artifact is a large structure return. In one fixture, the source function returns a record by value:</p><pre><code><code>struct SretRecord make_sret_record(unsigned long long seed,
 unsigned long long tag);</code></code></pre><p>At the ABI layer, several platforms turn that return value into an incoming storage channel. On Windows x64, the caller-allocated return storage can arrive as the first argument, shifting the visible values right. On System V AMD64, MEMORY-class returns use caller-provided storage in RDI as if it were the first argument. On AArch64, the indirect result location has a dedicated role in x8, so the visible seed and tag can remain in x0 and x1.</p><p>Same source shape. Different hidden-field placement.</p><p>The pattern does not stop with structure returns. A C++ member function needs a receiver even when the object sits outside the parentheses:</p><pre><code><code>counter.add(5);</code></code></pre><p>The callee still needs something like:</p><pre><code><code>Counter_add(object, 5)</code></code></pre><p>JNI makes the runtime version explicit: native methods receive JNIEnv * first, then either the object or class, then the ordinary Java parameters.</p><p>The boundary is important. Hidden arguments are not hacks, and the source signature is not dishonest. It is faithful at its layer. The mistake is carrying that layer across a real ABI or FFI boundary and assuming the visible parameter list is the complete wire format.</p><p>The safer question is not only: what are the parameters?</p><p>It is: what are the ABI-visible fields?</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/hidden-arguments-are-everywhere/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260603_hidden-arguments-are-everywhere&amp;utm_content=backfill_dispatch">Hidden Arguments Are Everywhere</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-03. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[The Bugs That Make ABI Rules Memorable]]></title><description><![CDATA[ABI rules are easier to remember when you watch the packet break.]]></description><link>https://newsletter.lospino.so/p/the-bugs-that-make-abi-rules-memorable</link><guid isPermaLink="false">https://newsletter.lospino.so/p/the-bugs-that-make-abi-rules-memorable</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Tue, 14 Jul 2026 19:01:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!M5dP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M5dP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M5dP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M5dP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61421,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M5dP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!M5dP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c56b895-79f9-4570-a313-84c155b3359a_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>ABI rules are easier to remember when you watch the packet break.</p><p>Here is a deliberately malformed sketch:</p><pre><code><code>; Windows-shaped setup, SysV-shaped callee
sub rsp, 40
mov dword ptr [rsp + 32], 5
mov ecx, 1
mov edx, 2
mov r8d, 3
mov r9d, 4
call five_ints</code></code></pre><p>Every instruction is real. The call target can exist. The machine can execute the sequence. The packet is still wrong.</p><p>If the callee decodes the call under the System V AMD64 ABI, this is not a correct encoding of:</p><pre><code><code>five_ints(1, 2, 3, 4, 5);</code></code></pre><p>For this all-integer function, a SysV AMD64 callee expects edi = a, esi = b, edx = c, ecx = d, and r8d = e. The sketch above was built from a Windows x64 mental model: ecx, edx, r8d, r9d, then a stack slot after the home area. The callee is not obligated to share that belief.</p><p>The concrete technical artifact is the wrong-register-schema bug. It does not require undefined source code or an invalid instruction. It requires a caller and callee that disagree about how local state has been serialized. A tracer may record the wrong argument. A hook may forward the wrong field. An FFI bridge may appear to work for one call shape and fail when the destination ABI changes.</p><p>The claim is broader than register tables: ABI bugs are malformed local serialization. The source call can be plausible while the binary packet is wrong. Hidden result storage, hidden receivers, stack home areas, varargs recovery state, and platform-specific preservation rules are all fields in that packet.</p><p>The boundary matters. The bug zoo is not a standards document, and a compiler listing is not the law. The disciplined rule is: ABI document as authority, generated assembly as receipt. A receipt can show what one compiler emitted for one target and one source shape. It cannot prove every compiler emits that sequence, every malformed call crashes, or every symptom looks the same.</p><p>The useful habit is adversarial but restrained: source belief, ABI field, broken packet, narrow symptom claim, evidence boundary.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/abi-bug-zoo/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260602_abi-bug-zoo&amp;utm_content=backfill_dispatch">The Bugs That Make ABI Rules Memorable</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-02. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Same Function, Three Realities]]></title><description><![CDATA[A register name is not a meaning.]]></description><link>https://newsletter.lospino.so/p/same-function-three-realities</link><guid isPermaLink="false">https://newsletter.lospino.so/p/same-function-three-realities</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Mon, 13 Jul 2026 19:00:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LVAr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LVAr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LVAr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LVAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:80680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/204789306?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LVAr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!LVAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eab3e9f-8070-464f-887a-013ea759e50c_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A register name is not a meaning.</p><p>Start with a deliberately boring function:</p><pre><code><code>int five_ints(int a, int b, int c, int d, int e);</code></code></pre><p>And a deliberately boring call:</p><pre><code><code>five_ints(1, 2, 3, 4, 5);</code></code></pre><p>Nothing about the source is clever. Every argument is visible. The return value is a plain int. There is no hidden structure return, no C++ receiver, no varargs, no virtual dispatch, and no interesting object model problem. That is why the example is useful. If the generated call differs across targets, the difference is the ABI packet.</p><p>The concrete artifact is the ecx trap:</p><pre><code><code>; Windows x64
mov ecx, 1 ; a</code></code></pre><p>; System V AMD64 mov ecx, 4 ; d</p><p>The same physical register carries different semantic fields under different ABIs. On Windows x64, integer arguments in the leftmost four positions use RCX, RDX, R8, and R9; the fifth argument goes on the stack after the caller-provided home area. On System V AMD64, the integer register sequence begins RDI, RSI, RDX, RCX, R8, R9. On AArch64 Linux, this all-integer call maps cleanly to w0 through w4.</p><p>The claim is small but important: a source-level call does not carry a universal register schema. The ABI gives locations meaning. Without that schema, rcx is just a register.</p><p>This is where reverse-engineering, tracing, hooking, and FFI code go wrong. A tool that labels rcx as &#8220;argument 1&#8221; has already made a platform claim. That claim is correct in one context and wrong in another. The machine may still execute the instruction stream. The failure is not necessarily an illegal instruction or an immediate crash. It may be a valid instruction stream in the wrong language.</p><p>The boundary is also important. A compiler listing is a receipt, not the authority. Optimizers can inline, fold, tail-call, spill, or reshape a wrapper while still respecting the ABI at the real boundary. The ABI document defines the contract; the assembly gives you a microscope for one controlled source shape.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/same-function-three-realities/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260601_same-function-three-realities&amp;utm_content=backfill_dispatch">Same Function, Three Realities</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-01. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.lospino.so/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[The Function Signature Is a Lie]]></title><description><![CDATA[A function signature tells you what a source-level call is allowed to look like.]]></description><link>https://newsletter.lospino.so/p/the-function-signature-is-a-lie</link><guid isPermaLink="false">https://newsletter.lospino.so/p/the-function-signature-is-a-lie</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Fri, 10 Jul 2026 19:00:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZYNV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZYNV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZYNV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 424w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 848w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 1272w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZYNV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4016,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/svg+xml&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/203751990?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZYNV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 424w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 848w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 1272w, https://substackcdn.com/image/fetch/$s_!ZYNV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19260472-0bcd-42af-9fed-1c9098dd975b_1500x1000.svg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A function signature tells you what a source-level call is allowed to look like. It does not tell you the whole binary protocol the caller and callee must speak.</p><p>Consider this ordinary-looking declaration:</p><pre><code><code>struct Big make_big(long long seed);</code></code></pre><p>At the source level, there is one visible argument and one return value. At the ABI boundary, that can become a different packet. If struct Big is not returned in registers, the caller may allocate result storage and pass a pointer to that storage into the callee. That pointer is not written in the source signature, but it is part of the call.</p><p>The concrete artifact is the hidden result-storage path. For a deliberately large return object, common 64-bit ABIs do not all encode the same source call the same way. On Windows x64, the result pointer is passed in RCX, and the visible seed shifts to RDX. On System V AMD64, the result pointer is passed in RDI, and seed shifts to RSI. On AAPCS64, the indirect result location uses x8, while the visible argument can remain in x0.</p><p>That distinction matters for JIT stubs, FFI bridges, hooks, hand-written trampolines, profilers, and any code that constructs or interprets a call below the source language. A bridge that sends only the visible arguments may build a packet the callee cannot decode. On Windows x64 or System V AMD64, the first visible value can land where the callee expects a writable result address. On AAPCS64, the visible arguments may look correct while x8 is stale or unset.</p><p>The boundary is narrow. This does not mean every source-level call literally performs a platform ABI ceremony at runtime. The compiler can inline, fold, specialize, or erase calls when both sides are under its control. The ABI matters when independently compiled code must meet.</p><p>The safer claim is this: the function signature is a programmer-facing projection. The ABI call is the machine-facing protocol.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/the-function-signature-is-a-lie/?utm_source=substack&amp;utm_medium=web&amp;utm_campaign=20260529_the-function-signature-is-a-lie&amp;utm_content=backfill_dispatch">The Function Signature Is a Lie</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-05-29. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[A 200 Response Is Not a Record]]></title><description><![CDATA[A crawler can be correct about HTTP and still wrong about the result.]]></description><link>https://newsletter.lospino.so/p/a-200-response-is-not-a-record</link><guid isPermaLink="false">https://newsletter.lospino.so/p/a-200-response-is-not-a-record</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Thu, 09 Jul 2026 19:01:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XbJ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XbJ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XbJ1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XbJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/205004413?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XbJ1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 424w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 848w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!XbJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7194d4d-d66d-4c91-b49c-af6d17fa3fa4_1500x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Abrade started from a small useful premise: generate patterned URLs, probe them, and record the candidates that appear to exist.</p><p>That premise is still useful. It is also too small if the crawler treats every kind of &#8220;success&#8221; as the same claim.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The 2026 refresh of Abrade, a C++23 command-line crawler, is mostly about separating those claims. The pressure point is simple: 2xx is transport evidence, not content truth. A server returning HTTP 200 may only prove that the request reached an HTTP application and received a successful response class. It does not prove that the response is the record being sought.</p><p>It can be an empty result, a placeholder, a login wall, a shell page, a default route, or a route that exists without containing the domain object.</p><p>That difference matters because &#8220;the request completed,&#8221; &#8220;the body contains evidence,&#8221; and &#8220;the run had operational problems&#8221; are not interchangeable. Abrade v0.3.0 makes that distinction explicit. It still generates candidate resource paths and performs concurrent HTTP requests. It still defaults to <code>HEAD</code>, and it can fetch bodies with <code>GET</code>. But the refreshed tool adds clearer boundaries around what is being measured: TLS with SNI for DNS host names, optional platform CA and DNS host verification with <code>--verify</code>, conservative redirects, dry-run generation, body-only output, body filters, and run summaries that account for filtered bodies, runtime errors, bytes written, and throughput.</p><p>One diagnostic sample in the canonical post exposed two common crawler mistakes. Without SNI, HTTPS failed before there was any meaningful application response. After SNI, many <code>200</code> responses still were not useful records. TLS success was one claim. Verified identity was another. Status-code success was another. Content evidence had to be checked separately.</p><p>The content-oriented pass is where the crawler stops pretending status success is enough. <code>--contents</code> writes body-only files. <code>--require</code> and <code>--require-regex</code> keep bodies containing required evidence. <code>--reject</code> and <code>--reject-regex</code> remove bodies containing absence, shell, or other non-record evidence.</p><p>Those strings are not universal predicates. They have to come from authorized knowledge of the application being tested. That is also the use boundary: authorized resource discovery, migration checks, and repeatable diagnostics against systems you own or are allowed to test.</p><p>Read the full essay on lospino.so:<br><a href="https://lospino.so/blog/abrade-after-the-happy-path/?utm_source=substack&amp;utm_medium=email&amp;utm_campaign=20260709_abrade-after-the-happy-path&amp;utm_content=dispatch">Abrade After the Happy Path</a></p><p><em>Original essay published on lospino.so on 2026-07-09. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Calls Are Now a Security Surface]]></title><description><![CDATA[The old call model was small enough to fit in two instructions:]]></description><link>https://newsletter.lospino.so/p/calls-are-now-a-security-surface</link><guid isPermaLink="false">https://newsletter.lospino.so/p/calls-are-now-a-security-surface</guid><dc:creator><![CDATA[Josh Lospinoso]]></dc:creator><pubDate>Fri, 26 Jun 2026 22:43:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!n6dY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n6dY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n6dY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 424w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 848w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 1272w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n6dY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7850,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/svg+xml&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.lospino.so/i/203751965?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n6dY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 424w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 848w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 1272w, https://substackcdn.com/image/fetch/$s_!n6dY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F812b490f-26e9-48a7-9122-39fb0f47222c_1500x1000.svg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The old call model was small enough to fit in two instructions:</p><pre><code><code>call target
ret</code></code></pre><p>A call transferred control. A return transferred it back. If the arguments, stack, and return address were plausible enough, execution continued.</p><p>That model is now incomplete.</p><p>The claim of the essay is that calls and returns are no longer just conventions. On hardened platforms, parts of the call protocol may be checked by hardware, the kernel, the loader, compiler instrumentation, or the runtime. The call boundary can carry security state as well as value state.</p><p>The concrete artifact is a shadow stack. In an Intel CET shadow-stack model, a CALL records the return address on both the normal stack and a protected shadow stack. On RET, the processor compares the two. A mismatch is not just a bad return. It is a control-protection failure.</p><p>That changes what it means to preserve call state. A hand-written stub or trampoline may satisfy the old visible rule - put a plausible return address on the normal stack - and still violate the hardened rule: the normal return address and the shadow-stack return address must agree.</p><p>Other mechanisms check different edges. Branch Target Identification can require indirect branch targets to land on approved landing instructions. Pointer authentication can make a code pointer or return address more than an integer-shaped address. Windows Control Flow Guard can turn indirect-call validity into runtime metadata and checks. These mechanisms are not interchangeable, but they all pressure the same old assumption: a control transfer is not just an address.</p><p>The boundary is important. This is not a bypass guide, and it is not a claim that every modern CPU enforces every call. Feature availability, operating-system support, binary opt-in, compiler settings, and platform ABI choices all matter. The safer claim is narrower: modern platforms increasingly enforce pieces of the call and return protocol.</p><p>That matters for JITs, hooks, plugins, instrumentation, trampolines, and hand-written assembly. The old checklist asked whether the code preserved arguments, nonvolatile registers, stack alignment, and return behavior. The newer checklist also asks whether unwinders can explain the frame and whether the security machinery accepts the transfer.</p><p>A call is still a call. It just has more witnesses.</p><p>Read the full essay on lospino.so: <a href="https://lospino.so/blog/abi-series/calls-are-now-a-security-surface/?utm_source=substack&amp;utm_medium=email&amp;utm_campaign=20260610_calls-are-now-a-security-surface&amp;utm_content=dispatch">Calls Are Now a Security Surface</a></p><div><hr></div><p>Original essay published on lospino.so on 2026-06-10.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.lospino.so/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>