Links for 27-Nov
Think Big -- Are we sweating the petty stuff too much?
Sequentially -- Temporal and frequency adverbs for JavaScript.
Samurai - Protecting Critical Data in Unsafe Languages
Diary, commentary, reviews, snippets to preserve on-line
Think Big -- Are we sweating the petty stuff too much?
Sequentially -- Temporal and frequency adverbs for JavaScript.
Samurai - Protecting Critical Data in Unsafe Languages
Why does the bad code I see never have anything as beautiful as really evil 'C'?
Free programming tips that are worth every penny.
Design is inevitable. But mind your metaphors while doing so.
So, what happens when we compile this code "-Wall"?
Not the answer you'd expect --
$ gcc -Wall test.c $ ./a.exe Whoops! $
However, there are quite a few warnings in the gcc documentation that are marked as not being controlled by -Wall -- so let's turn on a bunch of them:
$ gcc -Wall -W -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Werror -ansi test.c test.c: In function `main': test.c:8: warning: comparison between signed and unsigned test.c: At top level: test.c:3: warning: unused parameter 'argc' test.c:3: warning: unused parameter 'argv'
Ah! That's better.
By contrast
C:\temp\unsign>cl test.c /W2 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj C:\temp\unsign>cl test.c /W3 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c test.c(8) : warning C4018: '<' : signed/unsigned mismatch Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj C:\temp\unsign>cl test.c /W4 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c test.c(8) : warning C4018: '<' : signed/unsigned mismatch test.c(3) : warning C4100: 'argv' : unreferenced formal parameter test.c(3) : warning C4100: 'argc' : unreferenced formal parameter Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj
The Microsoft compiler takes the unsigned comparison as a level 3 warning, and that's what you get by default from DevStudio, with the unused argument warning at level 4.
So what's going on here?
Well in the comparison, the unsigned int is a "larger" type so a is promoted; but unsigned int is not actually any larger in terms of bits, so the bit value is preserved, and so a is interpreted as 2^32-1. Which is slightly larger than 1.
For static analysis of Java, the PMD tool (http://pmd.sourceforge.net/) can provide lint-like (or FxCop-like, depending on your exposure to these things) coverage of your source, with a configurable rule-set. It can generate its reports as part of an Ant build, and be integrated live into most Java IDEs to give live reports.
Like most of these tools, you will curse the first time you expose legacy code to it, and aim to clear the reports. In code that has to also play nice with .Net, you'll have to switch off two rules MethodNamingConventions and LongVariable; and some of its rules e.g. about empty default constructors cannot always be all consistently applied (so may need case-by-case suppression).
To go along with the use of JUnit test, Cobertura (http://cobertura.sourceforge.net/) is a coverage tool that works by instrumenting the Java bytecode of the generated classes. It provides Ant tasks (and thus can be manually inserted into any Ant based build system, such as NetBeans projects) -- instrument the normal output in a post-compile step, and run JUnit against the instrumented code.
This tool gives you line and branch coverage reports like this sample -- all the way down from package-level summaries to line-by line indications.
While most of this post is about Java, I might as well add to the pot a 'C'-based tool, Splint, which, as the name suggests, is an uprated lint-style tool, which includes in its analysis some basic probing for code that might be vulnerable to buffer overrun -- at least in cases when a buffer is passed into a routine without any length, and then gets written to.
I've not managed to track down any good free tools for C++ -- Microsoft's Prefast (at least as of 2 years ago) balked when fed code containing STL headers; other tools are 'C' only, or pay-ware. Given the syntactic complexity of C++, this is not so surprising.
Back in the spring I categorised this as low key cyberpunk weirdness on the strength of the first disk (eps 1-4). The later disks turn the weidness up to 11.
It seemed to me that as the story went on there was a bit of casting around for what the underlying plot might be. After Layer 06 (Kids), I thought I had it figured out - Lain was an aftereffect of the Kensington experiment, coalesced out of that explosive release of psychic energy (This would be true if I ever write Serial Experiments Evangelion, with Sub-Commander Hodgeson up there on the bridge with Gendou). But then a couple of episodes later, we get into more familiar Roswell/MJ-12 territory, coming right up to date by tying IPv7 into the brew, before disappearing into the metaphysics associated with uploads, and ending with more questions than answers.
Despite that, I thought it excellent, thoughtful, and that it came to an end that supplied a fitting closure.
Also, a honourable mention for the real 'C' code in the lesson in the early episodes - even if the coding style is a little bit clumsy. I don't think there are any other titles that go even that far.
Previous instalments at Life before Blogging.
Forum Administrator : EvaGeeks.org — An Evangelion Fan Community
Copyright © Steve Gilham, 2003-2013
This work is licensed under a Creative Commons License.
Code snippets released under the WTFPL