Catch up on stories from the past week (and beyond) at the Slashdot story archive

 



Forgot your password?
typodupeerror
×
Operating Systems Linux IT

The Linux Kernel Is Now VLA-Free: A Win For Security, Less Overhead and Better For Clang (phoronix.com) 113

With the in-development Linux 4.20 kernel, it is now effectively VLA-free. From a report: The variable-length arrays (VLAs) that can be convenient and part of the C99 standard but can have unintended consequences. VLAs allow for array lengths to be determined at run-time rather than compile time. The Linux kernel has long relied upon VLAs in different parts of the kernel -- including within structures -- but going on for months now (and years if counting the kernel Clang'ing efforts) has been to remove the usage of variable-length arrays within the kernel. The problems with them are:
1. Using variable-length arrays can add some minor run-time overhead to the code due to needing to determine the size of the array at run-time.
2. VLAs within structures is not supported by the LLVM Clang compiler and thus an issue for those wanting to build the kernel outside of GCC, Clang only supports the C99-style VLAs.
3. Arguably most importantly is there can be security implications from VLAs around the kernel's stack usage.

This discussion has been archived. No new comments can be posted.

The Linux Kernel Is Now VLA-Free: A Win For Security, Less Overhead and Better For Clang

Comments Filter:
  • Vla [wikipedia.org]

  • by Anonymous Coward

    The advantage of VLA is pushing items to it without knowing the max. capacity.

    The risk of VLA-free is out of capacity, unknown max. capacity.

    The stack is like VLA but for only 1 stack instead of many stacks as many VLAs.

    Another example, the number of open files. I should not limit it to a small constant, by example, max. 1024 open files, but i need 1 million of open files (for P2P). With VLA it is more flexible under demand or needness.

    Many current PCs are 64-bit and have much memory as 32 GB by example for

    • by drnb ( 2434720 )

      Another example, the number of open files. I should not limit it to a small constant

      There is no such limitation. You can re-allocate arrays as needed. VLA is just automating that for you.

  • GCCisms (Score:5, Informative)

    by jd ( 1658 ) <imipakNO@SPAMyahoo.com> on Monday October 29, 2018 @04:40PM (#57558005) Homepage Journal

    The first problem is that they can be dropped from future versions of GCC. They're not part of any standard, after all.

    The second problem is that there are situations in which GCC isn't the most suitable compiler. You want to minimize hacks for each different compiler supported.

    Security is a big thing, too. It's hard to audit fundamentally unpredictable code.

    A major step forward.

    • by drnb ( 2434720 ) on Monday October 29, 2018 @05:32PM (#57558363)
      It helps with debugging too. Build with two unrelated compiler systems and bugs that don't stand out in one may stand out in the other. And I am talking run-time errors not compiler warnings.
    • Once we get rid of all the GNU'isms can we go back to simply calling it "Linux". ;-)
      • by jd ( 1658 )

        The GNU over Linux refers to GNU userspace over Linux kernelspace. So a GNU userspace over OpenBSD would be GNU/OpenBSD. BSD/BSD is 1, since you're dividing by itself.

    • Re:GCCisms (Score:4, Informative)

      by The Evil Atheist ( 2484676 ) on Monday October 29, 2018 @05:41PM (#57558425)
      VLAs are part of the C99 standard. It says so right in the summary, and you can look up the standard itself.
      • by jd ( 1658 )

        There's lots of stuff in the Linux kernel that uses a GNU variant of a concept rather than the ISO variant. Often because GNU was there first. If you switch from the vendor-specific form, the isms, to the standard form, you don't change the concepts involved but you do make it more portable.

    • by Anonymous Coward

      A major step forward.

      How the fuck is this a step forward?

      You previous needed a array of variable size.
      You had a language feature that automatically allocated storage for it statically on the stack in a virtually seemless way.
      "Oh no! Advanced features!! Memory stuff!! Scary, scary, go back to K+R!"
      Great. Now you still need the same functionality , but you've now gone BACK to playing around with malloc/free, adding additional function parameters, wasting memory "just in case", or whatever other ad hoc soluti

      • by aberglas ( 991072 ) on Monday October 29, 2018 @07:00PM (#57558869)

        Just memory addresses. *Foo could be one or a few or many. Pointer arithmetic.

        So variable arrays feels odd.

        If you did not like chasing down weird memory corruption problems then you would not be using C (or C++) in the first place.

        It would have been trivial to add a little bit of sanity with syntax like

        void foo(char buf[blen], int blen)

        so a compiler could, in debug mode, check. But no, that would not be a hero's C. nor is variable length arrays.

        Incidentally, C's lack of arrays is not efficient. E.g. it is the reason we need 64 bit pointers, namely that C can only address 4 gig in 32 bit pointers. Java can access 32 gig of memory with 32 bit pointers because mallocs are aligned, and 32 gig is more than enough for the vast majority of current applications, and likely to remain so for a long time to come. Doubling your pointer size with lots of zeros is expensive, it clogs caches etc.

        • If you did not like chasing down weird memory corruption problems then you would not be using C (or C++) in the first place.

          Well, perhaps but OTOH many of us avoid malloc like the plague.

      • by jd ( 1658 )

        1. Calm down
        2. You're assuming GNU's method is the only method and thus the standard method
        3. Plenty of people staple together blocks to create virtual arrays. Some are called filing systems, some are called Linux memory managers, and there's one called GMP. It's the method underlying any potentially fragmented workspace if you don't want to keep copying. Because it's required in a lot of Linux, a standard, portable, form in a helper library would be nice. It might mean we can get rid of the umpteen queue a

    • by Uecker ( 1842596 )

      VLA are part of the standard and it is a myth that removing them it helps security as it removes price information about run-time bounds from the compiler's view. In my opinion not using VLA is a major step back for security. (Yes, I contributed to with this overall effort myself, but only where it were fake VLAs which really had a constant size but the compiler couldn't know this).

      For GNUisms in general, we will certainly try to standardize some of them (those which are useful, well-defined, and supported

      • by jd ( 1658 )

        So you're aware that GNU introduced features often way in advance of any standard and that the GNU syntax/semantics don't always match the ISO version.

        Let's see what ISO says about VLAs:

        C99 adds a new array type called a variable length array type. The inability to declare arrays whose size is known only at execution time was often cited as a primary deterrent to using C as a numerical computing language. Adoption of some standard notion of execution time arrays was considered crucial for C’s acc

        • by Uecker ( 1842596 )

          So you're aware that GNU introduced features often way in advance of any standard and that the GNU syntax/semantics don't always match the ISO version.

          Yes of course. In fact, I added myself a GNU extension. I am also participating in WG14.

          Let's see what ISO says about VLAs:

          C99 adds a new array type called a variable length array type. The inability to declare arrays whose size is known only at execution time was often cited as a primary deterrent to using C as a numerical computing language. Adoption of some standard notion of execution time arrays was considered crucial for C’s acceptance in the numerical computing world.

          Does this match your experience?

          Absolutely. I use C for numerical computing and VLAs a very important.

          Would discontiguous pools of contiguous memory, giving you the ability to make anything flexible size, be that much worse as that's what the compiler will be using anyway?

          I don't understand what you are trying to say. The VLA will live on the stack or the heap depending on where one allocates it. In both cases, there is no way to resize it. Making it resizable is much harder and no compiler does this as it would require a level of indirection which reduces performance and would require some kind of automatic memory man

    • by vbdasc ( 146051 )

      The first problem is that they can be dropped from future versions of GCC. They're not part of any standard, after all.

      IMHO, GCC rarely drops its proprietary extensions, once introduced and documented. Correct me if I'm wrong.

  • by HeckRuler ( 1369601 ) on Monday October 29, 2018 @04:44PM (#57558033)

    VLAs are an example of C becoming ever so slightly higher level. When the language does things under the hood without telling you it's just an invitation to bite you in the ass. Good purge.

    • by MobyDisk ( 75490 )

      What was it doing under the hood without telling you? Isn't a VLA basically just a call to alloca() [stackoverflow.com]?

      • by HeckRuler ( 1369601 ) on Monday October 29, 2018 @05:47PM (#57558469)

        Yes. Exactly that. It's allocating space for you. It figures out at run-time the length of your array rather than you having to do it by hand at compile-time. I didn't actually know of any security flaws this would lead to, but it stops debuggers from knowing details about calls so it obscured some information from me and pissed me off once.

      • by Anonymous Coward

        Calls to alloca() are explicit which makes them less hidden to human review. VLAs encourage writing code without putting more thought into it. It also encourages the use of variably length things when fixed length things make more sense. It also discourages thinking about when variably length may come into play and how to efficiently handle them.

        In general, all of this is bad things for code running at all times and with [near] unlimited power to do harm, especially when those properties are ripe for abu

  • I was thinking a different VLA [wikipedia.org] and what the f*ck that had to do with the Linux kernel.

  • See, adopting a code of conduct is already undermining the foundations of the kernel.

"The vast majority of successful major crimes against property are perpetrated by individuals abusing positions of trust." -- Lawrence Dalzell

Working...