LOC is a particularly bad metric, because it raises the question of what is a line of code. Do you include whitespace and comments? Compiler directives? Preprocessor definitions? How about lines containing only braces? Do you include makefiles or whatever scripts do the building? And in the end, does the number of LOC truly relate to the complexity of the code? This white paper provides a summary of many of the issues around this question, of which I've quoted a few above.
Also consider that some languages lend themselves to shorter code than others, whether due to the common C style convention of parentheses on separate lines, the standard language library providing additional features by default, or the language itself including features which in other languages are handled by library functions. This is the core of work by Halstead amongst others. This comparison between Perl and VB.net is one example. This comparison across multiple languages demonstrates what the author calls the "expressiveness" of languages, where bugfixes in more "expressive" languages such as Python appear to need fewer LOC changes on average than languages such as C.
Where it most spectacularly runs into trouble though is when you consider how much is now under software control - and what that software might be. The satnav is one separate module; the email/phone/data interface is another module; the radio is a third module; the dash is a fourth module; aircon is a fifth module; and there's often a central display which coordinates them all. And that's just for the dashboard. This EENews article estimates over 50 electronic control units in a modern car.
Back when I worked on a Ford email/text/data interface, we were using WinCE. I wouldn't be at all surprised to find that they now have Linux and/or Android in there today. And some modules will roll their own OS, if they're running on a tiny microcontroller which doesn't warrant anything else, or if they are safety-related and require a greater level of scrutiny. The LOC for WinCE appears to be unknown, but WinNT had around 10 million and WinXP was up to 40 million. It seems reasonable to assume WinCE is of the same order of magnitude. The Linux kernel itself (as maintained by Linus) is now over 20 million LOC. If you multiply that by the number of devices in the car which might use these OSes (and that actually could be reasonable if they're all using different versions of OSes) then you're easily into the hundreds of millions.
If you only count LOC in C/C++ written by the car manufacturer, it's almost certainly a lot lower. But then the same logic would give the paradox of an Android phone which might have no unique LOC for a manufacturer, even though all manner of stuff has been tweaked in the build. You can't realistically say "this phone has zero LOC" just because it's all built from off-the-shelf libraries; but equally the total LOC in the OS and libraries does not reflect the engineering effort required by a manufacturer.
NaN
'cause why not?).