Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Sun C编译器到gcc的迁移_C_Gcc_Solaris 10_Cc - Fatal编程技术网

从Sun C编译器到gcc的迁移

从Sun C编译器到gcc的迁移,c,gcc,solaris-10,cc,C,Gcc,Solaris 10,Cc,为了与我们的其他程序保持一致,我正在研究在Solaris 10机器上从Sun C 5.9迁移到gcc(gcc)3.4.6可能存在的陷阱。是否有我们应该注意的指南或可能的陷阱清单 我们已经缩小了以下代码类型的问题(我们知道这是一种不好的做法,但长期存在): 可以通过使用-Wwrite字符串并检查所有错误来检测此错误。有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异 可以通过使用-Wwrite字符串并检查所有错误来检测此错误 在C中

为了与我们的其他程序保持一致,我正在研究在Solaris 10机器上从Sun C 5.9迁移到gcc(gcc)3.4.6可能存在的陷阱。是否有我们应该注意的指南或可能的陷阱清单

我们已经缩小了以下代码类型的问题(我们知道这是一种不好的做法,但长期存在):

可以通过使用-Wwrite字符串并检查所有错误来检测此错误。有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异

可以通过使用-Wwrite字符串并检查所有错误来检测此错误

在C中无效。我在没有任何标志(警告)的情况下收到此错误:

有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异

在GCC中,要检测更多警告,可以使用
-Wall
-Wextra
标志在C99模式(-std=C99)下编译代码

可以通过使用-Wwrite字符串并检查所有错误来检测此错误

在C中无效。我在没有任何标志(警告)的情况下收到此错误:

有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异

在GCC中,要检测更多警告,可以使用
-Wall
-Wextra
标志在C99模式(-std=C99)下编译代码

可以通过使用-Wwrite字符串并检查所有错误来检测此错误

在C中无效。我在没有任何标志(警告)的情况下收到此错误:

有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异

在GCC中,要检测更多警告,可以使用
-Wall
-Wextra
标志在C99模式(-std=C99)下编译代码

可以通过使用-Wwrite字符串并检查所有错误来检测此错误

在C中无效。我在没有任何标志(警告)的情况下收到此错误:

有没有其他我们应该注意的警告可能会指出更多可能的运行时错误,这些错误来自gcc c编译器和Sun c编译器之间的差异


在GCC中,要检测更多警告,您可以使用
-Wall
-Wextra
标志在C99模式(-std=C99)下编译代码。

strlen
函数只接受一个
const char*
类型的参数(这意味着它将接受一个非
const
const*
参数)

一些较旧的编译器可能接受参数数目不正确的函数调用。你需要修正代码

这是假设您的代码实际使用
strlen
。正如fernando.reyes在一篇评论中所建议的那样,很可能您真正的意思是
strcpy
,而不是
strlen
(特别是因为您不使用结果;调用
strlen()
并丢弃结果没有多大意义)

在这种情况下,问题是
stringLiteralPointer
指向(与之关联的数组对象)字符串文本。试图修改这样的数组具有未定义的行为。有些编译器可能会将字符串文本放入读/写内存,但您不应该依赖于此

同样,解决方案是修复代码。您需要安排
stringLiteralPointer
指向一个不是字符串文字的数组。一种方法是使用
malloc
分配足够的空间(并确保检查
malloc
返回的指针是否为非空)。如果指针已经指向字符串文字,您可能还可以使用非标准的
strdup
函数,该函数(尝试)分配字符串的新读/写副本并返回指向该字符串的指针。同样,您需要确认分配成功

另一种选择可能是使用数组,而不是指针。这:

char *ptr = "literal";
使
ptr
指向不允许修改的字符串。这:

char arr[] = "literal";
使
arr
成为一个数组,其中包含字符串文本的读/写副本

请确保问题中的代码是您正在编译的实际代码。复制并粘贴,不要重新键入

一般来说,gcc有许多选项来启用额外警告。如果您使用以下内容编译代码:

gcc -std=c99 -Wall -Wextra -O3 ...
您可能会在代码中发现一些有问题的东西。
-std=c99
选项告诉gcc(尝试)符合1999年ISO C标准;如果您的代码要符合C90(通常被错误地称为“ANSI C”),请使用
-ANSI
,而不是
-std=c99
-O3
选项可实现最大程度的优化;这会导致编译器执行额外的分析,这也会启用更多警告


有许多C检查程序比大多数编译器执行更多的分析。这是最初的工具。(以前称为LCLint)是一种现代实现,可以免费使用或(可能)通过系统的包管理器使用。

strlen函数只接受一个
const char*
类型的参数(这意味着它将接受一个非
const
char*
参数)

一些较旧的编译器可能接受参数数目不正确的函数调用。你需要修正代码

这是假设您的代码实际使用
strlen
。正如fernando.reyes在一篇评论中所建议的那样,很可能您真正的意思是
strcpy
,而不是
strlen
(特别是因为您不使用结果;调用
strlen()char *ptr = "literal";
char arr[] = "literal";
gcc -std=c99 -Wall -Wextra -O3 ...