Keywords: 自述, 文档, 出版,

2004 年 5 月 27 日更新

### Sun[tm] Studio 9：C 编译器自述文件

> #### 目录

> 1. 简介
> 2. 关于 Sun Studio 9：C 编译器
> 3. 新特性和更改的特性
> 4. 软件更正
> 5. 问题和解决办法
> 6. 限制和不兼容
> 7. 文档错误

> #### A. 简介

> 本文档包含 Sun[tm] Studio 9 C 编译器的相关信息。本文档描述了本发行版本的一些新功能，包括此发行版本作出的软件更正，并列出了已知的问题、限制和不兼容性。本文档中的信息优先于此发行版本各手册中的信息。

> 产品文档
> - Solaris 平台的发行说明：可以通过 Sun Studio 9 网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html 获得此发行说明。发行说明中的信息会更新和扩展所有自述文件中的信息。
> - Sun Studio 9 文档：产品手册页、自述文件的 HTML 版本以及手册可以从 `/installation_directory/SUNWspro/docs/index.html` 进行访问。缺省安装目录为 `/opt`。您可以从 index.html 页访问下列文档以及其他文档：
>   - C 用户指南
>   - C++ 用户指南
>   - 数学库自述文件
>   - 数值计算指南
>   - 增量式链接编辑器自述文件
>   - Sun 性能库自述文件
>   - Sun 性能库参考手册
>   - Fortran 和 C 的 Sun 性能库用户指南
> - 集成开发环境 (IDE) 文档：Sun Studio 9 IDE 所有组件的联机帮助可从 IDE 中的 [帮助] 菜单进行访问。
> - 开发人员资源门户：有关技术文章、代码样例、文档和知识库，请参见开发人员门户，网址：`http://developers.sun.com/prodtech/cc`。

> 要查看本自述的文本格式文件，请输入以下的命令：

> `cc -xhelp=readme`

> 如要查看本自述的 HTML 格式文件，请使用浏览器访问缺省安装目录：

>     file:/opt/SUNWspro/docs/index.html

> 注意—如果 Sun Studio 9 软件未安装在缺省 `/opt` 目录中，请询问系统管理员以获得系统中的等价路径。

> #### B. 关于 Sun Studio 9：C 编译器C 编译器

> 此发行版本的 C 编译器可用于 Solaris[tm] 操作环境 (SPARC(R); Platform Edition) 版本 8、9 和 10，以及 Solaris 操作环境 (x86 Platform Edition) 版本 8、9 和 10。

> 该编译器在早于 Solaris 10 的操作系统上支持以 ISO/IEC 9899:1999，编程语言 - C 指定的大多数语言功能。在 Solaris 10 上，如果您指定 `-xc99=all,lib`，该编译器就完全与 C99 标准兼容。该编译器还与 ISO/IEC 9899:1990，编程语言 - C 标准兼容。

> 该开发版本中的 64 位 SPARC 架构特性支持 C 国际标准和 `-xarch=v9`。

> #### C. 新特性和更改的特性

> 本节描述了 C 编译器的本发行版本的新功能和更改功能。

> - 通过为 `-xarch`、`-xcode`、`-xmemalign` 和 `-xprefetch` 选项提供新的缺省设置并通过为 -fast 和 `-O` 选项提供新的扩展功能，提高了性能。
> - 用于 Intel 体系结构的新的 `-xarch`、`-xtarget` 和 `-xchip` 标志以及新的 `-flteval` 选项。
> - 通过 `-xlibmopt`、`-xnolibmopt`、`-xipo_archive` 和 `-xprefetch_auto_type` 选项，改进了运行时性能。
> - 通过用 `-xpch` 自动生成的预编译头文件，提高了编译时性能。
> - 通过新的 `-xchip` 和 `-xtarget` 标志，扩展了 SPARC 支持。
> - 在 Solaris 10 上完全支持 1999 C ISO 功能，包括外部内联函数、指定初始化程序和通用字符名。
> - 通过 `lint` 公用程序执行新的安全性检查。
> 新的 `-xarch` 缺省值：v8plus

> 现在，C 编译器为缺省体系结构生成的代码是 v8plus (UltraSPARC)。在将来的版本中将丢弃对 v7 的支持。

> 新的缺省值几乎可以为当前使用的所有机器提供更高的运行时性能。然而，对于计划在预装 UltraSPARC 计算机上部署的应用程序，缺省情况下将不在这些计算机上执行。使用 `-xarch=v8` 进行编译，以确保应用程序在这些计算机上执行。

> 如果您想在 v8 系统上进行部署，则必须在每个编译器命令行以及任何链接时命令中明确指定选项 `-xarch=v8`。提供的系统库在 v8 体系结构上运行。

> 如果您想在 v7 系统上进行部署，则必须在每个编译器命令行以及任何链接时命令中明确指定选项 `-xarch=v7`。提供的系统库使用 v8 指令集。对于 Sun Studio 9 发行版，v7 唯一支持的操作系统是 Solaris 8 发行版。遇到 v8 指令时，Solaris 8 操作系统解释软件中的指令。程序运行，但是性能并不下降。

> 对于 x86，`-xarch` 缺省设置为 `generic`。请注意，x86 上的 `-fast` 扩展至 `-xarch=native`。

> 有关 `-xarch` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-xcode` 缺省值

> (SPARC) V9 上的缺省值为 `-xcode=abs44`。V8 上的缺省值还是 `-xcode=abs32`。

> 有关 `-xcode` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-xmemalign` 缺省值

> (SPARC) 对于所有的 v8 体系结构，`-xmemalign` 的缺省值为 `-xmemalign=8i`。所有 v9 体系结构的缺省值为 `-xmemalign=8s`。

> 有关 `-xmemalign` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-xprefetch` 缺省值

> (SPARC) 现在，`-xprefetch` 的缺省值是 `-xprefetch=auto,explicit`。此更改将对本质上为非线性内存访问模式造成不利影响。要禁用更改功能，请指定 `-xprefetch=no%auto,no%explicit`。

> 有关 `-xprefetch` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-fast` 扩展

> 现在，`-fast` 选项在其扩展中包括新的选项 `-xlibmopt`。

> 新的 `-O` 扩展

> （SPARC 和 x86）`-O` 宏现已扩展至 `-xO3`，而不是 `-xO2`。

> 缺省情况下，更改将带来更高的运行时性能。但是，`-x03` 可能并不适合那些所有变量均被自动认为是 volatile 的程序。可能具有此假设的典型程序是实现其同步基元的设备驱动程序和较旧的多线程应用程序。其解决办法是使用 `-xO2` 而不是 `-O` 进行编译。

> 有关 `-O` 的更多信息，请参见 C 手册页 `cc`(1)。

> 为 Intel 体系结构提供新的 `-xarch`、`-xtarget` 和 `-xchip` 标志。

> C 编译器支持在 Intel 系统上使用新的 `-xarch`、`-xtarget` 和 `-xchip` 标志。这些新标志针对 Intel 平台上的 `sse` 和 `sse2` 指令进行了专门设计，以充分利用 Pentium 3 及 Pentium 4 芯片与 Solaris 软件支持相结合的优势。下面介绍了这些新标志：

> - `-xchip=pentium3` 为 Pentium 3 类型的处理器进行了优化
> - `-xchip=pentium4` 为 Pentium 4 类型的处理器进行了优化
> - `-xtarget=pentium3` 设置 `-xarch=sse`、`-xchip=pentium3` 和 `-xcache=16/32/4:256/32/4`
> - `-xtarget=pentium4` 设置 `-xarch=sse2`、`-xchip=pentium4` 和 `-xcache=8/64/4:256/128/8`
> - `-xarch=sse` 将 SSE 指令集添加到 `pentium_pro` 指令集体系结构中。
> - `-xarch=sse2` 向那些 SSE 允许的指令集添加 SSE2 指令集

>   特别注意
>   用 `-xarch=`{`sse` | `sse2`} 编译以便在 Solaris x86 SSE/SSE2 Pentium 4 兼容平台上运行的程序必须只在启用 SSE/SSE2 平台上运行。在未启用 SSE/SSE2 的平台上运行这种程序可能会导致段故障或者不发出明确警告信息就产生错误结果。操作系统和编译器的补丁程序可防止 SSE/SSE2 编译的二进制程序在未启用 SSE/SSE2 的平台上执行，这些补丁程序可能会在晚些时候提供。

>   以 Solaris 9 update 6 开头的操作系统版本在 Pentium 4 兼容平台上启用 SSE/SSE2。Solaris OS 的早期版本未启用 SSE/SSE2。

>   该警告还扩展到利用 `.il` 联机汇编语言功能程序或利用 SSE/SSE2 指令的 `__asm()` 汇编程序代码。

>   如果您在各个独立的步骤中进行编译和链接，则要始终使用编译器并通过 `-xarch=`{`sse` | `sse2`} 进行链接，以确保链接正确的启动例程。

> 遵照下列准则，您可以确定新的 `-xarch`、`-xchip` 和 `-xtarget` 标志的哪个组合符合您的需要：

> - 是否在运行 Solaris 9 update 5 或更低版本的 Pentium 3 或 Pentium 4 计算机上进行构建，并且是否指定了 `-fast`、`-xarch=native` 或 `-xtarget=native`？

>   如果是这样，编译器将进行下列扩展：

>   - `-xarch` 设置为 `pentium_pro`（而不是您期望的 `pentium3` 或 `pentium4`），因为 Solaris 9 update 5 或更低版本的操作系统不支持 `sse` 和 `sse2` 指令。

>     注意： 即使使用这些版本的 Solaris 软件，也可以指定 `-xarch=sse` 或 `-xarch=sse2`，但必须在运行 Solaris 9 update 6 或更高版本的计算机上运行相应版本提供的可执行文件，因为这些版本的 Solaris 软件支持 SSE 和 SSE2 指令。

>   - 根据需要，将 `-xchip` 设置为 `pentium3` 或 `pentium4`。

>   - `-xcache` 设置为 16/32/4:256/32/4（对于 Pentium 3 处理器）或 8/64/4:256/128/8（对于 Pentium 4 处理器）。

> - 是否在运行 Solaris 9 update 6 或更高版本的 Pentium 3 或 Pentium 4 计算机上进行构建，并且是否指定了 `-fast`、`-xarch=native` 或 `-xtarget=native`？

>   如果是这样，编译器将进行下列扩展：

>   - `-xarch` 设置为 `sse`（对于 Pentium 3）或 `sse2`（对于 Pentium 4）。
>   - 根据需要，将 `-xchip` 设置为 `pentium3` 或 `pentium4`。
>   - `-xcache` 设置为 `16/32/4:256/32/4`（对于 Pentium 3）或 `8/64/4:256/128/8`（对于 Pentium 4）。

> 有关 `-xarch`、`-xtarget` 和 `-xchip` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-xlibmopt` 和 `-xnolibmopt` 选项

> `-xlibmopt` 选项使编译器能够使用优化的数学例程库。在指定该选项时，必须通过指定 `-fround=nearest` 来使用缺省的舍入模式。数学例程库对性能进行了优化，通常可以生成更快的代码。其结果可能与普通的数学库得出的结果稍有不同。如果确实如此，其不同之处通常表现在最后一位上。

> 通过在命令行上指定新的 `-xnolibmopt` 选项，可以显式关闭此库。

> 有关 `-xlibmopt` 和 `-xnolibmopt` 的更多信息，请参见 C 手册页 `cc`(1)。

> 新的 `-xipo_archive` 选项

> 编译器使用新的 `-xipo_archive` 选项可以优化传递给链接程序的对象文件、使用 `-xipo` 编译的对象文件以及在生成可执行文件之前驻留在归档库 (.a) 中的对象文件。库中包含的任何对象文件在编译过程中进行优化后都会被其优化的版本替换。

> 有关 `-xipo_archive` 选项的更多信息，请参见 `cc`(1) 手册页。

> 新的 `-xprefetch_auto_type` 选项

> 使用新的 `-xprefetch_auto_type` 选项能够以与生成直接内存访问预取相同的方式，为选项 `-xprefetch_level=[1|2|3]` 指示的循环生成间接预取。

> 诸如 `-xdepend`、`-xrestrict` 和 `-xalias_level` 等选项可以改进 `-xprefetch_auto_type` 的优化特性。它们将影响计算间接预取侯选对象的激进度，从而将影响自动间接预取插入的激进度，因为它们有助于生成更准确的内存别名二义性信息。

> 有关 `-xprefetch_auto_type` 选项的更多信息，请参见 `cc`(1) 手册页。

> 使用 `-xpch` 自动生成的预编译头文件

> 此版本的 C 编译器扩展了预编译头文件功能，以包括在编译器中生成预编译头文件的自动功能。您也可以选择手动生成预编译头文件，但是，如果您对编译器的新功能感兴趣的话，请参见 `cc`(1) 手册页中 `-xpch` 选项的扩展功能，以了解更多信息。另请参见 `CCadmin`(1) 手册页。

> 通过新的 `-xchip` 和 `-xtarget` 标志扩展了 SPARC 支持。

> (SPARC) 现在，`-xchip` 和 `-xtarget` 选项支持 `ultra3i` 和 `ultra4` 作为其值，因此您可以构建为 UltraSPARC IIIi 和 UltraSPARC IV 处理器进行了优化的应用程序。

> 支持外部内联函数

> 按照 1999 C ISO 标准的规定，现在可以使用内联函数定义和外部内联函数。

> 内联函数定义是使用关键字 `inline`（而不是关键字 `static` 或 `extern`）定义的函数，并且源文件（或包含的文件）中出现的所有原型也包含关键字 `inline`，而不包含关键字 `static` 或 `extern`。

> 内联函数定义没有为函数提供外部定义。在调用点对函数定义进行内联或对外部定义函数的引用将满足包含内联定义的源文件中出现的任何函数调用。

> 如果已指定了 `-xO3` 或更高级别，则编译器将仅内联对内联定义的调用，并且编译器优化程序认为这样做非常有利。否则将调用外部函数。因此，包含内联定义的任何程序均应与包含外部函数定义的对象文件链接在一起。

> 将关键字 `extern` 和 `inline` 同时与函数定义一起使用（或在继续进行函数定义的文件中的任何原型上使用）将导致在该对象文件中定义外部函数。兼容与包含多个外部内联函数定义的对象相链接的 C++ 将导致链接程序仅选择其中一个函数来满足任何外部引用。

> 要获得符合标准的行为，必须使用当前的编译器对旧代码进行编译。但是，如果在原有的 C and C++ 二进制文件（C/C++ 5.6 之前）中有`外部内联`函数定义，并且您希望将这些二进制文件与新的 C 和 C++ 二进制文件链接且不更改原有二进制文件的行为，请指定 `-features=no%extinl`。

> 有关 `-features` 的更多信息，请参见 C 手册页 `cc`(1)。

> 指定的初始化程序

> 指定的初始化程序为初始化稀疏数组提供了一种机制，这种数组在实际数值编程中很常见。

> 指定的初始化程序可以初始化稀疏结构（在系统编程中很常见），并且可以通过任何成员来初始化联合，而不管该成员是否为第一个成员。

> 请看下面的这些示例。第一个示例说明了如何使用指定的初始化程序来初始化数组：

>     enum { first, second, third };
>     const char *nm[] = {
>     [third] = "third member",
>     [first] = "first member",
>     [second] = "second member",
>         };

> 这个示例说明了如何使用指定的初始化程序来初始化结构对象的字段：

>     division_t result = { .quot = 2, .rem = -1 };

> 这个示例说明了如何使用指定的初始化程序来初始化在其他方面可能会被误解的复杂结构：

>     struct { int z[3], count; } w[] = { [0].z = {1}, [1].z[0] = 2 };

> 通过使用单个指示器，可以从两端创建数组。

>     int z[MAX] = {1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0};

> 如果 `MAX` 大于 10，则数组将在中间包含取值为零的元素；如果 `MAX` 小于 10，则前五个初始化程序提供的某些值将被随后五个初始化程序提供的值覆盖。

> 联合的任何成员均可初始化：

>     union { /* ...*/ } u = { .any_member = 42 };

> 通用字符名 (UCN)

> UCN 允许在 C 源代码中使用任何字符，而不仅限于英文字符。UCN 采用以下格式：

> - \u 4_hex_digits_value
> - \U 8_hex_digits_value

> UCN 不得指定小于 00A0 的值（0024 ($)、0040 (@) 或 0060 (?) 除外），也不得指定相容范围为 D800 到 DFFF 之间的值。

> UCN 可以用于标识符、字符常量和字符串文字中，以指定 C 基本字符集中不包含的字符。

> UCN \Unnnnnnnn 指定了其八位短标识符（按照 ISO/IEC 10646 的规定）为 nnnnnnnn 的字符。同样，通用字符名 \unnnn 指定了其四位短标识符为 nnnn（其八位短标识符为 0000nnnn）的字符。

> 新的 `-flteval` 选项

> (Intel) 使用该选项可以控制如何评估浮点表达式。

> 关于 `-flteval` 选项的更多信息，请参见 `cc`(1) 手册页。

> 通过 `lint` 执行新的安全性检查

> This release of the `lint` utility features a new security-checking facility.在编译之前使用新增的 `-errsecurity` 选项可以检查代码的安全能力。

> `-errsecurity[={core, standard, extended, %none}]`

> `lint -errsecurity=core`这一级别将检查几乎总是处于不安全状态或难以验证的源代码结构。此级别的检查包括：

> - 将变量格式字符串与 `printf()` 和 `scanf()` 函数系列一起使用
> - 在 `scanf()` 函数中使用未绑定的字符串 (%s) 格式
> - 将函数用于不安全的目的：`gets()`、`cftime()`、`ascftime()`、`creat()`
> - `open()` 与 `O_CREAT` 的使用不正确

> 将在该级别生成警告信息的源代码视为错误。对可疑的源代码应进行更改。在所有情况下，均可直接采用更安全的可选方案。

> `lint -errsecurity=standard`这一级别包括`核心`级别的所有检查以及对可能安全但还有更好的可选方案的结构进行的检查。在检查新写入的代码时建议采用这一级别。此级别的额外检查包括：

> - 使用除 `strlcpy()` 之外的其他字符串复制函数
> - 使用弱随机数函数
> - 使用不安全的函数来生成临时文件
> - 使用 `fopen()` 来创建文件
> - 使用调用 shell 的函数

> 将在该级别产生警告信息的源代码替换为新的或显著修改的代码。在原有的代码中纠正这些警告时应权衡应用程序不稳定所存在的风险。

> `lint -errsecurity=extended`这一级别包含一套最完整的检查，包括来自核心级别和标准级别的一切。此外还会生成许多有关在某些情况下可能不安全的结构的警告。作为查看代码的辅助方法，但不必用作可接受源代码必须符合的标准，这一级别的检查非常有用。此级别的额外检查包括：

> - 在循环内调用 `getc()` 或 `fgetc()`
> - 使用易导致路径名竞争情况的函数
> - 使用 `exec()` 函数系列
> - `stat()` 与其他函数之间的竞争情况

> 检查在该级别产生警告信息的源代码以确定是否存在潜在的安全问题。

> 如果未指定 `-errsecurity` 的设置，则编译器会将其设置为 `-errsecury=%none`。如果未指定 `-errsecurity`，但它并非参数，则编译器会将其设置为 `-errsecurity=standard`。

> #### D. 软件更正

> 目前没有新的信息。

> #### E. 问题和解决办法

> 本节讨论了已知的软件问题及其可能的解决方法。关于更新和补丁程序，请查看更新信息，网址为 `http://developers.sun.com/prodtech/cc/support_index.html`。

> - 5044272 `-flteval=2` 在简单的代码序列上导致 `SIGSEGV`

>   编译器生成错误的转换，即从 `ldouble` 到 `double`。下面的测试演示了此问题：

>       % cat t.c
>       #pragma STDC L_FENV_ACCESS ON
>       #pragma STDC FP_CONTRACT OFF

>       int NumFail = 0;
>       int NumPass = 0;

>       int main(void)
>       {
>       double d = 5.;
>       auto double d3_aut = 3;

>       d3_aut = 3;
>       if (d == (d3_aut += 2.L)) {
>       NumPass++;
>       } else {
>       NumFail++;
>               }

>       return (NumFail);
>       }
>       % cc t.c -flteval=2
>       % ./a.out
>       % echo $status
>       1

> - 5044281 错误代码是针对 `-flteval=2` 模式中极为简单的结构生成的

>       % more t.c
>       #include <stdio.h>

>       static const float f_one = 1.f;
>       static const float f_zero = 0.f;
>       int main(void) {
>               int NumFail = 0, NumPass = 0;

>       if ((f_zero ? f_one :f_zero) == f_zero) {
>                       NumPass++;
>       } else {
>                       NumFail++;
>               }
>       return (NumFail);
>       }
>       % cc t.c -flteval=2
>       % ./a.out
>       % echo $status
>       1

> - 5044322 bad code generated with `-flteval=2` for:int f[1]();

>       ynh% cat t.c
>       int NumFail = 0uL;
>       int NumPass = 0uL;
>       long double ld;
>       float f;

>       int main () {
>               f = 0x1p-23f / 2.f;
>       ld = f += 1.f;
>       if (ld == 1.L) {
>                       NumPass++;
>       } else {
>                       NumFail++;
>               }

>       return (NumFail);
>       }
>       ynh% /set/mercury/dist/intel-S2/bin/cc t.c -flteval=2
>       ynh% ./a.out
>       ynh% echo $status
>       1
>       ynh%

> #### F. 限制和不兼容

> 本节讨论系统或其他软件的限制和不兼容。有关该发行版本 Sun ONE Studio 9 的最新信息，请参见《Sun Studio 9 发行说明》。发行说明可在 Sun Studio 9 网站上找到，网址是：http://developers.sun.com/prodtech/cc/ss9/reference/docs/releasenotes.pdf。

> 在打印本文档时，尚未发现新信息。

> #### G. 文档错误

> 目前没有新的信息。

> 版权所有 © 2004 Sun Microsystems, Inc. 保留所有权利。必须依据许可证条款使用。