http://www.dmst.aueb.gr/dds/pubs/jrnl/2010-SCP-CScout/html/cscout.html This is an HTML rendering of a working paper draft that led to a publication. The publication should always be cited in preference to this draft using the following reference:
Citation(s): 8 (selected). This document is also available in PDF format. The document's metadata is available in BibTeX format. Find the publication on Google Scholar This material is presented to ensure timely dissemination of scholarly and technical work. Copyright and all rights therein are retained by authors or by other copyright holders. All persons copying this information are expected to adhere to the terms and constraints invoked by each author's copyright. In most cases, these works may not be reposted without the explicit permission of the copyright holder. |
CScout | Xrefactory | Proteus | CDT | Refactor! | |
Number of supported refactorings | 4 | 11 | ∞ | 5 | 150 |
Handle C namespaces | √ | √ | √ | √ | √ |
Rename preprocessor identifiers | √ | √ | × | √ | √ |
Handle scopes introduced by the C preprocessor | √ | √ | × | × | × |
Handle identifiers created by the C preprocessor | √ | × | × | × | × |
C++ support | × | √ | √ | √ | √ |
Yacc support | √ | × | × | × | × |
User environment | Web | Emacs | - | Eclipse | Visual Studio |
Reference | [59] | [60] | [42] | [9] |
Pragma | Action |
echo string | Display the string on CScout's standard output when the directive is processed. |
ro_prefix string | Add string to the list of filename prefixes that mark read-only files. This is a global setting used for bifurcating the source code into the system's (read-only) files and the application's (writable) files. |
project string | Set the name of the current project (linkage unit) to string. All identifiers and files processed from then on will be set to belong to the given project. |
block_enter | Enter a nested scope block. Two blocks are supported, the first block_enter will enter the project scope (linkage unit); the second encountered nested block_enter will enter the file scope (compilation unit). |
block_exit | Exit a nested scope block. The number of block_enter pragmasshould match the number of block_exit pragmas and there should never be more than two block_enter pragmas in effect. |
process string | Analyze (CScout's equivalent to compiling) the C source file named string. |
pushd string | Set the current directory to string, saving the previous current directory in a stack. From that point onward, all relative file accesses will search the specified file from the given directory. |
popd | Restore the current directory to the one in effect before a previously pushed directory. The number of pushd pragmas should match the number of popd pragmas. |
includepath string | Add string to the list of directories used for searching included files (the include path). |
clear_include | Clear the include path, allowing the specification of a new one from scrarch. |
clear_defines | Clear all defined macros allowing the specification of new ones from scrarch. Should normally be executed before processing a new file. Note that macros can be defined in the processing script using the normal #define C preprocessor directive. |
http://localhost:8081/fgraph.txt?gtype=Cto obtain the compile-time dependencies between a project's files. Furthermore, as all web pages that CScout generates are identified by a unique URL, programmers can easily mark important pages (such as a particular identifier that must be refactored, or the result of a specialized form-based query) using their web browser's bookmarking mechanism, or even email an interesting page's URL to a coworker. In fact, many links appearing on CScout's main web page are simply canned hyperlinks to the general queries we previously outlined.
+---------+-------+ | name | nfile | +---------+-------+ | NULL | 3292 | | u | 2560 | | printk | 1922 | | ... | ... |
awk | Apache | Free BSD | Linux | Solaris | WRK | Postgre SQL | GDB | |
httpd | kernel | kernel | kernel | |||||
Overview | ||||||||
Configurations | 1 | 1 | 3 | 1 | 3 | 2 | 1 | 1 |
Modules (linkage units) | 1 | 3 | 1,224 | 1,563 | 561 | 3 | 92 | 4 |
Files | 14 | 96 | 4,479 | 8,372 | 3,851 | 653 | 426 | 564 |
Lines (thousands) | 6.6 | 59.9 | 2,599 | 4,150 | 3,000 | 829 | 578 | 363 |
Identifiers (thousands) | 10.5 | 52.6 | 1,110 | 1,411 | 571 | 127 | 32 | 60 |
Defined functions | 170 | 937 | 38,371 | 86,245 | 39,966 | 4,820 | 1,929 | 7,084 |
Defined macros | 185 | 1,129 | 727,410 | 703,940 | 136,953 | 31,908 | 4,272 | 6,060 |
Preprocessor directives | 376 | 6,641 | 415,710 | 262,004 | 173,570 | 35,246 | 13,236 | 20,101 |
C statements (thousands) | 4.3 | 17.7 | 948 | 1,772 | 1,042 | 192 | 70 | 129 |
Refactoring opportunities | ||||||||
Unused file-scoped identifiers | 20 | 15 | 8,853 | 18,175 | 4,349 | 3,893 | 2,149 | 2,275 |
Unused project-scoped identifiers | 8 | 8 | 1,403 | 1,767 | 4,459 | 2,628 | 2,537 | 939 |
Unused macros | 4 | 412 | 649,825 | 602,723 | 75,433 | 25,948 | 1,763 | 2,542 |
Variables that could be made static | 47 | 4 | 1,185 | 470 | 3,460 | 1,188 | 29 | 148 |
Functions that could be made static | 10 | 4 | 1,971 | 1,996 | 5,152 | 3,294 | 133 | 69 |
Performance | ||||||||
CPU time | 0.81" | 35" | 3h 43'40" | 7h 26'35" | 1h 18'54" | 58'53" | 3'55" | 11'13" |
Lines / s | 8,148 | 1,711 | 194 | 155 | 634 | 235 | 2,460 | 539 |
Required memory ( MB) | 21 | 71 | 3,707 | 4,807 | 1,827 | 582 | 463 | 376 |
Bytes / line | 3,336 | 1,243 | 1,496 | 1,215 | 639 | 736 | 840 | 1,086 |
Item | Description |
Computer | Custom-made 4U rack-mounted server |
CPU | 4 × Dual-Core Opteron |
CPU clock speed | 2.4 GHz |
L2 cache | 1024k B (per CPU) |
RAM | 16 GB 400 MHz DDR2 SDRAM |
System Disks | 2 × 36 GB, SATA II, 8 MB cache, 10k RPM, software RAID-1 (mirroring) |
Storage Disks | 8 × 500 GB, SATA II, 16 MB cache, 7.2k RPM, hardware RAID-10 (4-stripped mirrors) |
Database Disks | 4 × 300 GB, SATA II, 16 MB cache, 10k RPM, hardware RAID-10 (2-stripped mirrors) |
RAID Controller | 3ware 9550sx, 12 SATA II ports, 226 MB cache |
Operating system | Debian 5.0 stable running the 2.6.26-1-amd64 Linux kernel |