Planet Me

July 01, 2026

ISO C++

Save the Date: Pure Virtual C++ 2026

Pure Virtual C++ is back! For the 7th year running, Microsoft is hosting a free, one-day virtual conference for the whole C++ community.

Save the Date: Pure Virtual C++ 2026

by Marian Luparu

from the article:

Mark your calendar: Tuesday, July 21, 2026, starting at 14:00 UTC (7:00 AM in Seattle/Los Angeles, 11:00 AM in Buenos Aires, 10:00 PM in Hong Kong).

 

 

by Marian Luparu at July 01, 2026 12:49 AM

June 30, 2026

ISO C++

CppCon 2025 Joy of C++26 Contracts - Myths, Misconceptions & Defensive Programming -- Herb Sutter

sutter-joy.pngRegistration is now open for CppCon 2026! The conference starts on September 12 and will be held in person in Aurora, CO. To whet your appetite for this year’s conference, we’re posting videos of some of the top-rated talks from last year's conference. Here’s another CppCon talk video we hope you will enjoy – and why not register today for CppCon 2026!

The Joy of C++26 Contracts - Myths, Misconceptions & Defensive Programming

by Herb Sutter

Summary of the talk:

This talk is all about the C++26 contracts feature. It covers the following topics:

  • Why defensive programming is a Good Thing (mainly for functional safety, but occasionally also for memory safety)
  • Brief overview of C++26 contracts, and why they’re way better than C assert (spoiler: writing them on declarations, being able to use them in release builds, and language support is just way better than macros)
  • The 3-page “Effective C++ Contracts book” — best practices you need to know to use them (spoiler: keep compound conditions together, don’t write side effects, understand the pros and cons of installing a throwing violation handler… that’s pretty much… it?)
  • Why they’re viable, because they address the key things we need in production (which we’ll list)
  • Why they’re minimal, because we actually need every part in C++26 to use them at scale (which we’ll do by systematically summarizing why each piece is necessary)
  • What the future evolution of contracts holds (spoiler: virtual functions! groups/labels!)
  • A review of Frequently Asked Questions

by Blog Staff at June 30, 2026 10:14 PM

Upcoming C++ User Group meetings in July 2026

The monthly listing of upcoming C++ User Group meetings by Meeting C++.

Upcoming C++ User Group Meetings in July 2026

by Jens Weller

From the article:

July hosts again quite a few C++ User Groups, next Thursday Meeting C++ is celebrating its 14th birthday with a talk on C++ User Groups: 14 Years of Meeting C++ - celebrating with C++ User Groups at Meeting C++.

In since mid June the next weekly meetings are also included into the Meeting C++ blogroll.

 

by Meeting C++ at June 30, 2026 01:26 PM

The Daily WTF

The Hot Fix

Everybody has a nemesis. A dark mirror of yourself, a challenge that is everything you hate. If you've ever worked tech-support, you know what that is: printer issues.
I'm Anonymous, and you last saw me in the case of The Ghost Cursor. This is my story.

As the days marched on, the chill in the air turned from bracing to painful. God had hoofed it down to Florida for the winter, and this year, he'd stolen Hope away with him. Between leaden skies and dirty slush, gale-force winds sent snow tearing down city streets to sandblast one and all into their constituent atoms.

In that timeless slog, one year ended and another began, barely noticed. The short days and bitter cold made my foot-and-bus commute almost unbearable. Only the promise of warmth and caffeine at the other end got me through. A cup of joe at my desk, then a glance at my caseload, something I approached with a weird mix of curiosity and dread.

That morning, a fresh ticket had just come my way: The new printer in HR keeps printing gibberish.

Another printer. Why was it always printers? I dialed up the source, a guy named Tony, and made my introductions. “What do you mean by 'gibberish?'”

“It'd be easier to show you in person,” Tony replied, his voice jittery. “Could you stop by my cube right away?”

“Sure thing.”

I hung up, tossed the last dregs of coffee down my throat, and stood from my chair. At the same moment, a slight silver-haired woman made tracks down the open passageway a few feet away from me. She clutched her laptop and a stack of folders to her chest, making a beeline toward who-knew-what.

My first pleasant surprise of the day. I couldn't help calling out to her. “Aggie! How's it goin'?”

When I'd first gotten my start in Tech Support, Agnes Shaw had been one of the department's top reps. She knew every system quirk, every trick to pull, every right thing to say to leave a smile on someone's face. I'd come up under her wing, sought her advice a million times.

And then they'd offered Aggie a promotion, with a fancy title and salary to boot. She'd taken it.

That was years ago, now. I wasn't her direct report, so I only caught glimpses of her now and then. It was a shame.

Aggie halted in her tracks, dazed and startled, before looking my way. A second later, she smiled. “Hello! Doing just fine, yourself?”

“Same as ever.” But my spirits had lifted. Knowing there was no time to waste, I darted over to conversational distance. “You're a hard one to get ahold of.”

She shrugged her shoulders with a wistful expression.

“Why don't we step out for a smoke?” It seemed like we both needed it. “When are you free?”

“Not today. Meetings all day.” Aggie glanced askance. “It's not appropriate for me to go out there, anyway. You need a place where you can vent freely.”

“Spoken like a true manager,” I scolded with a smirk. “Listen, we haven't caught up in ages. Could we step out for coffee sometime?”

A warm glow peeked through her distraction. “I'd like that! Find an open spot on my schedule and book it, OK? I gotta run!” With a look of apology, Aggie backed away and rushed down the passage flanked by cubicles and filing cabinets.

Aggie made these offers all the time. Then, just before the appointed hour, something always came up that required a rain check. Well, I didn't care. I darted back to my desk, woke up my sleeping machine, and pulled up the office calendar to request a meeting the next day, right when I usually needed a dose of caffeine to make it through an otherwise endless afternoon. It was on Aggie to confirm or reschedule.

Meanwhile, I had a date with HR.

Human Resources. Normally, those words gave me an instant case of the willies. Μost of the people there were the sort of drones who couldn't hack Accounting or Finance in business school. But Leila … Leila was different. I couldn't help thinking about her. Back when I'd fielded a support ticket up in C-Town, an issue caused by the very CEO who'd filed the ticket, Leila had helped me keep my head attached to my neck. It seemed like maybe, just maybe, she really did want to improve this sorry joint the way she claimed.

I entered the nearest stairwell and plodded down a couple flights of concrete steps. Within those narrow confines, I brought myself back to reality. Leila was one executive among dozens on the org-chart. She wouldn't have a blessed thing to do with a low-level case like this. I had to stay on my toes in HR, no matter what friends I thought I'd made.

I pushed open the stairwell door and entered a carpeted space lined with filing cabinets, supply closets, and office machines. Sharp florescent lighting revealed an older man in a tailored suit only a few feet away, frowning as he took a hair dryer to the insides of a large printer that'd seen better days and now begged for oblivion.

As the stairwell door swung shut behind me, I froze. No matter how many years you piled up in this joint, it never ran out of new things to throw at you. This had to be the printer I was there to fix—more like save from yet another abusive higher-up who'd require kid-glove handling.

First things first. I had no idea if I'd gotten there in time to save the printer, but damned if I wouldn't try. Like a lifeguard diving in after a drowning victim, I rushed over to the outlet where the hair dryer was plugged in. Adding to the insanity, it was the wrong sort of outlet for a hair dryer, which needed a GFCI to run safely. I ripped the plug from the outlet and threw it aside.

The roar of the dryer faded, leaving stunned silence in its wake.

Burning with righteous fire, I spun around to face the perp. The HR big-shot faced me, too, brandishing his hair dryer like a revolver. Wide-eyed passersby fringed the scene like extras in a B-Western.

Kicking anything or anyone when they were down was the sort of thing that stabbed through my armor of veteran cynicism, riling me up with righteous anger. But an outburst would only make things worse. For the good of all, I swallowed it, forcing a polite lie past gritted teeth. “Just wanted to make sure you could hear me, sir.”

Like hell.

“Tech Support,” I introduced myself. “This the printer that ain't working?”

Hothead's glaring frustration shifted away from his victim, toward me. “Yes, and I've had it! It must be moisture inside the machine.”

God, help me. Oh, right: Florida.

“Good thinking, sir,” I said. “But I'm less worried about moisture and more worried about melting sensitive electronics with all that heat.”

His eyes went wide, like the notion had never entered his brain.

Slowly, I knelt to pick up the hair dryer's plug. Unchallenged, I rose and started winding the power cord around my left hand, inching closer to him in the process. Once I was standing in front of him, I proffered the wire bundle.

“Hold onto that for me, sir, if you don't mind.” Phrasing things as favors made them go down smoother. Now to dig up a workaround that would get this guy out of everyone's hair. “Is there some other printer you can use for now?”

His open hand clamped over the wire as his expression soured. “Yes, but it's a pain to walk over there!”

“I understand, sir. It's something. Don't worry about this one. I'll take it from here.”

Hothead walked off without another word. The spell broke; the onlookers found places to be.

With relief and dread, I approached the printer, fearing I'd be performing last rites. But as I checked it over inside and out, I found an incredible lack of melted parts. When I plugged it in and started it up, everything loaded just fine. Using the printer's onboard interface, I performed every available test print. They all worked.

Snatched from Death's doorstep. “Hang in there,” I muttered, patting the machine's plastic case. “I'm doing everything I can.”

Like making sure Leila got an earful about this. Later.

Before leaving the scene, I had a good look high and low. Ceiling tile and carpet were clean. No leaks, no spills. Even the heated indoor air lacked enough water molecules to give Hothead or anyone else the idea that “excess moisture” might've been the problem. Time to chase down the ticket-holder and see if the problem was already resolved.

A couple of passersby pointed me toward a distant corner of HR, where I found a cube-desk buried under reports, folders, and other well-intentioned clutter. A man was sitting in an office chair facing the cube's entrance, squeezing a rubber stress ball.

“You Tony?” I entered the cube, offering my hand.

He stood, shook, then immediately returned to the reassurance of his toy. “Sorry. My boss is, uh, tough like that.”

“Hothead's your boss? Jesus. He almost single-handedly iced that printer. Well, maybe 'iced' ain't the word for it.” I folded my arms. “You know who's gonna hear about it? The new head of HR. When I close this ticket, I'll drop her a line about what happened.”

Tony's eyes went wide. “Really? Thank you! I know I'm supposed to go up the chain, but …” He edged closer, lowering his voice. “Sometimes it's the chain that's the problem, y'know?”

Something I'd run into only a million times. “I know. Can't do much about it most of the time, but I can here, so I will.”

Tony nodded. “Thanks again.”

“Don't mention it. Anyway, the printer. Your ticket said it was new? Looks pretty darn old to me.”

“It's new over here,” Tony explained. “They just it brought down and set it up for us.”

“Can you try printing now?” I asked. “Let's see what happens.”


Later that morning, I stopped by the usual smoke-break spot between office buildings. As wind and snow coursed through the alley, I recapped the morning's events for my friends Megan and Reynaldo. Then I pulled a stack of folded-up paper from my trench coat pocket, splitting it in half to hand them several pages apiece. At last, I dug through my pockets for my sorely-needed cigarettes and lighter. While I carefully shielded the lighter's flame from the wind to light the cigarette clenched in my teeth, they studied the printouts with looks that quickly turned baffled.

”I don't feel safe working with Cheryl?” Reynaldo read aloud.

”John keeps staring at me in the break room. I've told him twice.” Megan's eyes found mine. “What the hell? Every print request does this?”

“Every print job except for test prints,” I replied. “We're lucky the poor thing starts up at all after Hothead gave it the salon treatment.”

Megan smirked, handing back her pages before hugging herself against the cold. “Sounds to me like it might be a network issue.” She glanced Reynaldo's way for confirmation.

Our veteran network admin was too busy frowning at the stack of paper he rifled through to notice. “What have you tried?” he asked me.

I helped myself to a long, warming drag. “The printer already spent some time turned off and unplugged.” Hothead had seen to that. “Since it's old, figured I'd reinstall the drivers, clear the print queue. Didn't help.” I shrugged. “Megan's right. Since it doesn't happen with test prints, it seems like something fishy's happening when the print requests coming through the network.”

Reynaldo frowned in thoughtful silence for a while, then glanced between us. “Do you remember that system for submitting HR complaints anonymously through the intranet?”

Forcing my brain-pointer back into memory spaces I usually steered clear of, it came back to me a little, through a thick fog. “Few years back? Before your time,” I added for Megan's benefit. “Never paid it much mind. Never really believed those gripes would actually be anonymous.”

“Yeah, that's crazy!” Megan said. “Who would trust that?”

I hefted the printouts she'd returned to me, each page loaded with more beef than a Texas ranch. “That's who.”

“They retired that program ages ago,” Reynaldo said. “The server was decommissioned—at least, so I thought.” He dropped his cigarette butt to the slush-covered asphalt and crushed it underfoot, sighing heavily with a knowing look. “Let's go trace some IPs.”

“Swell!” I was about to grind my partially-smoked cigarette against the brick wall behind me to save it for later when I caught the hopeful look in Megan's eye.

“Can I help, too?” she asked.

What fool would say no?

“We may need a good developer at that,” I said. “C'mon!”

To be continued…

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

by Ellis Morning at June 30, 2026 06:30 AM

ISO C++

Automated Unit Testing On-The-Cheap, Part 1 -- Chuck Allison

The framework consists of a single header file and demonstrates how expression stringizing, file/line reporting, and exception testing can be implemented with only a handful of macros and functions. The article also examines limitations of the original design and discusses how modern C++ features such as inline variables and modules affect the implementation.

Automated Unit Testing On-The-Cheap: Part 1

by Chuck Allison

From the article:

When Extreme Programming was all the rage in the late 1990s, automated unit testing was still a relatively fresh idea for many working software developers. JUnit and CppUnit emerged as the leading test frameworks for Java and C++, but I wanted something even simpler—code that students could understand and that was easy to use.

I thought I’d achieved it in the well-received article I wrote for the C/C++ Users journal in September 2000, The Simplest Automated Unit Test Framework That Could Possibly Work.

But I was wrong.

 

by ChuckAllison at June 30, 2026 12:45 AM

June 29, 2026

The Daily WTF

CodeSOD: Off the Path

File path separators are a common pain point when writing cross platform software. Of course, not every programming language has a graceful API for handling that. For example, prior to C++ 17, you had to do some #ifdef preprocessor magic to handle that. Which people usually did (or they'd use the Boost suite of libraries).

Code like this wouldn't be out of place or incorrect:

#if defined(WIN32) || defined(_WIN32) 
#define PATH_SEPARATOR "\\" 
#else 
#define PATH_SEPARATOR "/" 
#endif 

Do I like it? No. But now I've got a pre-processor constant that I can use to assemble my paths in a way that will work across different file path conventions.

Of course, that's the "normal" solution. You could, if you wanted, to it completely wrong. That's what Xian's predecessor did.

#ifdef UNIX
           filename += "/";
#else
           filename += "\\";
#endif
           filename += (*exSeq)[i].path;
#ifdef WIN32
           ReplaceAll(filename, "/", "\\");
#else
           ReplaceAll(filename, "\\", "/");
#endif

If we're compiling for unix, append a "/" to the filename. Otherwise, append a "\". Then we append a path out of an array. Then, if we're on Windows, find all the "/" in our filename and replace them with "\". Otherwise, find all the "\" in our filename and replace them with "/".

Instead of defining a constant and using it everywhere you need to construct paths, this code was copy/pasted everywhere you needed to append a path separator onto your string. Well, almost everywhere. Clearly, we don't know that the contents of (*exSeq)[i].path are correct for our target operating system, hence we have to do the ReplaceAll call to sanitize it. Why didn't we sanitize the portion we're appending instead of the whole filename (which presumably is already sanitized?)? A better question: is this running inside of a loop? It looks like it is, based on the [i] array access there.

Multiple developers have copy/pasted this code into multiple places. Not one of them gave a shot at refactoring it. And somehow, there are still code paths that output the wrong path separator sometimes, though at least modern Windows is forgiving about that.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

by Remy Porter at June 29, 2026 06:30 AM

XKCD

June 26, 2026

ISO C++

Panel discussion for C++: The Documentary

The New York May 28 world premiere event for C++: The Documentary was followed by a live panel discussion with Matt Godbolt (moderator), Bjarne Stroustrup, Gabriel Dos Reis, Nina Ranns, Eric Lubin, and Herb Sutter. The video recording of that panel is being released worldwide on YouTube tomorrow (Saturday) at 19:00 UTC. Click Notify me on the YouTube Premiere page to get a reminder when it goes live.

Panel.png

by Blog Staff at June 26, 2026 01:42 PM

The Daily WTF

Error'd: Fi fa foe

First up this week is a little story about a fifafail. I do wonder if this was a failure of the television station, or whether there was something more to it than that.

Hercules wrote to alert us to these World Cup shenanigans, explaing "At least the flags were correct. And yes, this was live TV. The host got the country names correctly, and even called out that the written text was wrong"

5503f1d7141948f88f4650c17468ff46

"I'm very open in my job search but I did limit it to France. The search has been working well for months, but this morning I got a bevy of new interesting propositions. It seems France is much bigger than it was yesterday." Apparently WorkerNumber29200 is surprised by the expansionist nature of an imperialist coloniser. Plus ça change, Worker.

f05fd09185bd4f2ebeacc92de9609131

We have a couple of wtfs from Github. First Hans K. "would love to find a, so I could fix this GitHub Dependabot issue."

4d41995a2e7a423cbf8de6e960b876c4

And Peter S. figures that "GitHub has trouble doing basic math -- or they have an unpublished proof that 0=1"

e954781458d64f6da02bfad014efc854

Finally Michele has just encountered one of the most maddening phenomena on Amazon recently. "Searching for a cheap USB-C fast charger. Got a list of expensive CDs of obscure artists." All of them AI-generated, like the 100000 Whys books?

cdf7c2baae7541a9ad8e90b9c4ecb0c4

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

by Lyle Seaman at June 26, 2026 06:30 AM

XKCD

June 25, 2026

The Daily WTF

The Roadmap

When Gary was called in for a meeting with a few of his managers- because of course he had several- he thought it was going to be for an "attaboy", because things had been going really well for the past few months.

Gary had inherited a mess, and taken over a nightmare application. It was the kind of application that should be a simple CRUD-style data-driven app, but somehow despite only having 20ish entities it managed, someone had generated 500+ controllers for managing them. Most of those controllers were copy/pasted code with minor changes in the WHERE clause of a SQL query.

And that was just the code. The infrastructure was similarly a mess, with duplicate resources provisioned in their cloud host. There was no CI/CD, no unit tests to speak of, no deployment process that wasn't "manually copy these files and pray". And uptime? You've heard about "five nines", but this product was lucky to get even one nine. Especially because the manual deployment process meant a few hours of downtime.

And that was just the infrastructure. The backlog was similarly messy. There were lots of tasks- many thousands- but not a single one had a priority. Most of the tasks were something like, "Fix database timeouts", or "Bug 531" with no description to explain what they were. At best, some of the "new feature" tasks linked to a Google Doc that explained a software roadmap that had been last updated in 2020.

So with no guidance, Gary and the rest of his team got to work. Cloud costs were massive. Just cutting the duplicate resources would help, but with actual planning it wasn't hard to find even bigger wins. In total, Gary got the cloud costs down 60%- essentially saving the company a small multiple of his salary every year.

With that out of the way, getting a CI/CD pipeline running was next. Within a few weeks, manual deployments were gone. Everything was automated. Downtime nearly vanished. And now, with all the cost savings in cloud resources, for a fraction of what they were paying, it was easy to automate provisioning test environments for each new feature.

So Gary was very ready for some congratulations when he sat down with management. He was prepared to discuss all the wins he and the rest of the developers on the project had gotten over the past few months.

"I'm sure you know why we're sitting down," Manager the First said when they settled into the conference room.

"I'm sure," said Manager the Second.

"We have some concerns about your performance," Manager the Third said.

"My performance?" Gary asked.

"Yes," said Manager the First. "Let me pull up the backlog."

"And the roadmap," said Manager the Second.

"Yes, I'm getting that up too, thank you." The trio of managers struggled with pulling up the appropriate pages, and after about 15 minutes, gave up. Instead, they discussed their complaint without visual aids. "You haven't completed any of the tasks on the roadmap. Bug 673 has been open since you started on the team. None of the roadmap milestones have been touched. There's absolutely no progress."

"Okay, but that document was wildly out of date," Gary said. "Instead I put cycles into solving the actual problems we're having. I've saved the company a huge amount of money. I've gotten our development cycle time down to a fraction of what it was. And we have basically no downtime!"

"That's all very nice, I'm sure," said Manager the Third. "But none of that was on our roadmap."

"Well, maybe we should set up a meeting to go over the roadmap," Gary said. "Because a lot of the tasks on there don't make much sense right now-"

"I don't think that's a good use of time," Manager the Second said. "Large meetings are expensive. Just stick to the roadmap, please."

With that, the meeting ended. Gary went back to work…

… updating his resume.

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

by Remy Porter at June 25, 2026 06:30 AM

June 24, 2026

ISO C++

CppCon 2025 C++ Standard Library:Design, Optimisations, Testing while Implementing Libc++ -- Hui Xie

xie-library.pngRegistration is now open for CppCon 2026! The conference starts on September 12 and will be held in person in Aurora, CO. To whet your appetite for this year’s conference, we’re posting videos of some of the top-rated talks from last year's conference. Here’s another CppCon talk video we hope you will enjoy – and why not register today for CppCon 2026!

Implement the C++ Standard Library: Design, Optimisations, Testing while Implementing Libc++

by Hui Xie

Summary of the talk:

This presentation covers various practical examples in the designs, optimisations and testing in libc++, a standard library implementation.

In space optimisation section, it presents various examples of using compact type, reusing tail padding bytes, reusing unused bits in existing bytes, in various standard types: std::stop_token , std::expected , std::optional , std::variant , std::ranges library and std::move_only_function .

In time optimisations section, it presents examples of how we optimise std::atomic<T>::wait 's waiting strategy, how we optimised algorithms for segmented iterators, and also how we keep in mind optimisations by leaving the door open for future optimisations. At the same time, compilation time is also important so it also contains examples how unnecessary template instantiations can be avoided.

Finally, this talk covers the unit tests of libc++, including the high test coverage of standard spec, the technique we share tests between runtime and constexpr, negative testing and so on.

by Blog Staff at June 24, 2026 10:08 PM

A first look at the program of Meeting C++ 2026

With the voting on the talks ending on Sunday, Meeting C++ has now published its program, take a look at the talk listing.

A first release of the program for Meeting C++ 2026

by Jens Weller

From the article:

With the voting ending on Sunday, there is now a first overview on the program of Meeting C++ 2026 available!

As early bird tickets are selling out, its time to get your tickets!

You can take a look at the accepted talks, this is the main track:

    Robert Leahy - What Are We Synchronizing?
    Ivan Čukić - Contracts and hardened libraries - a bright future for C++ safety?
    Henrik Vallgren - Compile time is the future of Automotive Software
    Dawid Zalewski - C++26 static reflection: All you need is annotations
    Andreas Fertig - When Your Compiler Runs Your Code
    Matt Godbolt - Compiler Explorer in 2026: Sandboxes, Storage & Strangers' Code
    Antoine Morrier - Thread-safety compile-time guaranteed in C++
    Daniela Engert - Same C++, but quicker to the finish line
    Giuseppe D'Angelo - Not-so-trivial relocation in C++
    Guy Davidson - Profiles are coming
    Klaus Iglberger - Design Patterns - The Most Common Misconceptions (3 of N)

 

by Meeting C++ at June 24, 2026 07:46 AM

The Daily WTF

CodeSOD: Authorized Logger

Gretchen's company recently got purchased by Initech. Specifically, they were bought for their dev team, of all things. They had a few software products that were high performers, and Initech wanted that secret sauce. They bought the company, and then split the dev team up and migrated the developers to new products.

That actually worked out okay for Gretchen, most of the time. For a few projects, the dev team was given some requirements and a free hand to figure out how to deliver them. They were free to reuse code that existed or rewrite entirely, based on their own judgement. They were free to pick the tools they wanted to use, and the results worked out well.

But there were some projects that… were a different story. After those successes, Gretchen got moved onto a project that was 90% firefighting. The app had code like this:

req.body.externalId = !!req.body.externalId ? req.body.externalId + "" : "";

How's that for some null handling.

The whole thing can't run on a version of NodeJS newer than 14: a version that last got an update in 2023.

"The code follows no conventions," Gretchen writes, "there's no logging."

exports.create = (req, res) => {
  logger.debug('creating new staffClient');
  logger.debug(req.body)
  // let staffClient = new StaffClient({});

  // // run through and create all fields on the model
  // for(var k in req.body) {
  //   if(req.body.hasOwnProperty(k)) {
  //     staffClient[k] = req.body[k];
  //   }
  // }


  StaffClient.query().insert(req.body)
  .returning('*')
  .then(staffClient => {
    if(staffClient) {
      res.send({success: true, staffClient})
    } else {
      res.send({ success: false, message: "Could not save StaffClient"})
    }
  });
}

Now, you may say to yourself, "What do you mean there's no logging? I see it right there!" There is a logger utility class, and do you know what it prints when you call logger.debug("some message")? It prints DEBUG.

This code handles an HTTP request, and stuffs the body of the request into the database; here's hoping that it's a well formed request. Somebody's got a lot of faith in their front end. WHat's interesting about this one is they've tried two different ways of copying the request object into the database, the first one focusing on making sure they only copied non-inherited properties, and the second just YOLOing the data into the database.

Now, this particular segment goes through their ORM to write data into the database. But not all the code does that. Many places write data through direct SQL, and guess what happens there: SQL injection vulnerabilities.

You may also notice that this function doesn't do any authorization checks, which is fine, that should be configured in the middleware. Should be- but isn't. Most endpoints have no authorization checks at all. Even the endpoints that do, like their admin API, have copies of the same endpoint with no authentication configured.

[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.

by Remy Porter at June 24, 2026 06:30 AM

XKCD

June 23, 2026

ISO C++

Silent foe or quiet ally: Brief guide to alignment in C++. Part 3 -- Elizaveta Zhegalova

We continue our deep dive into memory mechanics. If you are just joining us, I recommend reviewing the foundations first. The first part covered the basics and the magic of simple data alignment, while the second part focused on how ordinary inheritance affects memory layout.

Silent foe or quiet ally: Brief guide to alignment in C++. Part 3

by Elizaveta Zhegalova

From the article:

So far, we've treated an object as a static, rigidly determined data structure. Every field address was known at compile time, and inheritance simply layered parent and child attributes. Alas, object-oriented programming is impossible without dynamic polymorphism, which is implemented in C++ via the RTTI mechanism and virtual functions.
 
What is virtuality?
Let me start from an off-topic question. How does the compiler know which piece of machine code to execute at a specific line in your program? Answering this question will help us understand what virtuality really means.
 
Imagine we write object.print(). For the processor, it's not an abstract action but a command to jump to a certain address in memory with some function instructions. But where do we take that address from?
 
During compilation, each code line becomes one or more machine instructions, each receives a unique sequential address in memory. The same applies to functions. A compiler translates them into machine code and assigns the next available address. Stitching a function call in code to its actual memory address is called binding.
 
Depending on when the call address is bound to the function address, there are two scenarios.
 
1. Static/early binding.
 
By default, static (early) binding is used. A compiler rigidly "hardwires" a specific function address at the call place in code during compilation. This decision relies solely on the pointer or reference type, not the actual object in memory. For instance, when a compiler sees a Base* pointer, it chooses the method address from the base class. It's fast and requires no additional evaluations. So, the jump goes to an already known address. It's also efficient, but it makes the program inflexible at runtime.
 

by Blog Staff at June 23, 2026 10:31 PM

"C++23 - The Complete Guide" draft ebook is out -- Nicolai Josuttis

I am happy to announce that my new book in the "The Complete Guide" series is out now as a draft ebook

C++23 - The Complete Guide

by Nicolai Josuttis

So far, the book has 350 pages and is not complete yet. However, many C++23 features are covered already. For details of the current content, look at www.cppstd23.com. There you can also find several example programs demonstrating how all the new features can be used.

You can order the book at leanpub.com/cpp23 for a reduced price and will get all updates for free. This way, you have early access to details of the new features and I have early income and can process feedback from you for the final version, which will also be available as hardcover (not included).

I hope it helps. Enjoy!

 

 

by Nico Josuttis at June 23, 2026 10:29 PM

The Daily WTF

CodeSOD: Do a Lot to Do Nothing

Today's anonymous submitter works in finance. I'll let them start the introduction:

This is a legacy application that has been running for nearly a decade in production so one could say that it's been thoroughly tested by daily production use and nothing needs changing

This is a collection of two C# methods, and we'll start with ValueAGPFund, which isn't a WTF per se, but definitely not code I'd want to maintain either.

public Valuation ValueAGPFund(int valuationId, ValueAFundParameters parameters, CapitalAccount capitalAccount, int? lotId)
{
    if (parameters.UseActiveCoefficientSet)
    {
        parameters.CoefficientSet = _coefficientSetQueries.GetActive();
    }
    parameters.InternationalDveCoefficientSets = _coefficientSetQueries.GetInternationalDveActive();
    var referenceData = _referenceDataFactory.CreateReferenceData(parameters, capitalAccount);
    if (lotId != null)
    {
        var di = referenceData.FundDirectInvestments.Where(x => x.PositionId == lotId);
        referenceData.FundDirectInvestments = di;
    }

    var countryMappings = _countryQueries.GetFullIsoCountryList();
    var valuation = _valuationFactory.Initialise(referenceData, parameters, countryMappings);
    valuation = ApplyValuators(valuation, referenceData, _valuatorFactory.CreateValuators(valuation, this));

    var valuationForCoverage = _valuationQueries.GetWithDirectValuationsAndFundValuations(valuationId);
    valuation = ApplyCoverage(valuation, valuationForCoverage);

    foreach (var fv in valuation.FundValuations)
    {
        _logger.Info($"Debugging distributions: for fund (parameter fund id = {parameters.FundId}, valuation fund id = {valuation.FundId}, fund valuation fund id = {fv.GpFundId}) in valuation {valuationId}," +
            $" loaded fund investment distributions from {string.Join(", ", fv.FundInvestmentDistributions.Select(x => $"{x.InvestmentId}:{x.TransactionDate:yyyy/MM/dd}"))}");
    }

    foreach (var fv in valuation.FundValuations.Where(x => parameters.InvestmentIds.Contains(x.EqtInvestmentId)))
    {
        fv.ValuationId = valuationId;
        _fundValuationCommands.Add(fv);
    }

    foreach (var dv in valuation.DirectValuations.Where(x => x.LotIdDiOnly == lotId))
    {
        dv.ValuationId = valuationId;
        _directValuationCommands.Add(dv);
    }

    foreach (var vw in valuation.ValuationWarnings)
    {
        vw.ValuationId = valuationId;
        _valuationWarningCommands.Add(vw);
    }

    var previousValuation = CheckPreviousValuationIfRequired(valuationId, parameters, capitalAccount, lotId);

    if (previousValuation != null)
        valuation.ChildValuations.Add(previousValuation);

    if (parameters.Frequency == ValuationFrequency.Daily)
    {
        var unapprovedValuations = _valuationQueries.GetList(valuation.FundId, valuation.ValuationDate, valuation.Frequency, valuation.Purpose)
                                                    .Where(x => x.IsApproved == ValuationStatus.Unapproved)
                                                    .ToList();

        _valuationCommands.Delete(unapprovedValuations.Select(x => x.Id).ToArray());
    }

    valuation.Id = valuationId;
    _valuationCommands.Update(valuation);
    _valuationCacheService.Refresh(valuation.Frequency, true);

    return valuation;
}

The key problem with this function is that it's got loads of side effects. It modifies the parameters parameter, which while it was passed by value, the value itself is a reference, so you are updating it on the caller, whether the caller likes it or not. It also modifies a bunch of internal class members. It's also just… doing a lot of different steps. It's not a WTF, but it's bad code. Note the call in the middle to CheckPreviousValuationIfRequired- we're going to come back to that in a second.

Let's take a look at how it's called.

private Valuation CheckPreviousValuationIfRequired(int valuationId, ValueAFundParameters parameters, CapitalAccount capitalAccount, int? lotId)
{
    if ((parameters.Frequency == ValuationFrequency.Quarterly || parameters.Frequency == ValuationFrequency.Monthly)
        && ValuationPurposeHelper.UserGenerated(parameters.Frequency).Contains(parameters.Purpose))
    {
        var inPeriodParams = new ValueAFundParameters
        {
            FundId = parameters.FundId,
            ValuationDate = parameters.ValuationDate.GetPreviousValuationDate(parameters.Frequency),
            CreatedBy = parameters.CreatedBy,
            Purpose = ValuationPurpose.InPeriodCalculation,
            Frequency = parameters.Frequency,
            InvestmentIds = parameters.InvestmentIds,
            UseActiveCoefficientSet = true,
            UseAmericanDve = parameters.UseAmericanDve,
            ValuationOptions = parameters.ValuationOptions
        };

        var openingValuation = _valuationQueries.GetInPeriodOpeningValuation(inPeriodParams.FundId, inPeriodParams.ValuationDate, valuationId);

        //return openingValuation == null
        //       ? null
        //       : ValueAGPFund(openingValuation.Id, inPeriodParams, capitalAccount, lotId);
        return openingValuation == null
                ? ValueAGPFund(openingValuation.Id, inPeriodParams, capitalAccount, lotId)
                : null;
    }

    return null;
}

This function checks the input parameters. Depending on the values, it will either return null, or it will call ValueAGPFund. Wait a second, ValueAGPFund calls this function. That's not good.

But let's really focus in on the return statement and its comment:

        //return openingValuation == null
        //       ? null
        //       : ValueAGPFund(openingValuation.Id, inPeriodParams, capitalAccount, lotId);
        return openingValuation == null
                ? ValueAGPFund(openingValuation.Id, inPeriodParams, capitalAccount, lotId)
                : null;

The current version checks if openingValuation is null, and if it is, tries to access it, thus triggering a NullReferenceException. This function either returns null or throws a NullReferenceException. So all that worrying about side effects and circular calls doesn't matter, but this likely isn't correct. The comment indicates that there used to be a correct version, which only called ValueAGPFund if the valuation wasn't null- but that version likely had all the problems of circular calls and unpredictable side effects.

As it stands, the application as a whole works. Since CheckPreviousValuationIfRequired only ever returns null or throws an exception, and since ValueAGPFund is only called from here, it looks like these functions could just both be removed without problems. But our submitter is wary of doing that:

The problem is that I first need to figure out whether 1) this piece of code produces any side effects and 2) nobody is relying on the System.NullReferenceException being thrown here.

No worries, though, right? I'm sure your unit tests will catch any regressions caused by removing that. Because this is the kind of code that definitely has great unit tests.

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

by Remy Porter at June 23, 2026 06:30 AM

June 22, 2026

ISO C++

CppCon's first-ever keynote panel: Stroustrup, van Rossum, and Torgersen, together at CppCon 2026

Every year, CppCon promises you a strong keynote lineup, and every year we deliver. But this year we get to do something rarer: announce a once-in-a-lifetime keynote panel of interest not just to C++ developers, but to our whole industry.

On Tuesday morning, September 15, the CppCon main stage will host a Language Designers Panel featuring three of the people who decide what the languages you use every day actually become:

  • Bjarne Stroustrup, the creator of C++ (who will have just given his own Monday conference kickoff keynote the day before)
  • Guido van Rossum, the creator of Python
  • Mads Torgersen, the lead designer of C# and Anders Hejlsberg’s successor in that role
  • Moderator: Emma Tracey, founder of CultRepo and producer of its new feature film C++: The Documentary and Python: The Documentary

Three living and growing languages used by millions of developers, three design philosophies, one stage, one conversation.

Bjarne and Guido have never been on stage together anywhere and may never be again; add Mads to the stage, and we expect this special moment to be watched, cited, and argued over for years. You can be in the room when it happens.

Why should a C++ audience care about a panel that is two-thirds “other languages”? The answer is that these languages are two of C++’s closest neighbors and are used together all the time.

  • Python is, by the numbers, C++’s truest sister language. In the Standard C++ Foundation’s annual C++ developer survey, when we ask which other languages C++ programmers use, Python always comes first, consistently around 70 percent — ahead even of C, which you might expect to win and is consistently around 45 percent. If you write C++, the odds are very good that you also write Python; the two have grown up side by side, gluing and being glued, and the relationship only deepens each year.
  • C# and C++ are the two dominant languages on Windows, and the two are constantly used together — native performance underneath, managed productivity on top — so the person designing C# is designing part of the world that a great many C++ developers ship into.

So this is a conversation among the architects of the three languages most of us actually live in. What do they envy in one another’s designs? Where do they think they got it right, and where would they start over? How do you steer a language with millions of users and decades of existing code without breaking the people who depend on you? And the lessons to learn from their shared experience reach well beyond language design — the same instincts that shape a language will sharpen how you design your own libraries and products. Bring your own questions, too — you will not get a chance like this often.

CppCon 2026 Early Bird registration discount is available until this Friday. After that, registration will continue to be available at the regular rate. CppCon 2026 runs September 12–18 at the Gaylord Rockies in Aurora, Colorado, and conference sessions are onsite-only this year — they will be recorded and posted to our YouTube channel afterward, but only the room gets the live experience and the chance to ask questions of all our speakers. If you have been waiting to register, this is the week to stop waiting.

Register now for CppCon 2026, and we’ll see you in Aurora.

by Blog Staff at June 22, 2026 06:54 AM

The Daily WTF

CodeSOD: When False is True

Lillith was integrating some new tools into an existing Ruby on Rails API. The existing API allowed you to send a dry_run flag along with the request, so that you could have the service calculate its changes without applying them.

The problem was, the new tool Lillith was integrating could send, in the body of the request, {"dry_run": false}, but the service would see it as true. Consistently.

The helper method which checked for "true" parameters looked like this:

def param_true?(param_name)
  param_value = params[param_name]
  params.key?(param_name) && (!param_value || param_value.to_s.downcase == 'true')
end

The purpose of this function is to handle stringy or nil inputs gracefully. And there's one thing I can say about the function: it will always identify a true value correctly. If your false value is a string, "false", it also works. But that pesky !param_value mean that any actual boolean false value will be seen as true.

This function has been in wide use through the application. Lillith's best guess is that up to this point, no one had set the dry run flag on anything but GET requests, where everything was strings. On POST/PATCH/PUT requests, where the data was passed in the body as JSON, it got parsed into actual boolean values, and thus failed.

That's the WTF, certainly, that this function was lurking and waiting to cause this confusion. But the annoying thing in this function is that it fetches the value from the associative array, then calls params.key? to see if the key exists. That's fine, since Ruby just returns a nil if a key doesn't exist, it's just annoying. I hate to see it. This is, admittedly, more of a "me" problem, but I hate it.

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

by Remy Porter at June 22, 2026 06:30 AM

XKCD

June 19, 2026

Phoronix

Open-Source NVIDIA NVK Vulkan Driver Now Supports DLSS

With the code merged today to Mesa 26.2-devel, the open-source NVIDIA "NVK" Vulkan driver is capable of handling Deep Learning Super Sampling (DLSS) with modern game titles running on Linux / Steam Play...

by Michael Larabel at June 19, 2026 08:26 PM

AMD-Powered Barco MXRT Graphics Cards Finally Seeing Linux Driver Support

Barco, the Europeean technology company that manufactures the AMD GPU based MXRT graphics cards for for multi-display medical imaging systems (and also MXRV for their NVIDIA based graphics cards), have to date only seen Windows drivers published for their professional-grade graphics cards even with using Radeon Pro derived GPUs. But a patch published today to the AMD graphics mailing list is opening the door for Linux support...

by Michael Larabel at June 19, 2026 08:11 PM

systemd 261 Released With New systemd-sysinstall OS Installer, IMDSD & Storagectl

Systemd 261 is out as stable today with a number of new features and ready to coincide with H2'2026 Linux distributions...

by Michael Larabel at June 19, 2026 06:28 PM

ISO C++

BeCPP Symposium 2026 - Keith Stockdale - The journey to "/W4 /WX": How hard could it be?

BeCPP Symposium 2026 (organized by BeCPP): Now on YouTube!

Keith Stockdale - The journey to "/W4 /WX": How hard could it be?

Abstract:

Building on the recent work of improving the quality of Sea of Thieves' codebase by upgrading from C++14 to C++20, this talk will focus on the work that has went into enabling warnings as errors on the game, and more. Rare will discuss the motivations behind wanting to crank up the warning level, and to flick the "warnings as errors" switch after 10 years of development in their multi-million line Unreal Engine code base.

About the Speaker:

Keith is a Northern Irish senior software engineer who has been working on the Engine and Rendering teams at Rare Ltd for the last 9 years. He primarily works on Engine and Rendering level systems involving General Purpose GPU systems such as GPU particle systems. Keith is enthusiastic about promoting writing good quality code, whether it is running on the CPU on the GPU.

 

by Marc Gregoire at June 19, 2026 04:28 PM

BeCPP Symposium 2026 - Chris Croft-White - Agentic Time-Travel Debugging

BeCPP Symposium 2026 (organized by BeCPP): Now on YouTube!

Chris Croft-White - Agentic Time-Travel Debugging

Abstract:

Time-travel debugging is a powerful technique to dive deep into the execution of your applications, providing visibility simply not available any other way and enabling rapid diagnosis of issues as well as understanding of unfamiliar code bases. With the AI revolution going on today, hallucinations are a major concern and limiting factor for adoption. Combining these two technologies enables us to give the AI Agent all the information it could possibly want about what happened in your application. This enables it to both investigate when something goes wrong to develop a hypothesis, but also a way to validate that hypothesis, and iterate on it as needed until the AI Agent is able to verifiably explain what happened and why.

About the Speaker:

Chris Croft-White is a Staff Solutions Architect at Undo, where he works at the intersection of debugging technology and developer productivity. With a career spanning field applications engineering, security, and technical pre-sales, he brings a practitioner's perspective to the challenge of helping engineering teams ship reliable software faster. Chris is currently focused on the emerging field of agentic debugging, exploring how AI can move beyond code generation to become a genuine partner in root cause analysis and defect resolution. He writes and speaks on practical approaches to integrating AI into real-world debugging workflows, cutting through the hype to find what actually works.

 

by Marc Gregoire at June 19, 2026 04:24 PM

Phoronix

AMD ACP7.D/7.E/7.F Driver Added In Linux 7.2: "Substantial Design Changes" For AMD Audio

It looks like AMD's next-gen SoCs not only will be exciting on the CPU side with the much anticipated Zen 6 cores but the AMD Audio Co-Processor "ACP" IP looks to be going through some significant updates...

by Michael Larabel at June 19, 2026 03:51 PM

Linux 7.2 Brings More Work Around WiFi Aware, WiFi 8 / UHR & More Networking Hardware

The networking subsystem changes have been merged for Linux 7.2 with a lot happening around the core networking code as well as the many wired and wireless networking device drivers...

by Michael Larabel at June 19, 2026 02:08 PM

Raspberry Pi OS Moves To Linux 6.18 LTS Kernel, Updated LabWC Compositor

Raspberry Pi engineers have released their first update to Raspberry Pi OS since April. With this new version comes the upgrade to the latest Linux 6.18 LTS kernel...

by Michael Larabel at June 19, 2026 01:07 PM

Apple M3 Booting On Linux After Three Years Plus Other SoC Updates In Linux 7.2

Just shy of 1,000 new patches were merged on the SoC side for the Linux 7.2 kernel. Among all those patches are enabling five more SoCs to work with the mainline Linux kernel -- including the long-awaited Apple M3 support...

by Michael Larabel at June 19, 2026 11:09 AM

AMD Introduces An AI-Powered Bash Coding Agent

Just days after AMD engineers released a new Lemonade AI server with MCP server integration to make it much more useful, they have now released a new release of their GAIA "Generative AI Is Awesome" open-source software. With AMD GAIA 0.21.2, they have introduced a bash coding agent is their latest big ticket item in the AI space...

by Michael Larabel at June 19, 2026 10:31 AM

Intel TDX Now Much More Practical With Ability To Apply Important Updates Without Reboot

For those interested in Trust Domain Extensions (TDX) with modern Intel Xeon processors for confidential computing but also view system uptime as critical, beginning in Linux 7.2 the TDX support is now much more practical with allowing live updates without the need to reboot the running system in the event of security updates and similar...

by Michael Larabel at June 19, 2026 10:18 AM

ARCTIC Fan Controller, More ASUS & ASRock Boards Have Sensor Monitoring With Linux 7.2

For those that enjoy keeping an eye on all their system vitals from temperatures to voltages, the hardware monitoring "HWMON" updates have seen many device additions for Linux 7.2...

by Michael Larabel at June 19, 2026 10:08 AM

The Daily WTF

Error'd: Microbits

This week we have got a couple of Mathanon's. Maybe they're the same person, maybe they're not, there's really no way to know!

Frist anon has a "Numeric fun fact" for us: "Got a form sent from work to express interest in some event. They actually enforced the validation that the answer must be a number, so I submitted "42"." Bravo.

97007ddf5e024b1387e4f04fea560955

Next anon has a different numeric fun factor: " The SAS website wants us to know the size of the file behind the link down to the nanobyte precision." They split the bit! That must be what this quantum computing thing is about.

0a662a2420f54deab7167aa5e92a5bf3

Conscientious dad Mark R. takes all the responsibilities. "My kid's school ensures they're legally covered on all things said and unsaid."

55a99d3a5f5b4e588c8dd17063de6058

Philipp H. points out "The Redmond philosophers have created something the old Greek philosophers will have to rethink. Or is this a pun on Schrödinger's Cat? German→English translation: "We cannot bring/transfer/switch you to this message because you're in a chat, in which you're not in.""

35d852325db54dbdbbe52fff86de5cc7

We haven't heard from Michael R. in a while. Here he is with a pithy "The irony is not lost on me."

a045bde3e7c94088ae041de113a1d58a

Happy Juneteenth to those who celebrate.

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

by Lyle Seaman at June 19, 2026 06:30 AM

XKCD

Phoronix

AMD ISP4 Driver Merged To Linux 7.2 Kernel

The media subsystem changes were merged tonight for the Linux 7.2 merge window and it includes the long-awaited AMD ISP4 driver now in the mainline kernel.. This ISP4 driver is what completes the loop for enabling the web camera on the HP ZBook Ultra G1a and other future high-end AMD Ryzen laptops...

by Michael Larabel at June 19, 2026 01:00 AM

Linux 7.2 Gets Rid Of The Last Optimized MD5 Implementation

The Linux kernel has dropped the last of its architecture-specific optimized MD5 hashing algorithm implementations...

by Michael Larabel at June 19, 2026 12:47 AM

June 18, 2026

ISO C++

CppCon 2025 Lazy and Fast: Ranges Meet Parallelism in C++ -- Daniel Anderson

anderson-lazy.pngRegistration is now open for CppCon 2026! The conference starts on September 12 and will be held in person in Aurora, CO. To whet your appetite for this year’s conference, we’re posting videos of some of the top-rated talks from last year's conference. Here’s another CppCon talk video we hope you will enjoy – and why not register today for CppCon 2026!

Lazy and Fast: Ranges Meet Parallelism in C++

by Daniel Anderson

Summary of the talk:

Recent advances in the C++ standard have introduced powerful features like ranges and parallel algorithms—both aimed at writing faster, cleaner, and more expressive code. Ranges offer lazy, on-demand computation that improves I/O efficiency and composability. Parallel algorithms, on the other hand, harness multitasking to speed up compute-heavy workloads.

At first glance, these two features seem like a perfect match: lazy evaluation to minimize I/O overhead, and parallelism to maximize throughput. However, in practice, they don’t play well together. Many range operations—especially those over non-random-access sources—are inherently sequential due to their lazy pull-based, one-element-at-a-time nature.

In this talk, we’ll explore a modern library technique that unlocks the synergy between lazy ranges and parallelism. You’ll see how to build lazy, composable range pipelines that are parallel-friendly—capable of efficiently expressing operations like filter, scan, and flatten without sacrificing performance or elegance. We’ll walk through real-world examples where these techniques deliver strong parallel speedups with minimal programming overhead.

Whether you’re a library designer, performance enthusiast, or just curious about making your range-based code scale, this talk will equip you with practical tools to bridge the gap between composability and parallelism in modern C++.

by Blog Staff at June 18, 2026 10:06 PM

Phoronix

Godot 4.7 Released With HDR Output Support

Godot 4.7 is out today as the newest feature release for this leading open-source, cross-platform game engine...

by Michael Larabel at June 18, 2026 07:42 PM

How NVIDIA Vera CPU Performance Compares To The Ampere Altra Max

Last month on Phoronix was an exclusive first look at the NVIDIA Vera CPU performance compared to prior-generation NVIDIA Grace as well as the current AMD EPYC and Intel Xeon competition. Following that was looking at how the ARM Linux server performance has evolved over the past eight years of AArch64 Linux servers. A Phoronix Premium supporter recently requested wanting to see how Vera compares to Ampere Altra. While Ampere Altra has been in the marketplace now for more than five years, they are some of the most readily available ARM Linux server options for DIY/enthusiast builds given the scarcity of AmpereOne and lack of other readily available socketed ARM CPU options. This article shows how the performance compares between Ampere Altra Max and NVIDIA Vera.

by Michael Larabel at June 18, 2026 06:43 PM

EXT4 Reworks Fast Commit Handling & Faster Directory Hash Computation

The EXT4 file-system improvements were merged today for Linux 7.2 with some enticing optimizations...

by Michael Larabel at June 18, 2026 05:53 PM

Rust PNG Image Decoder Now Even Faster: Benefiting Chrome, GNOME, Etc

The Rust PNG crate, image-png, for PNG image encoding and decoding was already claimed to be the fastest PNG decoder in the world for the past year. Now with the latest optimizations, it's even faster...

by Michael Larabel at June 18, 2026 05:04 PM

Claude AI Assists In Fixing Years Old AMD Radeon Linux Display Bug Affecting Numerous Laptops

A bug in the AMDGPU Linux kernel graphics driver leading to some laptop displays freezing after periods of use may finally be close to being resolved. Given the length and quantity of bug reports and one of the problematic commits being tracked back to 2017, it's a heavy hitting issue for some Linux users. With the help of Claude Code, it looks like a fix is on the way to the Linux kernel...

by Michael Larabel at June 18, 2026 02:00 PM

AF_ALG Deprecation Approved For Linux 7.2, Useless & Insecure Crypto Driver Code Removed

The cryptographic subsystem updates have been merged for the ongoing Linux 7.2 kernel merge window...

by Michael Larabel at June 18, 2026 01:43 PM

Ubuntu Flavors Now Mandated To Participate In Beta Releases For Official Status

Canonical and the Ubuntu Release Team have implemented an important policy change for Ubuntu flavors moving forward. If they are to have an official release, they must now successfully submit a beta release...

by Michael Larabel at June 18, 2026 12:39 PM

Latest LLVM Patch Further Points To AMD GFX1250/GFX1251 Being Instinct Hardware

With the ongoing work around the AMD GFX1250 (and GFX1251) in the open-source AMD Linux driver stack, it's led to a lot of speculation about these parts in the GFX12 series associated with RDNA4. RDNA4 refresh? Or a lot of signals have pointed to GFX125x being possible AI/HPC accelerators such as for the upcoming Instinct MI400 series. Adding to the intrigue is GFX1251 being an APU. The latest LLVM compiler activity is further pointing to GFX1250/GFX1251 being for enterprise hardware...

by Michael Larabel at June 18, 2026 10:36 AM

Linux 7.2 EDAC Drivers Prep For Diamond Rapids, Nova Lake H

The Error Detection And Correction (EDAC) drivers, such as for dealing with ECC memory error reporting, are heavy on the Intel side with Linux 7.2 in preparing for upcoming hardware...

by Michael Larabel at June 18, 2026 10:24 AM

SteamOS 3.8.10 Stable Released With Updated Arch, Steam Machine Support & Wayland Desktop Default

Overnight Valve released SteamOS 3.8.10 into the stable channel. for succeeding SteamOS 3.7. There's a lot happening across the board to their in-house Linux platform for the likes of the Steam Deck and upcoming Steam Machine hardware...

by Michael Larabel at June 18, 2026 10:06 AM

Linux 7.2 Protects Against "Stupid Or Malicious" DoS Attempts By Arming Timers In The Past

There are a number of time(r) core subsystem changes for the Linux 7.2 kernel to better harden the kernel...

by Michael Larabel at June 18, 2026 09:58 AM

The Daily WTF

Representative Line: Sort This Out

Today's anonymous submitter has spent a long time toiling through many, many tickets. Their effort has been an attempt to "save" their employer from the disaster left behind by by a highly-paid consultant. As one does, our submitter started with the highest priority tickets with the highest severity. Eventually, they whittled down that list, and had some bandwidth to start looking at the pieces of the code which clearly weren't exploding right now (because there were no tickets), but were likely to explode at some point in the future (creating a storm of tickets).

Scanning through the JavaScript, our submitter found a sort function. That was automatically concerning- why was that particular wheel being reinvented?

The first line of the sort function was this:

obj[x._id.account_id] = x.count_total

In this case, x._id is meant to be the unique identifier from their Mongo DB. That, uh, should be not precisely a UUID (Mongo does its own weird version), but it definitely shouldn't have an account_id field on it. They are storing an arbitrary object as their unique identifier in the database. Which, I'm no Mongo expert, but I don't need to be Flash Gordon to know that's a bad idea.

But setting aside the choice of using random objects as unique identifiers, there's also the other question: how is this furthering the goal of sorting? Why on Earth am I building an object in the form: {"id0": 5, "id1": 7, "id2": 11}? Or am I even doing that? This is the first line of the function, so we're not even doing a loop, it's just {"id0": 5}.

This isn't just an unexploded bomb, it's a mystery: the primary mystery being why hasn't this exploded already? The second mystery is: what's going to happen when your luck runs out?

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

by Remy Porter at June 18, 2026 06:30 AM

Phoronix

AI/LLM Patch Craziness Having An Impact On ARM64 Linux Kernel Development

The ongoing rise in AI/LLM-generated patches hitting the mailing lists and affecting development workflows continues to impact Linux kernel development. For the ARM64 architecture updates in Linux 7.2 is an interesting anecdote over over feeling like this activity has "slowed us down a little on the feature side" and having to deal with this AI/LLM patch activity resulted in some features now being postponed from making it for this current Linux kernel development cycle...

by Michael Larabel at June 18, 2026 12:26 AM

June 17, 2026

ISO C++

C++26: string and string_view improvements -- Sandor Dargo

SANDOR_DARGO_ROUND.JPGLet’s continue our exploration of C++26 improvements. Today we focus on string_view. Some types got new constructors accepting string_views, and concatenation of strings and string_views just got easier.

C++26: string and string_view improvements

by Sandor Dargo

From the article:

But let’s start with a brief reminder of what a string_view is.

Reminder: the role of string_view

std::string_view was introduced in C++17 and its purpose is to provide read-only access to a string-like object. It can often replace const string& parameters and offers a significant performance gain. It’s generally advisable to use it whenever you’d pass an immutable string-like input that you cannot move from source to target.

We covered the topic earlier in more depth here.

P2495R3: Interfacing stringstreams with string_view

A stringstream is a good old tool for dealing with operations on string-based streams. While C++23 introduced spanstreams, due to fundamental semantic differences, stringstreams are not dead and it’s important to maintain them.

Being a good old tool also means they predate string_view. Given the available set of constructors, if you want to initialize a stringstream from a string_view, you first have to manually convert it into a string.

P2495R3 fixes this by adding new constructors accepting string_views.

It’s worth noting that this is a purely additive library change — it doesn’t break existing code.

At the moment of publication, this change is already available on Clang 19.

by Blog Staff at June 17, 2026 10:28 PM

Phoronix

Bcachefs Tools 1.38.6 Brings Many Performance Improvements

Kent Overstreet announced the release today of Bcachefs-Tools 1.38.6 as the user-space tools built around the Bcachefs copy-on-write file-system. There are a few new features and a lot of performance work in v1.38.6 without bringing any on-disk format breakage...

by Michael Larabel at June 17, 2026 08:06 PM

Linux 7.2 Slab Changes Include More Performance Optimizations

The slab memory allocation changes for Linux 7.2 have been merged and continue to see more work around shaves and performance optimizations...

by Michael Larabel at June 17, 2026 08:00 PM

AMD's Lemonade AI Server Now Much More Useful With MCP Server Integration

The open-source Lemonade AI server for "100% free and private" AI usage across Windows and Linux in leveraging AMD Ryzen AI NPUs, Radeon GPUs, and x86_64 CPUs, is now much more powerful with today's v10.8 release...

by Michael Larabel at June 17, 2026 07:43 PM

Experimental, Reverse-Engineered & AI Assisted Rust Driver Targets Modern DisplayLink Hardware

The original DisplayLink USB display adapters were great for working with an upstream, open-source driver while sadly the newer DisplayLink tech has been limited to an out-of-tree driver and proprietary user-space daemon. But posted today is an experimental "Vino" driver that is a clean-room, reverse-engineered driver for newer DisplayLink hardware...

by Michael Larabel at June 17, 2026 04:23 PM

Epic Games Announces Lore Open-Source Version Control System

Epic Games announced today they have created a new version control system that is now open-source as Lore. Given the proliferation and excellence of Git, you may be wondering why Epic Games is pursuing another VCS option... They are specifically catering Lore to games and entertainment purposes with large file sizes...

by Michael Larabel at June 17, 2026 02:45 PM

Intel Core Ultra X7 Panther Lake Performance On Linux 7.1

After recently noting the Intel Arc B580 Battlemage performance improving with Linux 7.1 and similarly finding performance gains for the Arc Pro B70 on Linux 7.1, several Phoronix readers have been wondering whether the newer Xe3 graphics with Panther Lake similarly benefit. Here are some CPU and iGPU benchmarks of the Core Ultra X7 358H "Panther Lake" SoC between Linux 7.0 and the recently stabilized Linux 7.1 kernel.

by Michael Larabel at June 17, 2026 02:30 PM

Myna Announced As Speech-To-Text Solution For The Ubuntu Desktop

Earlier this month plans were shared publicly of Ubuntu 26.10 aiming to build a context-aware desktop with local AI features and one of the first capabilities to be integrated speech-to-text support. Now we have more details on the speech-to-text plans with Canonical announcing the Myna project...

by Michael Larabel at June 17, 2026 01:34 PM

Initial AMDGPU HDMI 2.1 FRL Support Successfully Merged For Linux 7.2

The Direct Rendering Manager (DRM) kernel graphics/display and accelerator driver changes have been merged for Linux 7.2. The Linux 7.2 DRM merge is headlined by the long-awaited HDMI 2.1 Fixed Rate Link (FRL) support for the AMDGPU open-source driver as part of the larger effort of finally proceeding with a full HDMI 2.1 implementation for this AMD Radeon Linux driver...

by Michael Larabel at June 17, 2026 12:21 PM