1New in 2.8 2========== 3 4- ncc now will automatically strip nccout files (this will work if 5 Python is installed). Except from less space, in the previous 6 versions under certain circumstances the nccout files could grow 7 exponentially. 8 9- fixed a segfault in link mode without any .c or .o files provided 10 (just an .s file for example) 11 12- The temporary filename that is used to view functions with "vi" 13 (or your favorite highlighting editor), is now different depending 14 on the current function. So, 'vi' can store the current position 15 of the cursor for every function and that is more functional. 16 17- Robustified parsing of aggregate array initializers that caused 18 many problems with linux 2.6.27. Some assignments to pointers to 19 functions may be missed though. (help from Luiz Fernando Capitulino) 20 21- work around __builtin_types_compatible_p() that has a syntax with 22 type arguments confusing the parser. Same for __builtin_offsetof() 23 24- ncc now understands __inline__, __inline and __FUNCTION__ so no need 25 to fix them in nognu. 26 27New in 2.7 28========== 29 30- In the case where in a Makefile we had a target like: 31 gcc foo.c bar.c zoo.c -o program 32 using ncc instead of gcc would fail. Now this case is 33 handled correctly. If -ncgcc is specified gcc will be 34 executed as above. ncc instead will analyse each file 35 and then link the generated .nccout files to program.nccout. 36 (qemu) 37 38- Fixed leaving ncurses mode -> xterm -> re-enter ncurses in 39 nccnav. Patch by Sylvain Beucler. 40 41- New command line option -nccpp=<preprocessor>, useful for 42 using ncc in cross compilation, from Jose Vasconcellos 43 44New in 2.6 45========== 46 47- '-m*' flags are passed to the preprocessor. For example if 48 '-mmmx' is not used in preprocessing, the macro __MMX__ is not 49 declared and importing <mmintrin.h> will fail. (X11R71) 50 51- If nccnav is executed from the root of the source tree, it will 52 show relative file paths (good). 53 54- Updated instructions for kernel hacking. Some object files were 55 missed. 56 57- Fixed segfault with __gu_val. 58 59- Speed up linking nccout object files. 60 61- nccnav crashed if it couldn't open the temporary file. 62 63New in 2.5 64========== 65 66- The nccnav viewer can show functions and files with "vi", thus 67 with syntax coloring. This will happen if you press 'v' on a 68 function. 69 70- The nccnav viewer can start from the list of global variables 71 (by pressing 'g' in the initial screen). 72 73- nccar will understand the "r" option and replace members in 74 the archive instead of just appending the data. That's the 75 right thing because with the old version, linking archives 76 into bigger archives would result in geometric explosion of 77 the size of the files. 78 79- Better type propagation in conditional expressions. 80 (x ? (void*)0 : (struct A*)a)->x; 81 now works (gcc/LIM_DATA) 82 83- support for anonymous structures and unions (GNUC): 84 struct X { 85 union { 86 int a, b, c; 87 } 88 }; 89 void f (struct X *x) 90 { 91 x->a = 1; 92 } 93 (linux 2.17) 94 95- Fixes to hack linux 2.17: 96 - The "__typeof__ (function)" can be used to declare another function 97 - forward enum declarations 98 - char X[] = ("hello"); // was error 99 100- The expression in a Variable Length Array is not constant (and in fact 101 it can call functions). 102 int X [y = foo()]; // was error 103 104- Debian package and Doc fixes by Anuradha Weeraman. 105 106New in 2.4 107========== 108 109- Bugfix (segfault with gcc 4.x) from Florian Larysch. 110 111- More configury for 'alloca()' in dbstree. 112 113- new command line option '-ncnoerr'. When there are errors in 114 expressions, ncc will not terminate the compilations. Instead 115 it will link all functions that had errors with the special 116 pseudo-function "NCC:syntax_error()". 117 118New in 2.3 119========== 120 121- Bugfix (segfault with gcc 4.0) from Deepak Ravi. 122 123- a typedef name used as a label would cause a syntax error (JamVM) 124 125- Applying '*' on a function has no effect. (pygame) 126 void (*F)(); 127 (**F)(); // used to be error 128 129- Support for '_Complex' as a declaration specifier. 130 131New in 2.2 132========== 133 134- Included a LICENSE text in doc so ncc can be part of Debian. 135 136- Bugfix/crash in nccnav. Pressing the up-arrow in functions 137 mode caused a segmentation violation because isalpha(KEY_UP) 138 is true. 139 140- if the last statement of a compound statement in expression 141 was an __asm__ and that was the first expression of the program 142 we had a segfault. Thanks to Thomas Petazzoni. 143 144- Header file fixes for MacOS. (Adam Shostack) 145 146- __inline__ is accepted as 'inline'. gcc-3.4.4 broke things 147 again. 148 149- more pointer-to-function cases caught: 150 fptr = flag ? p->tp_call : 0; 151 now detects that calling fptr() may call p->tp_call() 152 (python) 153 154New in 2.1 155========== 156 157- ncc reports access of arrays. For example, in the code 158 int *X; 159 int foo () 160 { X [12] = 1; } 161 it will be reported that foo modifies 'X[]' and uses 'X'. 162 163- fix for cygwin. In cygwin read() converts \r\n to \n and for that 164 the bytes read are fewer than the size of the file as reported by 165 stat() and ncc thought there was an error. Thanks to Hakon Lovdal. 166 167- comlicated segfault in cygwin due to a small bug. (eu). 168 169- even better support for reporting use of members of structures. 170 For example, in: 171 struct X { int i, j }; 172 int foo () { 173 struct X x = { 1, }; 174 } 175 int bar () { 176 struct X x = { .y = 1 }; 177 } 178 int zoo () { 179 (struct X) { .x = 1, .y = 2 }; 180 } 181 it will be reported that foo modifies member 'x' and that bar 182 modifies member 'y' and that zoo modifies both. 183 184 185New in 2.0 186========== 187 188- linker emulation mode with the command line switch "-ncld". 189 In this mode ncc generates "nccout object files" as gcc generates 190 object files and then attempts to link them into bigger nccout 191 files just as gcc links object files. 192 193- binutils wrapper mode. ncc can be called as 'nccar', 'nccld', 194 'nccg++' and 'nccc++'. It will normally call the corresponding 195 program and then attempt to collect and link "nccout object files". 196 197- gengraph.py: a script that can produce dot data from ncc output. 198 Sent by Jose Vasconcellos 199 200- Many small fixes for linux-kernel 2.6.9. ncc is now more relaxed 201 about some cases in which it reported errors. We can assume that 202 ncc is used to analyse correct programs and worry not about semantic 203 checks. 204 The file hacking.LINUX-KERNEL has been updated with instructions 205 to make ncc working again. 206 207- Assigning non functions to pointers to functions would cause an error: 208 int (*F)(); 209 int x; 210 F = x; // error 211 F = (int(*)())x; // error too 212 (readline) 213 214- Casts would prevent reporting pointer to function variables passed 215 as arguments to other functions. For example: 216 int (*FN)(); 217 foo (FN); // reported ok 218 foo ((int(*)())FN); // missed 219 (elinks) 220 221- Local pointer to function variables are named after their function. 222 For example, in: 223 int foo() { int (*fn)()=f1; fn(); } 224 int bar() { int (*fn)()=f2; fn(); } 225 the 'fn' variables are reported as 'foo/fn()' and 'bar/fn()'. In the 226 previous version they were both reported as '*fn()' and one couldn't 227 tell that in reallity foo() calls f1() and bar() calls f2(). 228 229New in 1.9 230========== 231 232- the statement following switch() need not be compound (lwc). 233 234- nccnav will also display any comments preceeding functions when asked to 235 display the text of a function (struct too). They are supposed to be 236 essential in understanding what happens... 237 238- /usr/include/nognu macros handle the C99 keyword '_Bool'. 239 /use/include/nognu macros handle '__asm' to be treated syntactically like 240 '__asm__'. Same for __volatile as found in <mathinlines.h>. The crapness never ends. 241 ---Don't forget to Copy the new doc/nognu over the old one--- 242 243- Bugfix: 244 typedef int x; 245 int f () 246 { 247 int x; 248 x = 1; 249 } 250 didn't work as the line starting with 'x' was considered a declaration. 251 In other words, the Bugfix from version 1.7 broke more things than it 252 fixed! (discovered in python source). 253 254- Bugfix: 255 typedef int (*func)(); 256 int f () {} 257 int main () 258 { 259 func x, y; 260 x = f; // reported ok! 261 y = (func) f; // not reported. BUG 262 } 263 A cast would prevent ncc from reporting pointer to function assignments 264 as pseudo calls. (python source) 265 266New in 1.8 267========== 268 269- It is very useful to report whether a function *just reads* 270 or *modifies* a variable. ncc now reports such information 271 when it is certain that a variable *is* modified by a function. 272 Read 'README.1.8.rw' for info. 273 274- ncc can now handle the case: 275 (x ? F1 : F2) (args) 276 it used to report that just a "virtual call" is there. 277 Now such constructs are converted to: 278 x ? F1 (args) : F2 (args) 279 reported data is much better for hacking and less confusing 280 281 282New in 1.7 283========== 284 285- From Ben Lau <benlau@linux.org.hk> : 286 287 - A fix for gcc syntax where __asm__() can be specified in 288 a declaration before initialization. Fix for M68K kernel from uClinux 289 290 - Made ncc work with 2.6 kernel! There was a problem with declaration 291 initializers and was triggered in fs/afs/super.c (thanks!) 292 293 - More stuff with gcc-3.2 and preprocessing. Now we pass -O* options 294 to the preprocessor because it enables the definition of the 295 __OPTIMIZE__ macro, without which kernel can't be compiled. 296 297- nccnav can regenerate its input file without including dupes 298 (functions of header files reported multiple times). 299 300- More features with pointer to functions passed as arguments to 301 other functions. 302 303- Bugfix: 304 typedef int x; 305 struct foo { 306 x x; 307 x y; // error! 308 }; 309 Now fixed (linux kernel, fs/ntfs/inode.h) 310 311- In the case ncc is compiled with gcc, we define 'alloca' to be 312 '__builtin_alloca' and avoid lots of portability issues on non GNU 313 systems. 314 315New in 1.6 316========== 317 318- While "structure->member ()" was detected, "(*structure->member) ()" 319 was not. Now it is. (tkDvi) 320 321- A SIGPIPE would terminate nccnav if requested to view a very big 322 file which didn't fit in the buffer of "less" and the user pressed 'q'. 323 324- New way to view the call graph with pop-ups in nccnav. History mode 325 revised with '<' and '>'. 326 327- Analysis of function addresses passed as arguments to other functions. 328 For example, ncc can now report that qsort() calls whichever comp() function 329 is passed to it. See the file doc/farg.c for more. 330 331New in 1.5 332========== 333 334- The locations of structure declarations are emitted in the 335 output of ncc and nccnav can extract and display them 336 (extremely useful). 337 338- ncc now works on systems that don't have mmap. 339 340- Adapted to work with the kernel sources without having to 341 edit the weirdness found in ide-cd.h (__u8 short) and 342 parport_pc.c (multiple defininitions of function) 343 344- nccnav will indent the source if called with a name 345 other than "nccnav", like "nccnavi". 346 347- Created man page so ncc can be included in distributions. 348 349New in 1.4 350========== 351 352- nccnav now provides "The Recursion Detector". 353 354- ncc does no longer complain if something is declared as 355 just void. It seems this is perfectly valid (valgrind source) 356 357New in 1.3 358========== 359 360- This release includes some changes in the viewer nccnav: 361 It's possible to view the text of functions and entire files 362 with an external viewer. 363 This by default is "indent -kr -st | less". 364 365- Internal changes where the dbstrees were changed to templates 366 instead of polymorphic classes. 367 368New in 1.2 369========== 370 371- Bugfix. Negative floating point values in initializers would 372 cause a segmentation violation. 373 374- The preprocessed source may also include #pragma directives. 375 This should've caused some problems, sometimes. 376 377- In GNUC extensions, goto may be followed by an expression (tcctest). 378 379- `__alignof__' is now simply replaced by `sizeof'. 380 381- `__typeof__(type)' now supported 382 383- nccnav fixes: very long lines would appear on the next line (because 384 ncurses counts tab as one character). Also the request to display the 385 text of the last function of a file which does not end in a newline 386 would cause a segmentation violation. 387 388New in 1.1 389========== 390 391- Major Feature: ncc now does full analysis on the pointers to functions 392 and the values assignmed to them; The result is incredibly amazing when 393 working with projects like the linux kernel where there are lots of 394 callbacks in structure members. 395 See the file doc/fptr.c which demonstrates the new features. 396 Also now aggregate initalizers are parsed to catch function calls 397 and values assigned to pointer-to-function members. 398 Several internal changes/cleanups to implement the above features. 399 400- Patch to work correctly when in -I,-D the argument is in the next argv[] 401 (Awesome Walrus) 402 403- Anonymous structures are named by typedef or by first declared object. 404 405- Wide character and string constants L'x' (bash2 source) 406 407New in 1.0 408========== 409 410- Bugfix. The conditional with omitted operand caused segfault in the usage 411 report mode. 412 413- ISOC99 additions. Declarations can appear anywhere in a block (as in C++) 414 Hexadecimal floating point constants supported (problems with HUGE_VAL, 415 which is 0x1.0p2048 in glibc) 416 417- Declaration specifiers may be after storage class specifiers. 418 For example, "uint32 static X;" is now acceptable (quicktime source). 419 420- If "-nc00" is used together with "-nckey", string constants are included. 421 The option to leave out line numbers is removed. 422 423- Function prototypes are not checked anymore. There is a rare problem 424 (discovered in quake source) and since ncc is typically a source code 425 analyser, checking function prototypes is useless. 426 427New in 0.9 428========== 429 430- New output format and new viewer. Old formats REMOVED (check your options) 431 432- Reporting absolute pathnames of source files with "-ncfabs" 433 434- Many new things in /usr/include/nognu. __FUNCTION__ now defined as the 435 string literal "__FUNCTION__" because many people use the invalid syntax: 436 printf ("This is " __ FUNCTION__ "\n"); 437 438- Fixed critical bug discovered with gcc 3.2. Reallocation in expression 439 parser was broken. 440 441- GNUC variable size arrays pseudo-supported (no error). 442 443- labeled-statement= identifier:statement 444 and now "if(x)Label:foo();" is working properly (zsh source). 445 446- Misc fixes. Lots of testing (an entire CD of sources). 447 448New in 0.8 449========== 450 451- All fixes in this version were contributed/inspired by Scott McKellar. 452 Include: 453 - Removed comment parsing which was unused. 454 - Made file reporting "right" (off by one) 455 - Made line reporting "right" as well (off by one) 456 - inttree possible signedness bug fixed. 457 - Cleanups at introduce_{anon|named}_struct () 458 - Redundant. Lookup() was called twice in a row for members. 459 - Misc corrections, optimizations and cleanups everywhere. 460 461New in 0.7 462========== 463 464- Line number information finally included and can be optionally left out 465 with "-ncl0". Only used when reporting syntax errors for now. 466 467- Except from, -D, -I options, "-ixxx file" options should also be passed 468 to the preprocessor. 469 470- The source file was not unmapped after the lexical analysis, while it 471 should. Also as found by Scott McKellar string literals were allocated 472 twice. Now expect 50% less memory usage. 473 474- Implemented in-file user output with keys (see doc/KEYS) 475 476- Many "do it right" fixes from Scott McKellar. 477 478- Added -ncspp option to keep sourcefile.i preprocessed C files. 479 Extremely useful for debugging failures. 480 481- In the case of : 482 typedef struct { int x, y; } zoo; 483 if reporting use of members, the anonymous structure 484 is automatically named `struct zoo'. 485 486 487New in 0.6 488========== 489 490- In usage report mode, constant expressions (in array sizes and bitfield 491 sizes), were not calculated if they were not as simple as just a number. 492 So in: 493 extern int foo [32/2]; 494 int foo [16]; 495 It failed because of redefining foo as an array of different size. 496 This now fixed (thanks to Doom source code) 497 498- Type of the result of the last subexpression of a compound statement in 499 expression (GNUC), implemented. 500 501- More information about calling functions through pointers to functions. 502 If the pointer to function is a simple symbol variable, it is converted 503 to a pseudo-function, calling all the functions assigned to it. 504 Otherwise there is a report that a handler is called. 505 506- An __asm__ statement in global used to confuse ncc which reported (ABSENT 507 symbol). Now __asm__ statements in global are ignored (linux kernel source). 508 509- A function definition may also be a single __asm__ statement (not 510 compound). Parsed w/o error and ignored. (linux kernel) 511