frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Mistral AI raises 1.7B€, enters strategic partnership with ASML

https://mistral.ai/news/mistral-ai-raises-1-7-b-to-accelerate-technological-progress-with-ai
445•TechTechTech•7h ago•264 comments

A clickable visual guide to the Rust type system

https://rustcurious.com/elements/
109•stmw•3d ago•10 comments

You too can run malware from NPM (I mean without consequences)

https://github.com/naugtur/running-qix-malware
65•naugtur•3h ago•46 comments

DuckDB NPM packages 1.3.3 and 1.29.2 compromised with malware

https://github.com/duckdb/duckdb-node/security/advisories/GHSA-w62p-hx95-gf2c
134•tosh•3h ago•81 comments

Hallucination Risk Calculator

https://github.com/leochlon/hallbayes
29•jadelcastillo•2h ago•8 comments

How can England possibly be running out of water?

https://www.theguardian.com/news/ng-interactive/2025/aug/17/how-can-england-possibly-be-running-o...
184•xrayarx•2d ago•278 comments

Signal Secure Backups

https://signal.org/blog/introducing-secure-backups/
890•keyboardJones•20h ago•394 comments

Weaponizing Ads: How Google and Facebook Ads Are Used to Wage Propaganda Wars

https://medium.com/@eslam.elsewedy/weaponizing-ads-how-governments-use-google-ads-and-facebook-ad...
35•bhouston•52m ago•14 comments

Nango (YC W23) Is Hiring a Staff Back End Engineer (Remote)

https://jobs.ashbyhq.com/Nango/3467f495-c833-4dcc-b119-cf43b7b93f84
1•bastienbeurier•1h ago

Liquid Glass in the Browser: Refraction with CSS and SVG

https://kube.io/blog/liquid-glass-css-svg/
373•Sateeshm•15h ago•96 comments

iPhone dumbphone

https://stopa.io/post/297
535•joshmanders•19h ago•315 comments

Anscombe's Quartet

https://en.wikipedia.org/wiki/Anscombe%27s_quartet
20•gidellav•1d ago•8 comments

Strong Eventual Consistency – The Big Idea Behind CRDTs

https://lewiscampbell.tech/blog/250908.html
85•tempodox•8h ago•35 comments

NPM debug and chalk packages compromised

https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
1233•universesquid•21h ago•662 comments

Experimenting with Local LLMs on macOS

https://blog.6nok.org/experimenting-with-local-llms-on-macos/
342•frontsideair•22h ago•225 comments

Deluxe Paint on the Commodore Amiga

https://stonetools.ghost.io/deluxepaint-amiga/
52•doener•3d ago•13 comments

Microsoft doubles down on small modular reactors and fusion energy

https://www.techradar.com/pro/microsoft-joins-world-nuclear-association-as-it-doubles-down-on-sma...
147•mikece•18h ago•260 comments

The elegance of movement in Silksong

https://theahura.substack.com/p/the-elegance-of-movement-in-silksong
137•theahura•16h ago•207 comments

Alterego: Thought to Text

https://www.alterego.io/
158•oldfuture•16h ago•104 comments

Contracts for C

https://gustedt.wordpress.com/2025/03/10/contracts-for-c/
89•joexbayer•4d ago•69 comments

X Design Notes: Unifying OCaml Modules and Values

https://blog.polybdenum.com/2025/08/19/x-design-notes-unifying-ocaml-modules-and-values.html
12•todsacerdoti•3d ago•0 comments

Is OOXML Artifically Complex?

https://hsu.cy/2025/09/is-ooxml-artificially-complex/
117•firexcy•3d ago•112 comments

No adblocker detected

https://maurycyz.com/misc/ads/
507•LorenDB•12h ago•261 comments

Clankers Die on Christmas

https://remyhax.xyz/posts/clankers-die-on-christmas/
240•jerrythegerbil•22h ago•195 comments

Will Amazon S3 Vectors kill vector databases or save them?

https://zilliz.com/blog/will-amazon-s3-vectors-kill-vector-databases-or-save-them
246•Fendy•21h ago•111 comments

Majority in EU's biggest states believes bloc 'sold out' in US tariff deal

https://www.theguardian.com/world/2025/sep/09/majority-in-eu-biggest-states-believes-bloc-sold-ou...
11•belter•1h ago•1 comments

Seedship – Text-Based Game

https://philome.la/johnayliff/seedship/play/index.html
107•ntnbr•3d ago•41 comments

Show HN: Attempt – A CLI for retrying fallible commands

https://github.com/MaxBondABE/attempt
57•maxbond•11h ago•15 comments

The key points of "Working Effectively with Legacy Code"

https://understandlegacycode.com/blog/key-points-of-working-effectively-with-legacy-code/
156•lordleft•3d ago•61 comments

AMD claims Arm ISA doesn't offer efficiency advantage over x86

https://www.techpowerup.com/340779/amd-claims-arm-isa-doesnt-offer-efficiency-advantage-over-x86
196•ksec•22h ago•365 comments
Open in hackernews

Contracts for C

https://gustedt.wordpress.com/2025/03/10/contracts-for-c/
89•joexbayer•4d ago

Comments

__d•11h ago
I like Eiffel.

But if I want to use Eiffel, I’ll use Eiffel (or Sather).

I’d rather C remained C.

Maybe that’s just me?

jimbob45•9h ago
Java 24 and C# 9 resemble little of their first versions. C++ might as well not even be the same language at this point. Why are we so conservative with C but then so happily liberal with every other language?
dmitrygr•8h ago
Because there must be at least one refuge for the sane
HexDecOctBin•8h ago
People chose C because they liked C. Of course they don't want C to change. The only thing the ISO committee should be adding is stuff for filling in the holes in language (C23's Improved Tag Compatibility and __VA_OPT__ are good examples), not add features that were never part of C and were never supposed to be there.

Your question can be reflected back to you: if you want an ever changing languages, go to Java, C# or C++, why mess with C?

xboxnolifes•7h ago
> People chose C because they liked C. Of course they don't want C to change.

The same thing can be said for every other language, yet they change.

oguz-ismail•6h ago
Well they shouldn't have. It was much more fun to program in Python 2.7 and Java 7, I wouldn't touch those languages with a five feet pole these days
lifthrasiir•6h ago
Why specifically Python 2.7 and not, like, 1.5? Python 1 and 2 are as different as 2 and 3 (that is, surprisingly not much).
brabel•7h ago
This is funny because Java people say the same about Kotlin and Scala.
pjmlp•5h ago
No, many people chose C, because they had to.
sarchertech•2h ago
Yeah but those people are running it on some platform where it’s the only choice. And they are probably running a subset of C99. The likelihood of new features ever making it to those platforms is close to zero.
nananana9•8h ago
The complexity of C# and C++ should be a warning, not something to strive towards. C++ has 3 reasonable implementations, C has hundreds, for all sorts of platforms, where you don't get anything else.

Most C developers don't want a modern C, they want a reliable C. WG14 should be pushing for clarifications on UB, the memory and threading model, documenting where implementations differ, and what parts of the language can be relied and what not.

Nobody really needs a new way to do asserts, case ranges, or a new way to write the word "NULL".

lifthrasiir•6h ago
C++ historically had much more implementations. It is probably more about the availability of quality compilers that are free to use and adapt, because even in C most new compilers for niche platforms are now based on GCC or clang for the practical reason.
pjmlp•5h ago
Both implementated in C++.

As someone that remembers the t-shirts with "my compiler compiles yours" that some C folks used to wear, it is kind of ironic having that turned around on them.

motorest•6h ago
> The complexity of C# and C++ should be a warning, not something to strive towards.

I think this talk about "complexity" is a red herring. C++ remains one of the most popular languages ever designed, and one of the key reasons is that since C++11 the standardization effort picked up steam and started including features that the developer community wanted and was eager to get.

I still recall the time that randos criticized C++ for being a dead language and being too minimalistic and spartan.

> C++ has 3 reasonable implementations, C has hundreds, for all sorts of platforms, where you don't get anything else.

I don't understand what point you are trying to make. Go through the list of the most popular programming languages, and perhaps half of them are languages which only have a single implementation. What compelled you to criticize C++ for having at least 3 production-quality implementations?

> Most C developers don't want a modern C, they want a reliable C.

You speak only for yourself. Your personal opinion is based on survivorship bias.

I can tel you that as a matter of fact a key reason why the likes of Rust took off was that people working with low-level systems programming were desperate for a C with better developer experience and sane and usable standard library.

> Nobody really needs a new way to do asserts, case ranges, or a new way to write the word "NULL".

Again, you speak for yourself, and yourself alone. You believe you don't need new features. That's fine. But you speak for yourself.

npoc•6h ago
I agree. A lot of new additions to C++ make coding with it simpler, not more complex. However it does mean there's more to learn, because the old style of the language still exists and is still accepted by the modern compilers as opposed to say, Rust which removes replaced language features when it releases a new edition.
pjmlp•5h ago
Language, not libraries.

Editions are rather limited in what they support.

Try to design a crate that stays compatible across editions, while using libraries that have changed signatures across editions.

The crate itself keeps its own edition fixed.

babaceca•5h ago
The vast majority of C programmers will agree that they don't care for any of the new features, as is clearly evident by the fact that almost nobody elects to use the latest standards.

The "most popular programming languages" are irrelevant here.

C and C++ are standardized languages, and also the tools we use for code that actually matters. A standard that can't be implemented is worthless, and even the "3 high quality" implementations of C/C++ haven't fully implemented the latest 2 editions of either language.

There's a lot more riding on these two languages than you give credit for, and they should be held to a higher standard. C is not the language to experiment with shiny new features, it's the language that works.

> I can tel you that as a matter of fact a key reason why the likes of Rust took off

So what's the problem? If Rust is gaining traction on C/C++, and people are excited about what it brings to the table, use it. We'll both do our thing, let it play out - we'll see which approach yields better software in 10 years.

motorest•2h ago
> The vast majority of C programmers will agree that they don't care for any of the new features,(...)

I think this belief is based on faulty assumptions, such as survivorship bias.

C++ became popular largely because it started off by extending C with the introduction of important features that the developer community wanted to use. The popularity of C++ over C attests how much developers wanted to add features to C.

C++ also started being used over C in domains where it was not an excellent fit, such as embedded programming, because the C community prefered to deal with C++'s higher cognitive load as an acceptable tradeoff to leverage important features missing from C.

The success of projects such as Rust and even Zig, Nim also comes at the expense of C's inability to improve the developer experience.

Not to mention the fact that some projects are still developed in C because of a mix of inertia and lack of framework support.

So to claim that the C programmers do not want change, first you need to ignore the vast majority that do want but already dropped C in favor of languages that weren't frozen in time.

It's also unbelievable to claim that a language that precedes the concept of developer experience represents the apex of language design. This belief lands somewhere between Stockholm syndrome and being mentally constrained to not look beyond a tool.

babaceca•2h ago
> So to claim that the C programmers do not want change, first you need to ignore the vast majority that do want but already dropped C...

Good, we can ignore them. It's not a language for everybody, and if you're happily using C++, or Zig, or Nim, keep doing that.

Developer experience is a weigted sum of many variables. For you cool syntax features may play a huge role of that, for most C programmers a simple language with clear and understandable semantics is much more important.

There are many languages with cool syntax and shiny features, and very few of the latter kind. C belongs to the latter, and it also happens to be running a vast majority of the world's most important software.

You keep bringing up Rust as an example. It's probably the most famous of the new-age systems languages. If it's such a great language, when will we see a useful program written in it?

pjmlp•5h ago
Most single C implementations have died out.

There is hardly any C compiler worth using that isn't equally a C++ compiler .

In fact, there is any C compiler left worth using that hasn't been rewriten into C++.

gustedt•1h ago
That may be true in your bubble, but I don't think this is true in general. There are still a lot C compilers out there, compared to 3 or 4 that do C++.
aninteger•33m ago
There seems to be at least 2 lcc forks (lcc-win32/win64, and pelles-c) that have their own small communities. Although maybe they are dead.
OCTAGRAM•7h ago
Eiffel has unsolicited tracing garbage collection. For TGC-free programming there is Ada
veltas•6h ago
Truly I agree, but if we can add features to improve C codebases without rewriting them then that's a win, and you can just ignore them if you don't like them (as I will), but to the people where this has benefit they can be used.
pjmlp•5h ago
Languages are software products like everything else in computing, either they evolve or they whither and die.

C especially was designed with lots of security defects, and had it not been for UNIX being available for free, it would probably never taken off.

HexDecOctBin•2h ago
More likely they evolve AND they whither and die. The number of software I have stopped using due to bad updates is much higher than those with not enough updates.
johnisgood•5h ago
Ada / SPARK has contracts, too, that can be proven at compile-time. In fact, Ada alone suffices, it has pre- and post-conditions. I think Ada has more libraries than Eiffel does. Does anyone even write Eiffel? I am really curious if it is still alive anywhere, in some form.
flykespice•7m ago
Are you being really honest with yourself that you would renounce c90, c99 additions to stay with the original language as it was introduced in K&R C book?
WalterBright•10h ago
Digital Mars C++ has had contracts since, oh, the early 1990s?

https://www.digitalmars.com/ctg/contract.html

motorest•6h ago
> Digital Mars C++ has had contracts since, oh, the early 1990s?

I think that implementations trying out their own experimental features is normal and expected. Ideally, standards would be pull-based instead of push-based.

The real question is what prevented this feature from being proposed to the standardization committee.

arunc•6h ago
It was proposed by Walter and denied by Stroustroup, probably to save C++. Karma hits back and he is trying to save C++ from Rust.
pjmlp•5h ago
People keep forgetting C++ design is driven by 300+ people, and the features that get into the language go to elections, that they have to win.

Stroustoup has one vote, not everything he advocates for wins votes, including having a saner C++ (Remember the Vasa paper).

motorest•5h ago
> It was proposed by Walter and denied by Stroustroup, probably to save C++.

Citation needed.

For starters, where is the paper?

shakna•5h ago
Well, there's this list Stroustrup offers, of systems in C++ that he would reject: [0]

[0] https://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0977r0...

pjmlp•2h ago
One vote, C++ isn't a BDFL driven language.

Also WG14 famously killed Dennis Ritchie proposal to add fat pointers to C.

Language authors only have symbolic value once they relish control to a standards body.

taminka•9h ago
do i understand correctly that there's nothing preventing someone from adding a postcondition check X and then just not implementing it inside the function? wouldn't this just mean that now the ub is triggered by the post()'s `unceachable()` instead of whatever ub would happen w/, say, dereferencing a null pointer, as a consequence of not actually implementing post check X? so it's just for speed optimisations then?

from reading about contracts for C before i assumed it would be like what cake[1] does, which actually compile time enforces pointer (non)nullability, as well as resource ownership and a bunch of other stuff, very cool project, check it out if you haven't seen it yet :)

[1]https://github.com/thradams/cake

AlotOfReading•8h ago
There's a bit of an impedence mismatch with Contracts in C because C++ contracts exist partially to rectify the fact that <cassert> is broken in C++.

Let's say you have a header lib.h:

    inline int foo(int i) {
        assert(i > 0);
        //...
    }
In C, this function is unspecified behavior that will probably work if the compiler is remotely sane.

In C++, including this in two C++ translation units that set the NDEBUG flag differently creates an ODR violation. The C++ solution to this problem was a system where each translation unit enforces its own pre- and post- conditions (potentially 4x evaluations), and contracts act as carefully crafted exceptions to the vast number of complicated rules added on top. An example is how observable behavior is a workaround for C++ refusing to adopt C's fix for time-traveling UB. Lisa Lippincott did a great talk on this last year: https://youtu.be/yhhSW-FSWkE

There's not much left of Contracts once you strip away the stuff that doesn't make sense in C. I don't think you'd miss anything by simply adding hygenic macros to assert.h as the author here does, except for the 4x caller/callee verification overhead that they enforce manually. I don't think that should be enforced in the standard though. I find hidden, multiple evaluation wildly unintuitive, especially if some silly programmer accidentally writes an effectful condition.

1718627440•5h ago
I think the main point of pre- and post-conditions is, that the compiler can see them and prove that they match and will never be triggered. There probably will be a compiler flag for outputting all non-proved pre/postconditions, there is already -fanalyzer.

I think these conditions should be part of the type signature, different to what was suggested in the otherwise good talk you cited.

zozbot234•2h ago
> the compiler can see them and prove that they match and will never be triggered

This is a huge challenge for a C-like language with pervasive global state. Might be more feasible for something like Rust, but still very difficult.

1718627440•1h ago
You only need to check between caller and callee. If their constraints always match, it can't be triggered, if they contradict always, it will be triggered, else it can't be decided and the programmer can add annotations if he cares about, or the compiler can check what it would be like if the caller is inlined into his calling functions if that is trivial enough.
kstenerud•7h ago
I'm not sure I'm understanding this correctly...

Given the examples, the author wants to ensure that 0 is not a possible input value, and NULL is not a possible output value.

This could be achieved with a simple inline wrapper function that checks pre and post conditions and does abort() accordingly, without all of this extra ceremony

But regardless of the mechansim you're left with another far more serious problem: You've now introduced `panic` to C.

And panics are bad. Panics are landmines just waiting for some unfortunate circumstance to crash your app unexpectedly, which you can't control because control over error handling has now been wrested from you.

It's why unwrap() in Rust is a terrible idea.

It's why golang's bifurcated error mechanisms are a mess (and why, surprise surprise, the recommendation is to never use panic).

integricho•7h ago
Though is there a significant difference in which is more bad between running into undefined behavior and panic?
ost-ing•7h ago
Exactly, panicking is a safer way to handle the situation rather than memory access violations
AlotOfReading•6h ago
Safer in what sense? We have no idea whether this hypothetical code is in a userspace application that can exit safely at any time or a hard real time system where panicking could destroy hardware.

A lot of important programs (like the Linux kernel) don't operate strictly on the exact letter of the standard's UB semantics. They do things like add compiler flags to specify certain behaviors, or assume implementation details.

imtringued•14m ago
I will never understand how C developers can catastrophize over Rust panics, a language that has a panicless "_try" version of every panic causing function that returns a Result instead, while simultaneously accepting the infinite growth of ever harder to avoid UB in C/C++ and telling people to never have undefined behavior in their code.

If you think dealing with undefined behavior is easy and you assume that people have verified that their software triggers no undefined behavior at runtime is fair game, then you should grant that assumption in favor of Rust developers having done the same with their panics, because avoiding panics is child's play in comparison to avoiding UB.

I don't know what it is about panics that triggers some mania in people. UB does not interrupt the program and therefore allows memory corrupt and complete takeover of a program and the entire system as a consequence. C developers are like "this is fine", while sitting in a house that is burning down.

There used to be a pretty blatant hibernation bug with AMD GPUs on Linux that essentially crashes your desktop session upon turning your computer on from hibernation. I've also had a wifi driver segfault on login that forcibly logged you out so you couldn't login like 9 years ago. C doesn't magically fix these problems by not having an explicit concept of panics. You still need to write software that is correct and doesn't crash before you push an update.

There is no meaningful difference between a correctness bug and a panic triggering condition with the exception that the panic forces you to acknowledge the error during development, meaning it is more likely that the correctness bug gets caught in the first place.

kstenerud•7h ago
In C, sure. C is a dangerous language of its time.

But these contracts don't make things better.

Now you're removing control from the user. So now if an allocation fails, you crash. No way to recover from it. No getting an error signal back (NULL) so that you can say "OK, I need to clear up some memory and then try again". (Note that I'm not saying that inline error signaling such as NULL is good design - it's not).

Nope. No error handling. No recovery. You crash. And ain't nothing you can do about it.

That's just bad design on top of the existing bad design. Things that crash your app are bad. No need to add even more.

hdjrudni•6h ago
I'm not convinced. If something is going to cause a crash, like a nullptr, I'd rather crash near where the error happened with a nice error message, than hitting some UB crash god knows where.

Do I want my app to crash at all? No, of course not. If it's crashing, there's a serious bug. At least now I know where to look for it.

Should we pass back up an error signal instead of crashing? Yes, if it all possible, do that instead. Sometimes it's not possible or not worth the hassle for something you're 99.99999% sure can't/won't happen. Or literally can't currently happen, but you're afraid someone on the project might do a bad refactor at some point 5 years down the road and you want to guard against some weird invariant.

1718627440•5h ago
I think the point is about e.g. malloc as shown in the blog post. The stdlib function already have return values to indicate invalid arguments from the caller. These exist to allow the caller to decide what to do in this case. Replacing them by invoking UB or panicing, means the user looses control.

Having the stdlib expose both ways, means either having two stdlibs (like on MS Windows), or dynamic checks in the stdlib. I don't think either way is a good idea. Thus, these contracts can't be used by libc.

bluGill•1h ago
The other hope for contracts is static whole program analysis can prove your program - at least in part. If you can prove some contract false that tells you where a bug is long before anyone triggers it.
sirwhinesalot•6h ago
Contracts getting proposed but still no slice/span type or even standardization of that new clang feature that makes

f(int n, int a[n])

Actually do what it looks like it does. Sigh

veltas•6h ago
You can do f(int n, int (*a)[n]) and it does what it looks like, since C99.

https://godbolt.org/z/8dfKMrGqv

sirwhinesalot•5h ago
That's an entirely different thing (VLAs)
veltas•5h ago
There's no VLA in my example.
sirwhinesalot•5h ago
Your example doesn't do any bounds checks, it just lets you get the sizeof. And the reason the sizeof works is the VLA infrastructure (which is not supported by MSVC so it won't compile the code).

What I want is -fbounds-safety from clang.

miropalmu•6h ago
What do you mean no slice/span type?

https://en.cppreference.com/w/cpp/container/span.html

Or if you want multidimensional span:

https://en.cppreference.com/w/cpp/container/mdspan.html

sirwhinesalot•5h ago
C, not C++. Also span had no bounds checking until the introduction of .at() in C++26, which was a very silly thing to do so late in an age where the white house was asking people to use memory safe languages.
miropalmu•5h ago
Oh. Makes sense. My bad.
TuxSH•2h ago
> Also span had no bounds checking

While there was no reason not to have .at(), lack of bound checks by default isn't a bad thing, as inlined bound checks have the potential to highly pessimize code (esp. in loops); also standard library hardening is a thing.

IMO there's much more value to be had in migrating C code (and pre-C++11 code, too) to C++ (or Rust, depending on one's tastes); RAII - that is to say, the ability to automatically run destructors on scope exit - and in particular shared_ptr/unique_ptr/bespoke intrustive pointers drastically reduce the risks of use-after-free

sirwhinesalot•56m ago
I like how it's handled in Herb's cpp2/cppfront. If the type implements certain methods (like size()), and you turn on bounds checking, then the indexing operations (which are unsafe) are wrapped in i < c.size() ? c[i] : <throw or abort>.

This way the indexing operation itself doesn't need to have bounds checks and it's easier for the compiler to optimize out the checks or for an "unchecked" section to be requested by the programmer.

pjmlp•5h ago
Strange are the ways of security in WG14.
1718627440•5h ago
The author writes that contract_assume invokes undefined behaviour when the assertion fails:

    #define contract_assume(COND, ...) do { if (!(COND)) unreachable(); } while (false)
But this means that the compiler is allowed to e.g. reorder the condition check and never output the message. (Or invoke nasal demons, of course).

This doesn't make much sense. I get that you want the compiler to maybe do nothing different or panic after the assertion failed, but only really after triggering the assertion and the notion of after doesn't really exist with undefined behaviour. The whole program is simply invalid.

babaceca•4h ago
There's no assertion required by spec.

To the brain of a compiler writer UB means "the standard doesn't specify what should happen, therefore I can optimize with the assumption UB never happen." I disagree that this is how UB should be interpreted, but this fight is long lost.

With that interpretation of UB, all `unreachable()` means is that the compiler is allowed to optimize as if this point in the code will never be reached. The unreachable macro is standard in C23 but all major compilers provide a way to do it, for all versions of the language.

So if you have a statement like `if (x > 3) unreachable()` that serves as both documentation of the accepted values, as a constraint that the optimizer can understand - if x is an unsigned int, it will optimize with the assumption that the only possible values are 0,1,2.

Of course in a debug build a sane compiler would have `unreachable()` trigger an assert fail, but they're not required to, and in release they most definitely won't do so, so you can't rely on it as a runtime check.

1718627440•4h ago
> so you can't rely on it as a runtime check.

Exactly. But we already have unreachable and assert. The whole point of contracts is, that they are checked by the compiler (when the compiler invoker asks for it).

Having the contract invoke UB in the fail case means that instead of replacing the error return with a diagnostic provable by the compiler, you replace the error return with potential corruption. In which case is that ever the right choice?

tempodox•3h ago
> Here unreacheable() is the new macro from C23 (and C++23) that makes the behaviour undefined whenever the branch of the invocation is reached.

I cannot, in good conscience, use a technology that adds even more undefined behavior. Instead it reinforces my drive to avoid C whenever I can and use OCaml or Rust instead.

1718627440•2h ago
I think it is good to explicitly invoke UB. It makes it much more obvious in the code, where it is intended and where not. It's a way to specify that this point in code is never reached, the code can't deal with it and I don't even care what the compiler does in this case.

It's also a good thing to tell the compiler that the programmer intends that this case will never happen, so that the static analyzer can point out ways through the code, where it actually does.

tpoacher•2h ago
One of the biggest problems I find with contracts whenever contracts are mentioned is that nobody seems to have a really clear definition of what exactly a contract 'is' or 'should be' (with the exception of languages where contracts are a formal part of the language, that is).

I find the general concept incredibly useful, and apply it in the more general sense to my own code, but there's always a bit of "what do I actually want contracts to mean / do here" back-and-forth before they're useful.

PS: I do like how D does contracts; though I admit I haven't used D much yet, to my great regret, so I can't offer my experience of how well contracts actually work in D.

bmn__•2h ago
No wonder it looks less than awesome to you. A contract is just a hack. Ideally, it should not exist because the type system already covers the programmer's intent. Languages that have shitty types which cannot express very much must work around the problem with contracts.
1718627440•1h ago
Aren't contracts a feature of the type system? They encode a specific type that differs from the base type by a more complex predicate, like a constraint check in SQL.
tpoacher•1h ago
Partially agree, but only for a very narrow definition of what is a contract, which again is the problem stated above.

A good contract system may in fact rely on type-safety as part of its implementation, but types do not necessarily cover all aspects of contracts (unless you're referring to the full gamut of theoretical generalisations of things like dependent types, substructural types, constraint logic programming, etc), and are also not necessarily limited to things that only apply at compile-time.