News for hackers. Stuff that matters.
Re:Let’s Stop Bashing C by Annatar on Friday December 02, 2016 @08:33AM (#13088384)
That's an easily correctable problem: learn the living daylights out of programming in assembler, and then C will be like a walk in the park: no more overflows, no more pointer screwups, no more forgetting to free the memory, because you'll know exactly what will happen in the chip and the memory when that code compiles.

You'll even start writing code which relies on integer overflow (rollover from #$ff to #$00 again) because, depending on the situation, it will give you a performance boost, or make the algorithm implementation simpler, or both, and you'll know it.

It's long past time to invent and use better systems languages.

I can't comment on Go, but the textbook examples of Rust and even treatises on the subject from recognized experts in the computer science field (Adam Leventhal) show it to be an utterly overcomplicated language for which there should be a criminal trial and a prison sentence of several decades. Immutables, borrowing, no, I have to stop; my head hurts already, and I'm getting a migraine thinking about solving even the simplest of classic input-output problems with such an overly complicated language. (And my head wants to explode when I compare Rust with AWK for solving input/output problems, the biggest reason why computers were invented.)

So... C, C, and more C, because it's infinitely flexible and simple. I like simple, because simple is smart. Complicated and complex isn't.

Let's all please be humane to one another and stop inventing more languages. We need less languages, not a bazillion variations on the one central task: making the computer do something. And for that, we already have all the languages we could ever want or need, and for the theoretical case where we don't, there is always the almighty assembler, in which exist no limitations as to what one can program with it.

Re:Let’s Stop Bashing C by ekidd on Friday December 02, 2016 @08:57AM (#13088539)
That's an easily correctable problem: learn the living daylights out of programming in assembler, and then C will be like a walk in the park: no more overflows, no more pointer screwups, no more forgetting to free the memory, because you'll know exactly what will happen in the chip and the memory when that code compiles.

Knowing how processors work doesn't prevent people from making mistakes.

I knew assembly long before I knew C, because I grew up on computers that were too small to run a C compiler. I've contributed to a half-dozen compilers. I've written disassemblers for weird embedded DSP chips. And by the standards of C programmers, I'm pretty paranoid.

None of this makes me superhuman. I make mistakes. I've written network-facing C code, and I've left people exposed to security holes. Want to see the carnage?

https://people.canonical.com/~ubuntu-security/cve/pkg/xmlrpc...

That's 6 CVEs against an obscure C networking library that I wrote. Technically, none of them were found in my code (not yet). All were in the third-party XML parser that I chose to use. But that doesn't absolve me of fault, and I bet there's a few more bugs lurking in my code that could be found with modern fuzzers.

I don't care whether people use Go or Swift or D or Rust or some brand new language. But wherever C goes, bugs and security holes almost inevitably follow. It's going to take decades to reduce the proportion of C in our systems, and we ought to start now.

Re:Let’s Stop Bashing C by Annatar on Friday December 02, 2016 @09:08AM (#13088617)
That's 6 CVEs against an obscure C networking library that I wrote. Technically, none of them were found in my code (not yet). All were in the third-party XML parser that I chose to use. But that doesn't absolve me of fault, and I bet there's a few more bugs lurking in my code that could be found with modern fuzzers.

While it is commendable that you take responsibility, you mis-diagnosed your error: it isn't the C programming language, but what you chose to do with it: send/receive extensible markup language for remote procedure calls. Seems like a great idea, until you actually have to deal with it. I just happen to be working on an application where I'm forced to generate XML-SOAP and send that over the network to a server, and then process the XML-SOAP response I get back with XPATH, using xsltproc. And all that because the designers of the server application use Java and didn't even know they were using XML-SOAP and XPATH, since by the time they work with it, Java libraries treat them as objects. (And neither did I, until I reverse-engineered the responses I'm getting.) I have caused the server to crash innumerable amount of times.

You're arguing for better systems languages, and I'm telling you that is a terrible idea because we have nobody so smart as to design something so complex to be simple, and the closest we have ever come to it is C. We already have way too many languages, that it's become a nauseating torture to work with computers.

Re:Let’s Stop Bashing C by pka on Friday December 02, 2016 @09:16AM (#13088659)
So you're saying C is a great language until you have to parse XML.

... exactly.

Re:Let’s Stop Bashing C by Annatar on Friday December 02, 2016 @09:28AM (#13088743)
That is exactly what I am saying, and more:

- don't use XML for anything;

- use the correct tool for the job, but first define the problem better. What was XML-RPC attempting to solve?

Re:Let’s Stop Bashing C by ekidd on Friday December 02, 2016 @09:57AM (#13088989)
What was XML-RPC attempting to solve?

That's an excellent question! To answer it, we need to rewind to the year 1998. Nobody had ever heard of JSON (2002) or REST (2000) or SOAP. If you wanted to do remote procedure calls, you needed to use Sun RPC or Corba or another binary RPC stack. Some of these required tens of thousands of lines of C code to implement, and I don't even want to think about the security issues.

Basically, XML-RPC was trying to be REST+JSON before that was a thing. It had already been implemented for most scripting languages, but one of my consulting clients needed a C implementation to interoperate, so I wrote xmlrpc-c in a couple of busy weeks around the end of 2000, I think.

Back in those days, XML had a very clear 30 page spec and XML-RPC had a 2 page spec. If you want to argue that I was wrong to use C to implement 32 pages of pretty good specs, or that I was wrong to use the best off-the-shelf XML parser of the day, well, I agree. But I think we need to demand more from our system languages.

Re:Let’s Stop Bashing C by zeveb on Friday December 02, 2016 @12:45PM (#13090656)
> To answer it, we need to rewind to the year 1998. Nobody had ever heard of JSON (2002) or REST (2000) or SOAP.

But people had heard of S-expressions, which are far more appropriate for data transfer than XML.

And the canonical S-expression spec, from 1997, is rather less than 30 pages: http://people.csail.mit.edu/rivest/Sexp.txt

Re:Let’s Stop Bashing C by pjc50 on Friday December 02, 2016 @11:39AM (#13090031)
I think one could actually argue that all RPC protocols have ended in unmanageable disaster, and that the only things that endure are IETF-style protocol-first human-readable systems. However, that would take a lot of argument which I'm not committed to.
Re:Let’s Stop Bashing C by kabdib on Friday December 02, 2016 @11:46AM (#13090107)
I looked at XML-RPC when it came out, and knew instantly that it would be a disaster. Even when you took out the XML-ness, the underlying concepts were complicated, badly explained and open to a ton of wiggle room.

Then you add the inefficiencies of XML encoding, and the utterly crappy nature of most XML translation layers . . . yeah, really easy to see the train wreck coming.

Re:Let’s Stop Bashing C by plywoodtrees on Friday December 02, 2016 @01:45PM (#13091152)
Sure, XML-RPC not the best protocol. Compared to others it's pretty simple, and the mess and number of edge cases is smaller than SSL or TCP/IP.

If C isn't up to implementing an only slightly complicated network protocol, it's not much of a systems programming language, is it?

It turns out, C is fine for writing such systems and getting them working fairly well, but very poor at making them really reliable and secure, and that's no longer a good tradeoff.

Re:Let’s Stop Bashing C by pka on Friday December 02, 2016 @09:38AM (#13088821)
You're making a great point against C, yet somehow you are not realizing it.
Re:Let’s Stop Bashing C by abritinthebay on Friday December 02, 2016 @10:35AM (#13089396)
You're right, but I think he's also making a wider argument that C isn't good at fixing bad application or data design choices choices for you.

He considers that a positive feature, not a bad thing. You're the inverse.

I can see both sides of that tbh. It's a justifiable - but myopically idealistic - point.

But man he's being a pretentious ass about it.

Re:Let’s Stop Bashing C by pka on Friday December 02, 2016 @11:29AM (#13089933)
I can't see how this can be a good thing.

If C is that bad at managing complexity (and complexity doesn't only arise from bad design choices, some problems are inherently complex) then it should be used as rarely as possible, period.

It's not about idealism, it's about ill-placed, almost comical elitism ("C is a low-level-hacker language and only real programmers use it" while a 3rd grader could understand pointer arithmetic) to the point of rather spending 5 days writing bug-ridden code in C instead of 5 minutes in whatever else, just because it's the right way.

It's ridiculous.

Re:Let’s Stop Bashing C by moosingin3space on Friday December 02, 2016 @11:56AM (#13090210)
> If C is that bad at managing complexity

This, in my opinion, is why even if C were somehow free of buffer/integer overflow, UAF, and other vulnerabilities, it would still be a poor choice for many real-world (read: complex) applications.

Re:Let’s Stop Bashing C by Pica_soO on Friday December 02, 2016 @04:39PM (#13092550)
You can always glue stuff to the compiler and reinvent c++.
Re:Let’s Stop Bashing C by Annatar on Saturday December 03, 2016 @03:35AM (#13094992)
You're right, but I think he's also making a wider argument that C isn't good at fixing bad application or data design choices choices for you.

Bingo, give the man a prize! As we say on UNIX: C gives one enough rope to hang oneself. It is expected one knows what one is doing, but in return, one gets complete control and infinite flexibility. No programming language can compensate for bad architectural decisions, or an absence of such decisions, or absence of insight. Such a programming language does not yet exist, and it is questionable whether it ever will. So yeah, you got exactly what I was trying to say.

Now, back to C: nobody, including me, has all the solutions, but from experience, I have some tips when writing C code:

run the damn thing you're building through a debugger; feed it all kinds of garbage while doing so; try to break it in every way, shape, or form you can think of. As the author of the program, one should have unique and powerful insights into where the weak points are. And after all of that is done and fixed, have someone completely unrelated to it try to break it. This last piece of advice is good for any language.

I have a friend. I'd beat the daylights out of my programs, break them every which way, fix all the bugs I could find, then I'd let him have at it. He'd usually break my program in 15 - 25 seconds. Then the cycle would repeat, until he could no longer break anything. At that point, we had something remotely resembling stable software. And a lot of those programs I had him break weren't even written in C!

One of the best techniques I found while developing in both assembler and C: run the program you're working on through the debugger as you're writing it. As soon as I write a new function, I fire up a debugger (or shell tracing, or...) One wouldn't believe how many bugs I've found and fixed before the program saw the light of day. And it saves so much time, even though that's completely counter-intuitive.

Re:Let’s Stop Bashing C by lallysingh on Friday December 02, 2016 @11:37AM (#13090006)
The circle in his argument is something like "C is great as long as you don't use it for things it's not great for."
Re:Let’s Stop Bashing C by Annatar on Saturday December 03, 2016 @03:48AM (#13095012)
That is correct.
Re:Let’s Stop Bashing C by RUG3Y on Friday December 02, 2016 @12:23PM (#13090459)
"don't use XML for anything"

This just made me laugh. I'm not making a value judgement about your statement, I neither agree nor disagree.

Re:Let’s Stop Bashing C by xenadu02 on Saturday December 03, 2016 @11:02PM (#13098729)
I'm gonna go out on a limb here and say you've shipped numerous RCEs and don't even know it.
Re:Let’s Stop Bashing C by Retra on Friday December 02, 2016 @08:28PM (#13093695)
What's the ideal number of languages, in your opinion, and in what year do you imaging we passed that number?

There were "too many languages" before C was even conceived of. If that were a reason to not use new languages, you'd never even have heard of C.

Re:Let’s Stop Bashing C by Annatar on Monday December 05, 2016 @07:42AM (#13104995)
Five. We passed that way back in the '60's of the past century.

Any more than five becomes counterproductive and destructive, because it's physically impossible to keep up with all of the new languages coming out, and no language solves all the problems simply and efficiently. Or elegantly, for that matter.

In my experience, it takes about ten years of heavy use to master a programming language and use it not only to its fullest extent, but correctly and efficiently as well. I would be interested to meet a person who has that kind of time, biologically.

If that were a reason to not use new languages, you'd never even have heard of C.

Back in my day, the number of computer platforms was pragmatically limited: either you wrote software for the Commodore Amiga, or you wrote software for the Atari ST. If you were a software company, you wrote for both. If you were a programmer with lots of experience, you split the core from the hardware dependent subroutines, but I don't think anyone thought about this very UNIX-specific approach to programming back then (most of us had never heard of UNIX). We all wrote software in assembler, and were just lucky enough that both major platforms had the exact same processor family, the Motorola 68000. The C programming language was a solution to a problem nobody had or asked for. I remember making fun of my mathematics teacher and berating him for writing programs in C, because compared to assembler, it was lame: bloated and slow. It was impossible to code something of any significant speed and small enough size in C on either Atari ST or the Amiga. We viewed C as something lamers who couldn't figure out assembler dabbled with. One just couldn't compete in C with code written in assembler, which effectively meant that if you didn't code in assembler, and your code wasn't small or fast enough, or both, you weren't competitive, and the lamer label was soon to follow.

Times have changed, C is now the portable assembler, but they have changed only somewhat. When push comes to shove, understanding what happens at the hardware level is still crucial when performance problems strike... and they strike a lot. Most importantly, understanding how the hardware functions at the lowest level is most important when writing in really high level languages. The higher the language abstractions, more crucial understanding of how low level hardware functions becomes.

Nowadays, when I have multple incompatible processors to deal with, completely different hardware architectures, and plenty of raw processing power, C is a very viable, even desirable choice: if I write my code cleanly enough, it will just compile and run everywhere without modification, and I'm done, but back then...

...C was the answer to a question nobody asked or cared for in the personal / home computer space in those days. If one couldn't figure out assembler, one dabbled in GFA-BASIC or C, or Pascal. It was a very elitist, eat or be eaten environment. If one's code was too large or too slow, one became the public laughing stock of the scene. It was a very effective, and highly motivating selection measure. I miss those days.

Re:Let’s Stop Bashing C by moosingin3space on Friday December 02, 2016 @11:05AM (#13089698)
> I can't comment on Go, but the textbook examples of Rust and even treatises on the subject from recognized experts in the computer science field (Adam Leventhal) show it to be an utterly overcomplicated language for which there should be a criminal trial and a prison sentence of several decades. Immutables, borrowing, no, I have to stop; my head hurts already, and I'm getting a migraine thinking about solving even the simplest of classic input-output problems with such an overly complicated language. (And my head wants to explode when I compare Rust with AWK for solving input/output problems, the biggest reason why computers were invented.)

The level of contempt for other people and utter lack of perspective shown by this comment makes my head want to explode.

Re:Let’s Stop Bashing C by pka on Friday December 02, 2016 @08:50AM (#13088490)
At first I thought that was sarcasm... but it's unfortunately not.

> no more overflows, no more pointer screwups, no more forgetting to free the memory, because you'll know exactly what will happen in the chip and the memory when that code compiles

To whoever wrote this: are you ready to share the code of a sufficiently complex program in C (or assembler, why not) you wrote and pay $100 for every "pointer screwup", buffer overflow, memory leak and generally every bug people find, which could have been prevented by a strong type system or borrow checking and other such complicated features?

Re:Let’s Stop Bashing C by pjmlp on Friday December 02, 2016 @10:21AM (#13089249)
$1 would be enough, you could still get rich.
Re:Let’s Stop Bashing C by pcwalton on Friday December 02, 2016 @10:57AM (#13089623)
> I can't comment on Go, but the textbook examples of Rust and even treatises on the subject from recognized experts in the computer science field (Adam Leventhal) show it to be an utterly overcomplicated language for which there should be a criminal trial and a prison sentence of several decades.

You sure are angry with me for working on a programming language.

Re:Let’s Stop Bashing C by sanderjd on Friday December 02, 2016 @02:33PM (#13091542)
Yeah I don't get this sort of attitude at all. It seems like a very simple sequence of steps:

1. Creating something non-trivial in language X, 2. Identifying things that language X made difficult, 3. Brainstorming ways to implement solutions to those issues within a set of acceptable trade-offs, 4. Concluding that some of the brainstormed ideas might actually work, 5. Working really hard to implement and iterate on them.

I can't figure out which step the parent commenter scorns. I guess probably step 2, where they see no pain points to begin with. That's fine, but trying to convince people they haven't felt pain that they have felt is a silly battle. I guess they're actually implying that people who have felt that pain are just not smart enough.

Re:Let’s Stop Bashing C by Annatar on Saturday December 03, 2016 @02:53AM (#13094871)
No, I'm implying that people are either too egotistical or that they overestimate their insights, or both, when they create a new language. These days it seems like there is a new language every 15 minutes. It's getting to be ridiculous.

And the worst part of it is, no such language covers all problems effectively; they all have flaws in one way or another... so the next guy comes along thinking he can do it better, and just repeats the mistake of his or her predecessor(s).

Instead of realizing that this would just exacerbate the problem, they go ahead and make it worse.

I guess they're actually implying that people who have felt that pain are just not smart enough.

It is extremely difficult to solve a complex problem in a simple manner. One literally has to be a genius with a lifetime of experience and insights from that experience in order to be able to pull that off, and even then, it doesn't always work and requires multiple iterations, and lots and lots of experimentation. Case in point: Go, still a work in progress by exactly such people. That should be instructive, but it seems that it isn't.

Re:Let’s Stop Bashing C by sanderjd on Sunday December 04, 2016 @09:13PM (#13102952)
> And the worst part of it is, no such language covers all problems effectively; they all have flaws in one way or another...

Which is exactly why you don't try to create a language that covers all problems effectively, you define the problems you'd like to speak to. If you have defined those problems in such a way that they are shared by many people, and if you solve those problems in a way that many people find effective, then you may have created a compelling solution. How does that exacerbate "the problem"?

Honestly, what even is "the problem"? Why does it bother you that there are new languages created? The "literal geniuses" from the Bell Labs era experimented a ton, and that was a great thing then, and remains a great thing now. It's always valuable to point people to prior art, but it makes no sense to bemoan research and experimentation.

Re:Let’s Stop Bashing C by Annatar on Tuesday December 06, 2016 @06:52AM (#13113926)
Honestly, what even is "the problem"? Why does it bother you that there are new languages created?

The problem is that new languages have such fatal flaws, that they make the problems they are trying to solve even worse.

The second, and much more serious problem, is that it takes at least ten years to truly master a programming language. Humans only live about 70 years on the average, which means that it is impossible to keep up with every new language that comes out. I mean I live for this stuff, but I would literally have to be chained to the computer my entire life without time for anything else. That is nonsense.

Anybody who thinks they have mastered a computer language in less than ten years is either a genius, or unbelievably egotistical and arrogant; and knowing a whole bunch of computer languages in a perfunctory manner, enough to make one dangerous leads to a really shitty job of sorting out that mess afterwards... that's the problem. My problem, and likely other people's problem.

Re:Let’s Stop Bashing C by sanderjd on Tuesday December 06, 2016 @10:42AM (#13115348)
But you don't have to learn all of them... If you think a new language makes the problems its trying to solve even worse, you definitely shouldn't bother with it. But many others may disagree with you, and decide to invest that 10 years in really learning it. There is no problem with this.

What I don't understand about your position is its absolutism. You keep talking about people being egotistical and arrogant, but it seems like you're the only one on this thread being those things, by claiming your subjective opinion as objective fact, and then making ridiculous hyperbolic statements about throwing people in jail based on it. It's not a contradiction for you to personally dislike a language's philosophy and for that language to have been a worthwhile creation and valuable to many people.

Your feelings about different languages are just, like, your opinion man.

Re:Let’s Stop Bashing C by Annatar on Thursday December 08, 2016 @12:58PM (#13132414)
But many others may disagree with you, and decide to invest that 10 years in really learning it. There is no problem with this.

Just wait until you invest ten years of your life to master a language, only for everyone else to move on to the next new trend, with you stuck holding the bag.

AngularJS, Rust, and node.js, is it? I can't wait to ask you how you're feeling about all that time you invested into all of those, when all the kids move on to something else and they're no longer popular, for no reason other than the newcomers' ignorance, or because something shinier came along, but didn't actually add any value, just re-implemented the old thing in a worse way.

We can then have a discussion about how you're feeling, having wasted a decade or more of your life away on what will then be perceived irrelevant. That's of course under the (optimistic) assumption that HN is still going to be popular in ten years...

Re:Let’s Stop Bashing C by Annatar on Saturday December 03, 2016 @02:51AM (#13094862)
I sure am. Not for working on it, but for thinking you can do it better, and for exacerbating the problem even more.

The fathers of C created AWK as C on steriods, and even though they were a success in this endeavor, they were wise enough to create it as a domain specific, and not a general purpose language. If you study their works afterwards, up to Go, they always developed domain specific minilanguages, and always split the difficult problems into many small programs, hence Plan 9. This is very instructive in the context of their previous achievements. They even recommend to solve problems by creating a domain specific minilanguage, but only when this is appropriate to the problem at hand.

Now fast forward to Go. These guys really know what they're doing, and still Go is a research project, unlike Rust, they're not trying to actively sell it to the populace at large, because they know just how difficult it is to create a good systems programming language. So yeah, you bet your patootie I'm angry at anyone who thinks they can do it better. It's not even that they screw it up, that's part of learning and gaining insight, but that they actually actively attempt to sell it as a good solution. Meanwhile, it's even more complicated than the previous solution! And then let's suppose someone invests about a decade to master that new language, such as it is: by that time a pile of other people come along thinking that they know it better and invent their own languages; sometimes they invent a new language just because they think it should have a different syntax, as was the case with Ruby, in the author's own words! Unbelievably arrogant! And now that becomes the new hotness. Congratulations, you just wasted a decade of your life on something that's not in fashion any more. That would be no problem if we lived for 500 to a 1,000 years, or if we were immortal, but we only have this one life, and the length of our life is a blip in the universe. So it turned out to be a huge waste of time. That's the part that really angers me.

Re:Let’s Stop Bashing C by trashtoss on Saturday December 03, 2016 @02:48PM (#13097205)
Respectfully, "those guys know how to do one thing well" is (IMHO) much more accurate phrasing than "those guys know what they're doing". Note that these are compatible statements.
Re:Let’s Stop Bashing C by pjc50 on Friday December 02, 2016 @09:00AM (#13088562)
> because you'll know exactly what will happen in the chip and the memory when that code compiles.

.. for the specific chip you've targeted. And possibly even the specific stepping.

And that's assuming that you're diligent enough to manually review all that assembler. Very, very few people are. This is why typesafe code was developed. This is why all those checks exist in Rust. Limitations are good. Limitations are your safety equipment. Assembler is the guy who scrambles up on the roof without tether or hardhat to "get the job done".

> language for which there should be a criminal trial and a prison sentence of several decades

Commentators who overuse hyperbole should be executed.

Re:Let’s Stop Bashing C by abecedarius on Friday December 02, 2016 @09:10PM (#13093856)
You say that knowing assembler makes it easy to understand how incorrect C code behaves. This was sort of true a few decades ago, when I learned C after learning assembler. It stopped being true around 15 years ago when the popular compilers started interpreting the C standard like your ex-wife's divorce lawyer (as Kragen put it).

I used to write a lot of C, and I no longer use it for anything serious either, because I'm too stupid and the stakes are higher. Maybe better tool support could change that, but I'd prefer a better language.

Re:Let’s Stop Bashing C by na85 on Friday December 02, 2016 @11:15AM (#13089790)
>because you'll know exactly what will happen in the chip and the memory when that code compiles.

No you won't. Assembly is an abstraction now, at least on x86.

The chip does all sorts of things in ucode behind the scenes

Re:Let’s Stop Bashing C by pjmlp on Friday December 02, 2016 @10:20AM (#13089236)
C doesn't offer anything better over Algol based systems programming languages, other that easier ways to corrupt data and ability to program write-only code.
Re:Let’s Stop Bashing C by Blaisorblade0 on Sunday December 04, 2016 @07:03PM (#13102493)
Knowing assembly won't teach you the difference between legal overflows and ones triggering undefined behavior, or why you might need -fno-strict-aliasing to cast your pointers, and many more things. Does anybody know any correct nontrivial C programs beyond the ones by DJB? Or anything close? And it's not like, once bug-free, those are evolving much...