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