11 ms·
Essential C [pdf]
- sylware 5y agoCould you tell the linux kernel devs to stop pouring tons of extensions and non C89 (with benign bits of c99/c11) code everywhere? For instance in the whole network stack, some "agents of the planned obsolescence" did not use constant expressions in switch/case statements or initializers. Also tell those who are using that toxic c11 "Generic" keyword to use explicit code instead. I think, the main issue for C now is the standard body trying to obsolete stable in time C code and forcing upon devs/integrators the usage of the only few compilers which are able to follow fast enough their tantrums (latest gcc/latest clang). Results: all attempts to provide "working" alternative C compilers is beyond reasonable. This is becoming so accute, it is more likely to be a worldwide scam than anything else. Yep, open source software is not enough anymore, it needs to be lean, simple but able to do reasonably "the job", and ofc very stable in time hence C89 only with benign bits of c99/c11, or "standard assembly".
- rurban 5y agowell, alternative compilers can excel in not providing broken optimizations based on UB. -Oboring is a thing in the kernel. chibicc e.g
- ChuckMcM 5y agoI have often wondered if a C89 standard with no UB would be the definitive go to language for systems. I mean you COULD define things if you chose to, right?
- MaxBarraclough 5y agoSome kinds of UB can easily be handled that way. GCC offers a flag to guarantee wrapping on signed arithmetic overflow, for instance. [0] It wouldn't be easy to nicely handle every instance of UB though. The current state-of-the-art for that kind of thing would be something like Valgrind, an extremely 'intrusive' runtime system. This is because of the particulars of the C language. For instance, the way it handles arrays and pointer arithmetic make it difficult to detect every instance of out-of-bounds access. [0] -fwrapv, see https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
- ChuckMcM 5y agoI think we're talking about different things, but maybe not. Using out of bounds references in arrays and pointer arithmetic are unsafe but they can be defined. The definition of "array accesses using indexes that are outside the range of 0 - the declared array size will access memory in the data segment. The compiler will treat that access as if the addressed memory had the type specified for the array." The behavior is defined, it is unsafe, but it is defined. Not like "the compiler may or may not choose to optimize out loads and stores, or re-order them." which especially on embedded systems creates bugs where the things like "read the status register THEN read the data register (which clears the status register when read)" those get re-ordered and suddenly your loop never exits because your status bit is never set. That kind of UB needs to die in a fire IMHO.
- pjmlp 5y agoOut of bounds is only defined for length + 1, for anything else anything goes.
- MaxBarraclough 5y agoThat doesn't sound right. C (and C++) permit you to do pointer arithmetic to derive a pointer value pointing to one element beyond the final element of an array. This special treatment doesn't extend to dereferencing though - if you deference that pointer, that's UB. If you do pointer arithmetic to derive a pointer value pointing 2 or more elements beyond the final element of an array, that's undefined behaviour, even if you never dereference that pointer.
- pjmlp 5y agoSure, I just didn't want to spend too much time explaining all details, my failure.
- tialaramex 5y agoIt's downright perverse to insist that you should be able to assume all accesses are volatile reads/ stores just because that was momentarily convenient. C lacks the intrinsics you'd actually want for this (explicit load/ store of various machine sizes) but it does provide the "volatile" storage qualifier which is what you should be using to do what you apparently wanted in C today. It makes no sense to demand everybody else writes some sort of "not-volatile" qualifier in front of every variable to tell the compiler that actually this is just a variable and it's OK to optimise.
- Ar-Curunir 5y agoHow do you eliminate ub without memory safety?!
- isomel 5y agoFor example, as mentioned in another comment, by making all read and write `volatile`, that way, dangling pointer and out of bounds are "defined" to be memory corruption or crash, and not the compiler optimizing the code in a way that the programmer did not enticipate.
- znpy 5y agoWouldn't that bring a performance penalty though?
- __d 5y agoYes. But the current trade-off (performance always wins) means that kernels and other embedded-style programs cannot rely on the compiler doing the "reasonable" thing for UB because it's explicitly allowed to do whatever it wants (which is generally, try for better performance). For kernel-style work, slightly lower performance but predictable/defined behavior for some of what is currently UB, makes life much simpler.
- Ar-Curunir 5y agoYou don’t need to do what youre saying for that; Rust provides a way to get both performance and safety
- unwind 5y agoHow is _Generic toxic?
- kevin_thibedeau 5y agoIt has some annoying misfeatures. Closely related types aren't treated as the same and you can't put multiple related types in a _Generic association list. You're forced to resort to explicit casts or call the type specific function directly which subverts the intended magic of using _Generic in the first place.
- eqvinox 5y agoSome of this was fixed by DR 481 [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2396.htm#dr_481 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2396.htm#dr...], can you give some specific cases/examples at issue?
- voldacar 5y agoit's ugly and doesn't feel like a first class citizen of the language
- CyberDildonics 5y agoThis is a vague and emotional argument to a technical question.
- properparity 5y agoStandard C is not suitable for writing kernels anymore due to all the ridiculous hostile interpretions of the standard (mainly typed based aliasing rules). I mean you can't even write an allocator in standard C.
- monocasa 5y agoBoth sides are true IMO. The kernel isn't capable of being written totally in standards compliant C, and it'd probably be better off if that fact wasn't used as carte blanche to write non standards compliant code where it doesn't provide a tangible benefit.
- jstimpfle 5y agoWhy can't you write an allocator???
- shadowofneptune 5y agoThen in this case the portability offered by C is false. Could be an equally valid approach to place the required behavior into separate modules written with an assembler.
- 5y ago
- eqvinox 5y ago> "Could you tell the linux kernel devs to stop […]" As you seem to care about this, have you made this argument on LKML yourself? What Linux kernel related work are you active on that drives your position?
- froh 5y agoBummer, that train is gone. There recently was a kernel community decision to explicitly move to C11. Its nicely documented on LWN https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/ https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/ It was also discussed here on HN https://news.ycombinator.com/item?id=30459634 https://news.ycombinator.com/item?id=30459634
- deleted 5y ago[deleted]
- huqedato 5y agoThank you! Most useful C book I ever got.
- emmelaich 5y ago> char ASCII character -- at least 8 bits. Pronounced "car". Never heard it pronounced car!
- pddpro 5y agoReally? I've always pronounced it car (kar) because it's short for character which is pronounced karakter in the first place.
- parenthesis 5y agoEverybody seems to say ree-verb as short for reverberation. I don't say "reeverberation", I say something more like "ruhverberation" — which I don't think is an odd pronunciation — hence I say "ruhverb", but people look at me funny when I do. Likewise I say char as "car".
- psyc 5y agoRight, but what sound does ‘a’ have for you? In my region, car, carrot, and care are 3 different vowel sounds (with ‘car’ being totally different from the others) and ‘character’ sounds like ‘carrot’ and not at all like ‘car’.
- oconnor663 5y agoIf "carrot" and "care" don't rhyme with each other, what other words do they rhyme with?
- ryanqian 5y agoA great book!
- 2ion 5y agoI learned C from that document with devc++ & mingw on windows :)
- rg111 5y agoThis is legitimately nice. Thanks for sharing it. I have gone over half of it, and I will start recommending it left and right.
- chakkepolja 5y agoThis one seems to be probably most in-depth free book for C programming in practice. https://beej.us/guide/bgc/ https://beej.us/guide/bgc/
- j-walker 5y agoCan someone explain to me why in Section 4: Functions they compute Twice by multiplying the number by three then subtracting the number once? Is it just to showcase more math, or is there a detail I'm missing? > /* Computes double of a number. Works by tripling the number, and then subtracting to get back to double. / static int Twice(int num) { int result = num * 3; result = result - num; return(result);**