<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: anderskaseorg</title><link>https://news.ycombinator.com/user?id=anderskaseorg</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 24 May 2026 23:35:01 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=anderskaseorg" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by anderskaseorg in "Show HN: A game where you build a GPU"]]></title><description><![CDATA[
<p>The “next level” button takes you to the next level even if you haven’t solved that level’s prerequisites.</p>
]]></description><pubDate>Sat, 04 Apr 2026 19:46:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47642622</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=47642622</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47642622</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Tell HN: Litellm 1.82.7 and 1.82.8 on PyPI are compromised"]]></title><description><![CDATA[
<p>Right, the public was able to spend manual effort hand-auditing one specific tarball after it had already been singled out as suspicious for other reasons. In order for verification to effectively increase supply chain security, it needs to become uniformly standardized, fully automated, and ubiquitous. That’s the ultimate goal of the provenance attestation mechanisms that would be defeated by indirection through private repositories.<p>If you want to require extra maintainer intervention for releases, there are better mechanisms available for that, such as workflow_dispatch.</p>
]]></description><pubDate>Tue, 31 Mar 2026 06:48:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47583633</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=47583633</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47583633</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Tell HN: Litellm 1.82.7 and 1.82.8 on PyPI are compromised"]]></title><description><![CDATA[
<p>The <i>maintainer</i> can verify the correspondence between source and release, but the <i>public</i> has been deprived of this verifiability.<p>This matters. Consider the XZ Utils compromise where a malicious maintainer hid the line that triggers compilation of the (otherwise dormant) backdoor payload in a generated file present only in the release tarball: <a href="https://www.openwall.com/lists/oss-security/2024/03/29/4" rel="nofollow">https://www.openwall.com/lists/oss-security/2024/03/29/4</a>. If the public had the ability to audit that the release tarball was correctly built from the version-controlled code, this would have been much more difficult to hide.</p>
]]></description><pubDate>Sun, 29 Mar 2026 19:48:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=47566552</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=47566552</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47566552</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Tell HN: Litellm 1.82.7 and 1.82.8 on PyPI are compromised"]]></title><description><![CDATA[
<p>The point of trusted publishing is supposed to be that the public can verifiably audit the exact source from which the published artifacts were generated.  Breaking that chain via a private repo is a step backwards.<p><a href="https://docs.npmjs.com/generating-provenance-statements" rel="nofollow">https://docs.npmjs.com/generating-provenance-statements</a><p><a href="https://packaging.python.org/en/latest/specifications/index-hosted-attestations/" rel="nofollow">https://packaging.python.org/en/latest/specifications/index-...</a></p>
]]></description><pubDate>Tue, 24 Mar 2026 17:12:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47505948</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=47505948</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47505948</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Subsecond: A runtime hotpatching engine for Rust hot-reloading"]]></title><description><![CDATA[
<p>There is a well-defined reload point—it’s the `subsecond::call` wrapper around `tick()`. But the hypothetical design that you seem to have in mind where this doesn’t exist would not have a well-defined reload point, so it would need to be able to preempt your program anywhere.<p>Layout changes are supported for structs that don’t persist across the well-defined reload point.</p>
]]></description><pubDate>Wed, 25 Jun 2025 02:48:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=44373237</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=44373237</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44373237</guid></item><item><title><![CDATA[New comment by anderskaseorg in "uv: An extremely fast Python package and project manager, written in Rust"]]></title><description><![CDATA[
<p>Yes, uv has a standard permissive open source license (Apache-2.0 OR MIT): <a href="https://github.com/astral-sh/uv/?tab=readme-ov-file#license">https://github.com/astral-sh/uv/?tab=readme-ov-file#license</a></p>
]]></description><pubDate>Mon, 23 Jun 2025 22:14:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=44360748</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=44360748</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44360748</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Rust's Sneaky Deadlock With `if let` Blocks"]]></title><description><![CDATA[
<p>Of course (but that’s not relevant to the original scenario, where the programmer is hypothetically not aware that the read lock is still being held, let alone that they could manually upgrade it after changing to a different lock library).</p>
]]></description><pubDate>Wed, 13 Nov 2024 02:20:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=42122273</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=42122273</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42122273</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Rust's Sneaky Deadlock With `if let` Blocks"]]></title><description><![CDATA[
<p>Yes, allowing this to execute would be very unsound:<p><pre><code>    let lock = RwLock::new(Box::new(111));
    let r: &i32 = &**lock.read().unwrap(); // points to 111
    *lock.write().unwrap() = Box::new(222); // allocates a new Box and deallocates 111
    println!("{}", *r); // use after free</code></pre></p>
]]></description><pubDate>Wed, 13 Nov 2024 01:38:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=42122034</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=42122034</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42122034</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Rust's Sneaky Deadlock With `if let` Blocks"]]></title><description><![CDATA[
<p>Clippy already has an error for this pattern with Mutex. It should be trivial to extend it to cover RwLock.<p><pre><code>    error: calling `Mutex::lock` inside the scope of another `Mutex::lock` causes a deadlock
      --> src/main.rs:5:5
       |
    5  |       if let Some(num) = *map.lock().unwrap() {
       |       ^                   --- this Mutex will remain locked for the entire `if let`-block...
       |  _____|
       | |
    6  | |         eprintln!("There's a number in there: {num}");
    7  | |     } else {
    8  | |         let mut lock2 = map.lock().unwrap();
       | |                         --- ... and is tried to lock again here, which will always deadlock.
    9  | |         *lock2 = Some(5);
    10 | |         eprintln!("There will now be a number {lock2:?}");
    11 | |     }
       | |_____^
       |
       = help: move the lock call outside of the `if let ...` expression
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_let_mutex
       = note: `#[deny(clippy::if_let_mutex)]` on by default</code></pre></p>
]]></description><pubDate>Wed, 13 Nov 2024 01:00:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=42121804</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=42121804</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42121804</guid></item><item><title><![CDATA[New comment by anderskaseorg in "An illustrated proof of the CAP theorem (2018)"]]></title><description><![CDATA[
<p>There are plenty of systems that sacrifice consistency even while the network is fully connected, in the name of performance—for example, DNS, or any system with a caching proxy server.</p>
]]></description><pubDate>Tue, 08 Oct 2024 02:11:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=41773186</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41773186</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41773186</guid></item><item><title><![CDATA[New comment by anderskaseorg in "An illustrated proof of the CAP theorem (2018)"]]></title><description><![CDATA[
<p>You’re certainly allowed to make the client a more active participant in your consensus protocol, but then it needs to play by the same rules if you want the system to have guarantees. For example, you need to handle network partitions between clients and some servers, and you need to be able to reconcile multiple reads from servers that might have seen different sets of writes. The CAP theorem still applies to the system as a whole.</p>
]]></description><pubDate>Tue, 08 Oct 2024 02:04:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=41773143</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41773143</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41773143</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Rewrite cname uncloaking code to account for new ipaddress= option"]]></title><description><![CDATA[
<p>They’re doing a slow phase-out over a long time to try to avert a wave of bad publicity that threatens their browser monopoly, but that timeline has already started as of June.<p><a href="https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline#june_3_2024_the_manifest_v2_phase-out_begins" rel="nofollow">https://developer.chrome.com/docs/extensions/develop/migrate...</a><p><a href="https://www.bleepingcomputer.com/news/google/google-chrome-warns-ublock-origin-may-soon-be-disabled/" rel="nofollow">https://www.bleepingcomputer.com/news/google/google-chrome-w...</a></p>
]]></description><pubDate>Mon, 07 Oct 2024 22:27:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=41771764</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41771764</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41771764</guid></item><item><title><![CDATA[New comment by anderskaseorg in "Bootstrappable Builds"]]></title><description><![CDATA[
<p>The mechanism is a clever application of quines (self-reproducing programs), first explained in the classic lecture “Reflections on Trusting Trust” by Ken Thompson:<p><a href="https://dl.acm.org/doi/pdf/10.1145/358198.358210" rel="nofollow">https://dl.acm.org/doi/pdf/10.1145/358198.358210</a><p>Russ Cox obtained the actual code for Thompson’s compiler backdoor and presented it here:<p><a href="https://research.swtch.com/nih" rel="nofollow">https://research.swtch.com/nih</a></p>
]]></description><pubDate>Tue, 27 Aug 2024 16:46:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=41369655</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41369655</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41369655</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>When the term “undefined behavior” appears within the C standard, yes, that’s what it means. There is no way for another document to alter the meaning of “undefined behavior” as it appears within the C standard.<p>When the term “undefined behavior” appears in different context, we use our writing and reading comprehension skills to agree on what it means. If we’re programming in standard C, it refers to one class of behavior. If we’re programming in POSIX C, it refers to a smaller class of behavior (even according to the C standards committee: see the usage of “otherwise undefined behavior” in N2464). If we’re programming in Rust, it refers to a completely different class of behavior.<p>From my very first message, I did my part by providing the context explicitly: “undefined behavior in the Rust and LLVM memory model”. You complained that it’s nonsense to talk about “undefined behavior” in any context other than the C standard, but I provided references showing that it’s not. Yet you persist in intentionally misinterpreting what I wrote in order to accuse me of gaslighting. Does that make you feel superior?</p>
]]></description><pubDate>Wed, 14 Aug 2024 00:46:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=41241445</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41241445</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41241445</guid></item><item><title><![CDATA[New comment by anderskaseorg in ".INTERNAL is now reserved for private-use applications"]]></title><description><![CDATA[
<p>The jurisdictional status of .local and other standards-reserved special use domains is explained by RFC 6761 section 3:<p><a href="https://datatracker.ietf.org/doc/html/rfc6761#section-3" rel="nofollow">https://datatracker.ietf.org/doc/html/rfc6761#section-3</a><p>And ICANN is bound by the IETF/ICANN Memorandum of Understanding Concerning the Technical Work of the IANA, which prevents it from usurping that jurisdiction:<p><a href="https://www.icann.org/resources/pages/agreements-en" rel="nofollow">https://www.icann.org/resources/pages/agreements-en</a></p>
]]></description><pubDate>Sat, 10 Aug 2024 00:40:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=41206537</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41206537</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41206537</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>If a program’s behavior is undefined in one specification and defined in a second, then insofar as both specifications apply to it, that is defined behavior, not undefined behavior. That’s not an obscure property of terms of art and specific formal definitions about which I need to be educated, it’s just basic logic about which we obviously agree. The conclusion would be the same if one specification explicitly said “this may return an empty allocation or NULL or format your hard drive” and a second specification said “this will return an empty allocation or NULL”; the conjunction of those two specifications entails that it will not format your hard drive.<p>There’s nothing wrong or misleading in what I wrote. If, hypothetically, there were a second specification that constrained the Rust compiler’s translation of programs that over-read memory, then it would have been wrong to write that over-reading memory in Rust is undefined behavior, and misleading to suggest that a statement about “any undefined behavior” is applicable to it. But there is no such second specification (as confirmed by comments on the issue I linked from RalfJung, whose formal specification hat is much pointier than either of ours), and you aren’t even disputing that. Instead, you have deliberately misapplied a statement about “any undefined behavior” to other unrelated behavior that is in fact defined, in order to construct a pretense for calling someone else dishonest. Find better hobbies.</p>
]]></description><pubDate>Tue, 06 Aug 2024 00:12:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=41166766</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41166766</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41166766</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>It seems like you think I’m saying that all compilers are required to recognize all forms of UB and format your hard drive. Of course not; some UB in one specification may be defined in another more restrictive spec, some UB may be defined by compiler flags like -fwrapv, some UB might be detected and converted to a compile-time or runtime error, and some UB might happen to behave like you expect because your compiler didn’t implement certain optimizations yet or you just got lucky.<p>It sounds like you agree that programmers should avoid relying on luck for UB safety. If you have a way to prove that <i>this</i> UB is actually safe and not just lucky, feel free to present it. Until then, I stand by everything I’ve said.</p>
]]></description><pubDate>Tue, 30 Jul 2024 01:03:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=41105186</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41105186</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41105186</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>You may not <i>like</i> it, and it’s within your rights not to like it, but the reality is that <i>compilers do treat UB this way</i>, and it’s not “grossly dishonest FUD” to point out that this is the reality. Here’s a test case demonstrating that UB can actually format your hard drive: <a href="https://bugs.llvm.org/show_bug.cgi?id=49599" rel="nofollow">https://bugs.llvm.org/show_bug.cgi?id=49599</a>.<p>Note that one of the differences between C and Rust is that integer overflow is not UB in Rust (it panics in debug mode and wraps in release mode: <a href="https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow" rel="nofollow">https://doc.rust-lang.org/book/ch03-02-data-types.html#integ...</a>). But there are other sources of UB in unsafe Rust, such reads through a pointer not allowed by the memory model.</p>
]]></description><pubDate>Mon, 29 Jul 2024 23:41:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=41104752</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41104752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41104752</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>Both (unsafe) Rust and LLVM have their own concepts of undefined behavior (<a href="https://doc.rust-lang.org/reference/behavior-considered-undefined.html" rel="nofollow">https://doc.rust-lang.org/reference/behavior-considered-unde...</a>, <a href="https://llvm.org/docs/LangRef.html#undefined-values" rel="nofollow">https://llvm.org/docs/LangRef.html#undefined-values</a>), and while some of the details vary by language, compilers for all of these languages do in fact optimize based on the assumption that undefined behavior is not invoked in the abstract execution model. This is a real thing (<a href="https://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html" rel="nofollow">https://blog.llvm.org/2011/05/what-every-c-programmer-should...</a>, <a href="https://highassurance.rs/chp3/undef.html" rel="nofollow">https://highassurance.rs/chp3/undef.html</a>), and any debate about whether it’s “justified” is many decades late and entirely academic (but we don’t have any other methodology for building optimizers of the quality that programmers expect from compiled languages).</p>
]]></description><pubDate>Mon, 29 Jul 2024 16:55:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=41101833</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41101833</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41101833</guid></item><item><title><![CDATA[New comment by anderskaseorg in "tolower() with AVX-512"]]></title><description><![CDATA[
<p>Note that the “unsafe read beyond of death” trick is considered undefined behavior in the Rust and LLVM memory model, even if it’s allowed by the underlying hardware. Like any undefined behavior, compilers are allowed to assume it doesn’t happen for the purpose of optimization, leading to results you don’t expect. The only way around this is to use inline assembly.<p><a href="https://github.com/ogxd/gxhash/issues/82">https://github.com/ogxd/gxhash/issues/82</a></p>
]]></description><pubDate>Mon, 29 Jul 2024 04:15:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=41097850</link><dc:creator>anderskaseorg</dc:creator><comments>https://news.ycombinator.com/item?id=41097850</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41097850</guid></item></channel></rss>