JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

5.1 介绍基于类型的分析

5.2 使用 Pragma 以便更好地控制

5.2.1 #pragma alias_level level (list)

5.2.1.1 #pragma alias (type, type [, type]...)

5.2.1.2 #pragma alias (pointer, pointer [, pointer] ...)

5.2.1.3 #pragma may_point_to (pointer, variable [, variable] ...)

5.2.1.4 #pragma noalias (type, type [, type]...)

5.2.1.5 #pragma noalias (pointer, pointer [, pointer] ...)

5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] ...)

5.2.1.7 #pragma ivdep

5.3 使用 lint 检查

5.3.1 标量指针向结构指针的强制类型转换

5.3.2 空指针向结构指针的强制类型转换

5.3.3 结构字段向结构指针的强制类型转换

5.3.4 要求显式别名

5.4 内存引用约束的示例

5.4.1 示例:别名级别

5.4.2 示例:使用不同的别名级别编译

5.4.3 示例:内部指针

5.4.4 示例:结构字段

5.4.5 示例:联合

5.4.6 示例:结构的结构

5.4.7 示例:使用 Pragma

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO C 之间的差异

索引

5.3 使用 lint 检查

lint 程序识别与编译器的 -xalias_level 命令同级别的基于类型的别名歧义消除。lint 程序还识别与本章中说明的基于类型的别名歧义消除相关的 pragma。有关 lint -Xalias_level 命令的详细说明,请参见4.3.38 -Xalias_level[=l ]

lint 检测并生成警告的四种情况包括:

5.3.1 标量指针向结构指针的强制类型转换

在以下示例中,整型指针 p 强制转换为 struct foo 类型的指针。如果 lint -Xalias_level=weak(或更高),此示例将生成错误。

struct foo {
    int a;
    int b;
  };

struct foo *f;
int *p;

void main()
{
    f = (struct foo *)p; /* struct pointer cast of scalar pointer error */
}

5.3.2 空指针向结构指针的强制类型转换

在以下示例中,空指针 vp 强制转换为结构指针。如果 lint -Xalias_level=weak(或更高),此示例将生成警告。

struct foo {
    int a;
    int b;
  };

struct foo *f;
void *vp;

void main()
{
    f = (struct foo *)vp; /* struct pointer cast of void pointer warning */
}

5.3.3 结构字段向结构指针的强制类型转换

在下面的示例中,结构成员 foo.b 的地址被强制转换为结构指针,然后指定给 f2。如果 lint -Xalias_level=weak(或更高),此示例将生成错误。

struct foo{
    int a;
    int b;
  };

struct foo *f1;
struct foo *f2;

void main()
{
    f2 = (struct foo *)&f1->b; /* cast of a scalar pointer to struct pointer error*/
}

5.3.4 要求显式别名

在以下示例中,struct fooa 类型的指针 f1 正在被强制转换为 struct foob 类型的指针。如果 lint -Xalias_level=strict(或更高),则除非结构类型相同(相同类型的相同数目的字段),否则此类强制类型转换要求显式别名。此外,在别名级别 standardstrong 上,假定标记必须匹配才能出现别名。在给 f1 赋值前使用 #pragma alias (struct fooa, struct foob),lint 将停止生成警告。

struct fooa {
    int a;
};

struct foob {
    int b;
};

struct fooa *f1;
struct foob *f2;

void main()
{
    f1 = (struct fooa *)f2; /* explicit aliasing required warning */
}